Znajdź liczbę w stałej Champernowne

35

Wprowadzenie

W podstawie 10 stała Champernowne jest zdefiniowana przez połączenie reprezentacji kolejnych liczb całkowitych. W bazie 10: 0.1234567891011121314151617...i tak dalej.

Widać, że pierwsze pojawienie się 15zaczyna się po 20thprzecinku:

  Position
  0000000001111111111222222222233333333334444444444555555555566666666
  1234567890123456789012345678901234567890123456789012345678901234567
                     ^
0.1234567891011121314151617181920212223242526272829303132333435363738...
                     ^^
                     15 = position 20

Pierwsze pojawienie się 45zaczyna się po 4thprzecinku:

  Position
  0000000001111111111222222222233333333334444444444555555555566666666
  1234567890123456789012345678901234567890123456789012345678901234567
     ^               
0.1234567891011121314151617181920212223242526272829303132333435363738...
     ^^
     45 = position 4

Zadanie jest więc łatwe. Biorąc pod uwagę nieujemną liczbę całkowitą, wypisuje pozycję liczby całkowitej w stałej Champernowne.

Zasady

  • Możesz podać funkcję lub program
  • To jest , więc wygrywanie z najmniejszą ilością bajtów wygrywa!

Przypadki testowe

Input: 20
Output: 30

Input: 333
Output: 56

Input: 0
Output: 11 (note that the 0 before the decimal point is ignored)

Input: 2930
Output: 48
Adnan
źródło
Jaka jest najwyższa pozycja, dla której musimy pracować? Np. Czy liczba będzie kiedykolwiek wynosiła 987654321123456877654234354675.
Morgan Thrapp
@MorganThrapp Prawdopodobnie przetestuję liczby całkowite w zakresie 0 <= x <= 99, ale teoretycznie powinno to działać dla liczb całkowitych wyższych niż 99.
Adnan,
2
Obowiązkowe OEIS
Leaky Nun

Odpowiedzi:

8

Pyth, 10

hxjkS+QT`Q

Łączy pierwsze input + 10liczby, a następnie znajduje indeks oparty na 0 plus jeden. Dodatkowe dziesięć jest potrzebne tylko dla 0.

Pakiet testowy

FryAmTheEggman
źródło
Myślę, że domniemany wkład został wdrożony wcześniej 2015-12-17 15:01:23Zczy coś takiego?
Erik the Outgolfer
@EriktheOutgolfer Został dodany w 2016: github.com/isaacg1/pyth/commit/…
FryAmTheEggman
10

LabVIEW, 29 LabVIEW Prymitywy

Na razie używa to ciągów znaków. Dopasowuje dane wejściowe jako wzorzec i wyświetla offset - (długość wejściowa -1).

Eumel
źródło
6

JavaScript, 57 bajtów

a=prompt();for(y=b=" ";y<a+11;)b+=++y;alert(b.indexOf(a))

Oszczędność 1 bajtu dzięki Conorowi O'Brienowi.

SuperJedi224
źródło
Myślę, że możesz przenieść tę y=część do y=b=" "; inkrementacja spacji jest jak inkrementacja zera. ( a=prompt(y=b=" ");...)
Conor O'Brien,
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Ładne znalezisko.
SuperJedi224,
4

Haskell, 62 bajty

a#b|and$zipWith(==)a b=1|1<2=1+a#tail b 
(#(show=<<[1..])).show

Przykład użycia: (#(show=<<[1..])).show $ 2930-> 48.

Jak to działa: a # bznajduje pozycję w aciągu b: if ajest prefiksem breturn 1, w przeciwnym razie dodaj 1do wywołania rekurencyjnego za pomocą a # tail b. Funkcja pointfree (#(show=<<[1..])).showoczekuje (nienazwanego) argumentu ni wywołań show n # show=<<[1..].

Funkcja subIndexrównież wykona zadanie #, ale wymagane import Data.List.Utilsnie opłaca się.

nimi
źródło
Nie sądzę, że potrzebujesz.show
Wheat Wizard
I trochę przyjaznej konkurencji. choć dwa lata później.
Wheat Wizard
4

Ruby, 28 lat

->n{[*0..n+10]*''=~/\B#{n}/}

Zawiera 0 na początku, więc dopasowania są indeksowane 1, ale \Bwymaga, aby dopasowanie nie było na początku łańcucha.

histocrat
źródło
4

Japt, 11 bajtów

To pierwotnie pokonało Pytha, ale najwyraźniej nie działało na wejście 0.

1+1oU+B ¬bU

Wypróbuj online!

Jak to działa

1+1oU+B ¬ bU
1+1oU+B q bU  // Implicit: U = input integer
  1oU+B       // Generate the range [0, U+11).
        q bU  // Join and take the index of U.
1+            // Add one to get the correct result.
              // Implicit: output last expression
ETHprodukcje
źródło
Dlaczego sekcja „Jak to działa” zawiera qw kodzie a nie logiczny symbol negacji ¬?
Fatalize
@Fatalize ¬to skrót do ( qz następującą spacją). Wydaje się to często wprowadzać zamieszanie, więc ustawiłem krótszą wersję z pełną.
ETHproductions
3

Lua, 54 bajtów

s=""for i=1,1e4 do s=s..i end print(s:find(io.read()))

Uwaga: Obecnie ten program wypisuje zarówno pierwsze wystąpienie pierwszego znaku ciągu, jak i punkt, w którym się kończy. Jeśli nie jest to dozwolone, będzie kosztować kilka dodatkowych bajtów. Chciałbym prosić o premię, ponieważ mój program wypisuje zarówno pierwszą pozycję, jak i ostatnią pozycję liczby wejściowej.

Nikolai97
źródło
1
Czy masz na myśli indeksy początkowe i końcowe przy pierwszym wystąpieniu liczby? Ponieważ teoretycznie liczba byłaby tam nieskończona ilość razy.
Rɪᴋᴇʀ
Tak, początek i koniec pierwszego wystąpienia.
Nikolai97
3

MATL , 22 bajty

it10+:Yst' '=~)wYsXf1)

Weź input ( i), ustaw wektor 1 na input + 10 ( 10+:), konwertuje wektor na string ( Ys) i usuń spacje, co jest bolesne, ( t' '=~)). Następnie przekonwertuj dane wejściowe na ciąg znaków ( Ys), znajdź ciąg znaków wejściowych w ciągu liczb ( Xf) i wybierz pierwszą lokalizację ( 1)). t„S w” y manipuluje stos (zduplikowane i wymienne, odpowiednio).

David
źródło
3

PowerShell, 39 44 bajtów

[Edycja: moje założenie nie działa, budowanie tablicy z 1-0 nie znajduje 0 w miejscu 11. Zamiast tego buduj z 1-x + 10, aby obsługiwać również 0, teraz 44 bajty]

param($i)(1..($i+10)-join'').IndexOf("$i")+1

Zawsze znajdziesz x podczas budowania ciągu stałej Champernowne w ostatnim punkcie, kiedy dodajesz x na końcu, więc tablica od 1-x zawsze będzie zawierała odpowiedź. Pytanie brzmi „czy to nastąpi wcześniej?” . Ten kod

param($i)(1..$i-join'').IndexOf("$i")+1

e.g.

PS C:\Temp> .\Champer.ps1 20
30

generuje zakres liczb, rzutuje go na ciąg znaków i wyszukuje w nim parametr. Ponieważ PowerShell jest powłoką obiektową, parametr jest w rzeczywistości [int]typem, więc próba zapisania dwóch znaków za pomocą .IndexOf($i)przeszukałaby łańcuch w celu znalezienia liczby całkowitej i niczego nie znalazłaby. Dlatego używam interpolacji ciągów "$i".

TessellatingHeckler
źródło
1
Sprytny sposób na zrobienie tego. Frustrujące, że .IndexOf()najwyraźniej ma wyższe preferencje operacyjne niż jednoargumentowe -joinwymuszanie parens i cytatów. : - /
AdmBorkBork
3

Mátl (uwalnianie 1.0.1), 22 bajtów

iXK10+:"@Ys]N$hKYsXf1)

Przykład

>> matl iXK10+:"@Ys]N$hKYsXf1)
> 333
56

Wyjaśnienie

i       % Input
XK      % Copy to clipboard K            
10+     % Add 10. This is needed in case input is 0
:       % Vector of equally spaced values, starting from 1
"       % For each
  @Ys   %   For loop variable as a string
]       % End                            
N$h     % Horizontal concatenation of all stack contents
KYs     % Paste from clipboard K (input number) and convert to string
Xf      % Find one string within another 
1)      % First value

MATL (wydanie 20.8.0), 16 bajtów (wyzwanie dla postdatacji języka)

Podziękowania dla @Giuseppe za tę wersję programu (nieznacznie zmodyfikowaną)

10+:"@V]&hGVXf1)

Wypróbuj online!

Wyjaśnienie

10+     % Implicit Input. Add 10. This is needed in case input is 0 
:       % Vector of equally spaced values, starting from 1
"       % For each
  @V    %   For loop variable as a string 
]       % End
&h      % Horizontal concatenation of all stack contents
GV      % Paste from automatic clipboard G (input number) and convert to string
Xf      % Find one string within another 
1)      % First value
Luis Mendo
źródło
Nie sądzę, że to obsługuje 0 :(
David
@David Teraz to robi. Dzięki za zauważenie! Kosztuje tylko 3 bajty :-)
Luis Mendo
teraz, gdy schowek Gzawiera dane wejściowe (i dane niejawne), myślę, że odpowiedź ta może zostać znacznie skrócona, a wszystko to Ystrzeba zmienić na i Vtak; Wymyśliłem 10+:"@Vv]!GVXf1)16 bajtów.
Giuseppe
@Giuseppe Dzięki za heads-up! Zaktualizowany, z należytym uznaniem (i notatką „wyzwanie językowe po postach”; nie jestem wielkim fanem nowej zasady )
Luis Mendo
Nie przejmuję się tak bardzo tą regułą ( choć flagi mnie doprowadzają do szału); Głównie komentowałem tutaj, ponieważ zauważyłem, że muszę Yssię zmienić, Vaby korzystać z najnowszej wersji tłumacza. Zawsze jestem pod wrażeniem tego, jak bardzo poprawił się język!
Giuseppe
2

PowerShell, 54 50 bajtów

for($c='';!($x=$c.IndexOf("$args")+1)){$c+=++$i}$x

Dzięki TessellatingHeckler za pomysł zamiany whilepętli na forpętlę.

Wykonuje się przez forpętlę. Podobnie jak w przypadku innych języków, pierwsza instrukcja w pętli może konstruować zmienne i przypisania, więc zaczyna się od $crównego tylko pustemu ciągowi'' dzięki czemu mamy zerowe indeksowanie ciągu zgodne z dziesiętnym indeksowaniem wyzwania. Jesteśmy wtedy w pętli, która sprawdza, czy gdzieś w niej $cjest wejściowa liczba całkowita ( $args) (tzn. Ponieważ .IndexOf()zwraca, -1jeśli ciąg nie zostanie znaleziony, dodajemy jedną do niej ( 0), a nie do ( $TRUE), aby kontynuować pętlę). Jeśli nie zostanie znaleziony, dodajemy naszą wstępnie zwiększoną $izmienną licznika, a następnie ponownie sprawdzamy ciąg. Po znalezieniu ciągu .IndexOf()zwróci wartość dodatnią, której nie będzie$FALSE, wyrwanie się z pętli. Na koniec wyprowadzamy indeks za pomocą $x.

AdmBorkBork
źródło
Idealny do klasycznej forpętli ... for($c='.';($x=$c.IndexOf("$args"))-lt0;$c+=++$i){}$xi uratuj 1 postać. Ponieważ większość wywołań IndexOf zwróci -1, dodaj jeden do niego i wstaw wartość logiczną! rzuć to, na krótszy test. Ale do tego potrzebne są pareny. Opróżnij $ c i +1 w istniejących parenach, bonus jest krótszy. for($c='';!($x=$c.IndexOf("$args")+1);$c+=++$i){}$x51 bajtów. (ale opublikowałem mój 39-bajtowy jeden jako własną odpowiedź, ponieważ jest to zupełnie inne podejście: P).
TessellatingHeckler,
1
@TessellatingHeckler Świetny sposób na przepisanie pętli - dzięki! Przeniosłem $ckonkatenację do pętli, aby zagrać w średnik. Teraz o 50.
AdmBorkBork
2

JavaScript (ES6), 40 bajtów

x=>(f=n=>n?f(n-1)+n:" ")(x+11).search(x)

Używa funkcji rekurencyjnej, faby uniknąć pętli. The wyszukiwania działa tak samo, indexOfz tym wyjątkiem, że przyjmuje RegExp jako parametr, co nie ma znaczenia dla tego wyzwania.

Dodanie " "do n=0obudowy (zero falsy w JS) przekształcająca wartość +wykonać konkatenacji zamiast dodawania i koryguje do indeksowania zera.

intrepidcoder
źródło
1

Python 3, 54.

print(''.join(map(str,range(1,9**7))).find(input())+1)
Morgan Thrapp
źródło
1

CJam, 11 bajtów

r_i),s\#Be|

Sprawdź to tutaj.

Znajduję pozycję Nw ciągu, 01234...Naby uwzględnić indeksowanie 1. Na koniec naprawiam 0, stosując logiczne OR z 11.

Martin Ender
źródło
1

Poważnie, 13 bajtów

;≈9u+R`$`MΣí

Pobiera dane wejściowe jako liczbę całkowitą. Zawiera niedrukowalne, więc zrzut heksowy:

0c3bf739752b526024604de4a1

Wypróbuj online

Wyjaśnienie:

;≈9u+R`$`MΣí
<form feed>   push str(input)
;≈9u+R        dupe, push [1,...,input+10]
      `$`MΣ   string concatenation of list
           í  get index of input
Mego
źródło
1

k4, 21 bajtów

{*1+(,/$1+!10+x)ss$x}

To samo algo jak wszyscy inni - łączenie [1..10+x]jako ciągi, wyszukiwanie x jako ciąg, konwersja do indeksowania opartego na jednym, zwracanie pierwszego trafienia.

Sprawdzanie przypadków testowych:

  &/20 4 30 56 11 48={*1+(,/$1+!10+x)ss$x}'15 45 20 333 0 2930
1b
Aaron Davies
źródło
1

Mathematica, 101 bajtów

(If[#==0,11,m=Min@SequencePosition[s=Flatten[(K=IntegerDigits)/@Range[0,#]],K@#];Length@s[[;;m-1]]])&
J42161217
źródło
1

Haskell , 82 73 55 bajtów

Migrowałem z duplikatu

x!b|or$zipWith(==)x b=0
x!(_:b)=1+x!b
(!(show=<<[1..]))

Wypróbuj online!

Wyjaśnienie

Najpierw zdefiniujemy !. x!bobcina bsię do pierwszego pojawienia się x. Robi to, sprawdzając, czy bzaczyna się od x( or$zipWith(==)x b) zwracając, xjeśli tak, i przesuwając jeden w dół łańcucha w przeciwnym razie. Następnie definiujemy naszą główną funkcję. Naszą główną funkcją jest funkcja bez punktów, która przyjmuje stałą ( show=<<[1..]) i obcina ją do pierwszego pojawienia się x. To trwa xjako ciąg.

Kreator pszenicy
źródło
1

JavaScript (ES6), 50 39 38 bajtów

x=s=``
f=n=>-~s.search(n)||f(n,s+=++x)

Spróbuj

x=s=``
f=n=>-~s.search(n)||f(n,s+=++x)
o.innerText=f(i.value=15);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o></pre>

Kudłaty
źródło
1

Perl 6 , 26 bajtów

{[~](0..$_).index($_)||11}

Wypróbuj online!

Znajduje indeks elementu w konkatenowanym zakresie od 0 do tego elementu lub 11jeśli liczba jest zerem

Jo King
źródło
0

Perl 5 , 42 + 1 (-p) = 43 bajty

(join'',0..$_+10)=~/^(0.*?)$_/;$_=length$1

Wypróbuj online!

Wyjaśnienie

(join'',0..$_+10)   #concatenate all of the numbers from 0 to 10 over the input
=~/^(0.*?)$_/;      #skip the first 0, then find the input
$_=length$1         #the length of the string preceding the input is the answer
Xcali
źródło
0

Perl 6 / Rakudo 29 bajtów

{$_~=$++until /(.+)$^a/;$0.chars}

Definiuje funkcję z jednym wejściem ($ ^ a). Zadzwoń w ten sposób:

say {$_~=$++until /(.+)$^a/;$0.chars}(333)
> 56

Dołączanie $, anonimowa zmienna, zwiększająca się $++do momentu $^aznalezienia wejścia , a następnie zliczająca liczbę znaków przed nim. Wymaganie co najmniej 1 znaku przed nim .+w wyrażeniu regularnym użytecznie wyklucza przypadek 0–> 0

Phil H.
źródło
0

J, 30 bajtów

{.I.(":E.[:}.' '-.~":@i.@+&11)

Prawdopodobnie można go nieco pograć w golfa, szczególnie w połączeniu pierwszych liczb całkowitych n + 10.

Wyjaśnienie:

{.I.(":E.[:}.' '-.~":@i.@+&11)
                      i.@+&11   | Integers 0 to n+10
                   ":@          | Format list to string
             ' '-.~             | Strip spaces
           }.                   | Behead (remove leading 0)
         [:                     | Cap (previous verbs executed in order, not as a fork)
     ":E.                       | Find matches to the string n (returns a boolean vector)
  I.                            | Indexes of 1s
{.                              | Take only the first

Zauważ, że jest to indeksowane na 0. Przykłady:

    {.I.(":E.[:}.' '-.~":@i.@+&11) 1
0
    {.I.(":E.[:}.' '-.~":@i.@+&11) 0
10
    {.I.(":E.[:}.' '-.~":@i.@+&11) 333
55
Bolce Bussiere
źródło
0

Łuska , 6 bajtów

€ΣmdNd

Wypróbuj online!

€         The 1-based index in
 Σ        the list of concatenated
   d      decimal digits
  m N     of every natural number
     d    of the decimal digits of
          the input.
Niepowiązany ciąg
źródło