Znajdź liczby w stałej Copeland – Erdős


17

tło

Copeland-Erdős stała jest połączeniem „0.” z 10 podstawowymi reprezentacjami liczb pierwszych w kolejności. Jego wartość to

0.23571113171923293137414...

Zobacz także OEIS A033308 .

Copeland i Erdős udowodnili, że jest to liczba normalna . Oznacza to, że każdą liczbę naturalną można znaleźć w pewnym momencie dziesiętnego rozszerzenia stałej Copeland-Erdős.

Wyzwanie

Biorąc pod uwagę dodatnią liczbę całkowitą, wyraż ją w podstawie 10 (bez zer wiodących) i wypisz indeks pierwszego pojawienia się w ciągu cyfr dziesiętnych stałej Copeland – Erdősa.

Dowolny rozsądny format danych wejściowych i wyjściowych jest dozwolony, ale dane wejściowe i wyjściowe powinny znajdować się w bazie 10. W szczególności dane wejściowe można odczytać jako ciąg znaków; w takim przypadku można założyć, że nie zawiera zer wiodących.

Dane wyjściowe mogą być oparte na 0 lub 1, zaczynając od pierwszego miejsca po przecinku stałej.

Rzeczywiste wyniki mogą być ograniczone przez typ danych, pamięć lub moc obliczeniową, dlatego program może zawieść w niektórych przypadkach testowych. Ale:

  • Powinien działać teoretycznie (tj. Nie biorąc pod uwagę tych ograniczeń) dla dowolnego wkładu.
  • Powinien działać w praktyce przynajmniej dla pierwszych czterech przypadków, a dla każdego z nich wynik powinien zostać wygenerowany w mniej niż minutę.

Przypadki testowe

Dane wyjściowe podano tutaj jako 1.

13       -->         7   # Any prime is of course easy to find
997      -->        44   # ... and seems to always appear at a position less than itself
999      -->      1013   # Of course some numbers do appear later than themselves
314      -->       219   # Approximations to pi are also present
31416    -->     67858   # ... although one may have to go deep to find them
33308    -->     16304   # Number of the referred OEIS sequence: check
36398    -->     39386   # My PPCG ID. Hey, the result is a permutation of the input!
1234567  -->  11047265   # This one may take a while to find


Okej, więc jakie jest kryterium wygranej?
user8397947,

Biorąc pod uwagę szczegółowe zasady dotyczące I / O, założę, że jest to kod golfowy i zastosuję tag. Mam nadzieję, że o to ci chodziło.
Dennis

@Dennis Tak, przepraszam, zapomniałem. Dzięki za edycję
Luis Mendo,

Odpowiedzi:


6

05AB1E , 14 bajtów

Wykorzystuje dane wyjściowe z indeksem 0 . Funkcje Prime w osabie są bardzo nieefektywne. Kod:

[NØJD¹å#]¹.Oð¢

Wyjaśnienie:

[       ]        # Infinite loop...
 N               # Get the iteration value
  Ø              # Get the nth prime
   J             # Join the stack
    D            # Duplicate this value
     ¹å#         # If the input is in this string, break out of the loop
         ¹.O     # Overlap function (due to a bug, I couldn't use the index command)
            ð¢   # Count spaces and implicitly print

Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .


7

Python 2, 64 bajty

f=lambda n,k=2,m=1,s='':-~s.find(`n`)or f(n,k+1,m*k*k,s+m%k*`k`)

Zwraca indeks oparty na 1. Przetestuj na Ideone .


5

Galaretka , 17 bajtów

ÆRDFṡL}i
Ḥçßç?
çD

Zwraca indeks oparty na 1. Wypróbuj online! lub zweryfikuj większość przypadków testowych .

Ostatnio zweryfikowałem ostatni przypadek testowy; zajęło 8 minut i 48 sekund.

Jak to działa

çD        Main link. Argument: n (integer)

 D        Decimal; yield A, the array of base 10 digits of n.
ç         Call the second helper link with arguments n and A.


Ḥçßç?     Second helper link. Left argument: n. Right argument: A.

Ḥ         Unhalve; yield 2n.
    ?     If...
   ç        the first helper link called with 2n and A returns a non-zero integer:
 ç            Return that integer.
          Else:
  ß           Recursively call the second helper link with arguments 2n and A.


ÆRDFṡL}i  First helper link. Left argument: k. Right argument: A.

ÆR        Prime range; yield the array of all primes up to k.
  DF      Convert each prime to base 10 and flatten the resulting nested array.
     L}   Yield l, the length of A.
    ṡ     Split the flattened array into overlapping slices of length l.
       i  Find the 1-based index of A in the result (0 if not found).

Alternatywna wersja, 11 bajtów (niekonkurująca)

ÆRVw³
ḤÇßÇ?

wAtom nie istnieje, gdy to wyzwanie została wysłana. Wypróbuj online!

Jak to działa

ḤÇßÇ?  Main link. Argument: n (integer)

Ḥ      Unhalve; yield 2n.
    ?  If...
   Ç     the helper link called with argument 2n returns a non-zero integer:
 Ç         Return that integer.
       Else:
  ß      Recursively call the main link with argument 2n.


ÆRVw³  Helper link. Argument: k (integer)

ÆR     Prime range; yield the array of all primes up to k.
  V    Eval; concatenate all primes, forming a single integer.
    ³  Yield the first command-line argument (original value of n).
   w   Windowed index of; find the 1-based index of the digits of the result to
       the right in the digits of the result to the left (0 if not found).

4

Właściwie 19 bajtów

╗1`r♂Pεj╜@íu`;)╓i@ƒ

Pobiera ciąg jako dane wejściowe i zwraca indeks 1 podłańcucha

Wypróbuj online!

Wyjaśnienie:

╗1`r♂Pεj╜@íu`;)╓i@ƒ
╗                    push input to register 0
  `r♂Pεj╜@íu`;)      push this function twice, moving one copy to the bottom of the stack:
   r♂Pεj               concatenate primes from 0 to n-1 (inclusive)
        ╜@íu           1-based index of input, 0 if not found
1              ╓     find first value of n (starting from n = 0) where the function returns a truthy value
                i@   flatten the list and move the other copy of the function on top
                  ƒ  call the function again to get the 1-based index

3

Julia, 55 bajtów

\(n,s="$n",r=searchindex(n|>primes|>join,s))=r>0?r:3n\s

Zwraca indeks oparty na 1. Ukończenie wszystkich przypadków testowych w niecałą sekundę. Wypróbuj online!


Czy istnieje powód, dla którego przesuwamy liczby pierwsze przez, 3a nie np. Przez 2? Czy jest też sposób, aby rozszerzyć go tak, aby działał 0przy wejściach krótszych niż ...=r>0?r:3(n+9)\s?
charlie,

3był nieco szybszy niż 2w moich testach i nie zwiększył liczby bajtów. Do wprowadzania 0można użyć -~nzamiast tego, ale byłoby to o wiele wolniejsze.
Dennis

Dzięki, -~3n\s(== (3n+1)\s) jest wystarczająco dobry.
charlie


2

J , 37 bajtów

(0{":@[I.@E.[:;<@":@p:@i.@]) ::($:+:)

Dane wejściowe są podawane jako liczba całkowita 10, a dane wyjściowe korzystają z indeksowania zerowego.

Stosowanie

   f =: (0{":@[I.@E.[:;<@":@p:@i.@]) ::($:+:)
   f 1
4
   f 13
6
   f 31416
67857

Wyjaśnienie

To pierwsze wywołanie traktuje czasownik jak monadę, jednak kolejne wywołania, które mogą wystąpić, rekurencyjnie traktują go jak diadę.

0{":@[I.@E.[:;<@":@p:@i.@]  Input: n on LHS, k on RHS
                         ]  Get k
                      i.@   Get the range [0, 1, ..., k-1]
                   p:@      Get the kth prime of each
                ":@         Convert each to a string
              <@            Box each string
           [:;              Unbox each and concatenate to get a string of primes
     [                      Get n
  ":@                       Convert n to a string
      I.@E.                 Find the indices where the string n appears in
                            the string of primes
0{                          Take the first result and return it - This will cause an error
                            if there are no matches

(...) ::($:+:)  Input: n on RHS, k on LHS
(...)           Execute the above on n and k
      ::(    )  If there is an error, execute this instead
           +:   Double k
         $:     Call recursively on n and 2k

1
Czy możesz udowodnić, że to działa?
Leaky Nun

@LeakyNun O tak, to prawda, technicznie działa tylko dla przypadków testowych, ale może nie zostać znalezione w pierwszych n liczbach pierwszych.
mile

Nie działa dla n = 1, ponieważ pierwsza liczba pierwsza to 2 i potrzebujesz pierwszych pięciu liczb pierwszych, aby uzyskać pierwsze wystąpienie 1.
mil

1

PowerShell v2 +, 90 bajtów

for($a="0.";!($b=$a.IndexOf($args)+1)){for(;'1'*++$i-match'^(?!(..+)\1+$)..'){$a+=$i}}$b-2

Łączy logikę mojej funkcji Znajdź liczbę w stałej odpowiedzi Champernowne , w połączeniu z metodą generowania pierwszej liczby moich Drukuj n- tą liczbę pierwszą, która zawiera n odpowiedzi, a następnie odejmuje, 2aby odpowiednio wypisać indeks (tj. Nie licząc 0.na początku).

Pobiera dane wejściowe jako ciąg. Znajduje ten 999w ciągu około siedmiu sekund na moim komputerze, ale ten 33308jest nieco dłuższy ( edytuj - poddałem się po 90 minutach ). Powinien teoretycznie działać dla dowolnej wartości aż do indeksu [Int32]::Maxvalueaka 2147483647, ponieważ jest to maksymalna długość ciągów .NET. Prawdopodobnie wystąpią problemy z pamięcią na długo zanim to się stanie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.