Finden Sie Zahlen innerhalb der Copeland-Erdős-Konstante


17

Hintergrund

Die Copeland-Erdős-Konstante ist die Verkettung von "0". mit der Basis 10 Darstellungen der Primzahlen in der Reihenfolge. Sein Wert ist

0.23571113171923293137414...

Siehe auch OEIS A033308 .

Copeland und Erdős haben bewiesen, dass dies eine normale Zahl ist . Dies impliziert, dass jede natürliche Zahl irgendwann in der Dezimalexpansion der Copeland-Erdős-Konstante zu finden ist.

Die Herausforderung

Bei einer positiven Ganzzahl drücken Sie diese in der Basis 10 aus (ohne führende Nullen) und geben den Index ihres ersten Auftretens in der Folge der Dezimalstellen der Copeland-Erdős-Konstante aus.

Jedes sinnvolle Eingabe- und Ausgabeformat ist zulässig, die Eingabe und Ausgabe sollte jedoch in der Basis 10 erfolgen. Insbesondere kann die Eingabe als Zeichenfolge gelesen werden. und in diesem Fall kann davon ausgegangen werden, dass sie keine führenden Nullen enthält.

Die Ausgabe kann 0-basiert oder 1-basiert sein, beginnend mit der ersten Dezimalstelle der Konstante.

Die tatsächlichen Ergebnisse können durch den Datentyp, den Speicher oder die Rechenleistung begrenzt sein, und daher kann das Programm für einige Testfälle fehlschlagen. Aber:

  • Es sollte theoretisch funktionieren (dh diese Einschränkungen nicht berücksichtigen) für jede Eingabe.
  • Es sollte in der Praxis für mindestens die ersten vier Fälle funktionieren und für jeden von ihnen sollte das Ergebnis in weniger als einer Minute erstellt werden.

Testfälle

Die Ausgabe wird hier als 1-basiert angegeben.

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


Okay, was ist das Erfolgskriterium?
user8397947

In Anbetracht der detaillierten E / A-Regeln gehe ich davon aus, dass dies Codegolf ist, und wende das Tag an. Ich hoffe, das ist es, was du im Sinn hattest.
Dennis

@ Tennis Ja, tut mir leid, ich habe es vergessen. Vielen Dank für die Bearbeitung
Luis Mendo

Antworten:


6

05AB1E , 14 Bytes

Verwendet eine 0-indizierte Ausgabe . Prime-Funktionen in osabie sind sehr ineffizient. Code:

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

Erläuterung:

[       ]        # 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

Verwendet die CP-1252- Codierung. Probieren Sie es online! .


7

Python 2, 64 Bytes

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

Gibt den 1-basierten Index zurück. Teste es auf Ideone .


5

Gelee , 17 Bytes

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

Gibt den 1-basierten Index zurück. Probieren Sie es online! oder überprüfen Sie die meisten Testfälle .

Ich habe den letzten Testfall vor Ort überprüft. Es dauerte 8 Minuten und 48 Sekunden.

Wie es funktioniert

ç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).

Alternative Version, 11 Bytes (nicht konkurrierend)

ÆRVw³
ḤÇßÇ?

Das wAtom existierte nicht, als diese Herausforderung veröffentlicht wurde. Probieren Sie es online!

Wie es funktioniert

ḤÇßÇ?  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

Eigentlich 19 Bytes

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

Nimmt einen String als Eingabe und gibt den 1-basierten Index des Teilstrings aus

Probieren Sie es online!

Erläuterung:

╗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 Bytes

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

Gibt den 1-basierten Index zurück. Schließt alle Testfälle in weniger als einer Sekunde ab. Probieren Sie es online!


Gibt es einen Grund, warum Sie die Primzahlen nach oben verschieben 3und nicht zB nach oben 2? Gibt es auch eine Möglichkeit, es zu erweitern, damit es 0bei Eingaben funktioniert, die kürzer sind als ...=r>0?r:3(n+9)\s?
Charlie

3war etwas schneller als 2in meinen Tests und hat die Byteanzahl nicht erhöht. Für die Eingabe 0könnten Sie -~nstattdessen verwenden, aber es wäre viel langsamer.
Dennis

Danke, -~3n\s(== (3n+1)\s) ist gut genug.
Charlie


2

J , 37 Bytes

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

Die Eingabe wird als Ganzzahl zur Basis 10 angegeben, und die Ausgabe verwendet eine auf Null basierende Indizierung.

Verwendung

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

Erläuterung

Dieser erste Aufruf behandelt das Verb als eine Monade, nachfolgende Aufrufe, die möglicherweise rekursiv auftreten, behandeln es jedoch als eine Dyade.

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
Können Sie beweisen, dass dies funktioniert?
Undichte Nonne

@LeakyNun Oh ja, das stimmt, es funktioniert technisch nur für die Testfälle, aber es könnte nicht in den ersten n Primzahlen gefunden werden.
Meilen

Es funktioniert nicht für n = 1, da die erste Primzahl 2 ist und Sie die ersten fünf Primzahlen benötigen, um das erste Vorkommen einer 1.
Meilen

1

PowerShell v2 +, 90 Byte

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

Kombiniert die Logik meiner Suche nach der Zahl in der Champernowne-Konstantenantwort mit der Primgenerierungsmethode meiner Ausgabe der n-ten Primzahl, die n Antworten enthält , und subtrahiert 2sie dann, um den Index entsprechend auszugeben (dh nicht 0.am Anfang zu zählen).

Übernimmt die Eingabe als Zeichenfolge. Findet den 999in ungefähr sieben Sekunden auf meinem Rechner, aber der 33308in ziemlich viel länger ( bearbeiten - ich habe nach 90 Minuten aufgegeben ). Sollte theoretisch Arbeit für jeden Wert Index bis [Int32]::Maxvalueaka 2147483647, als dass die maximale Länge von .NET - Strings ist. Wird wahrscheinlich lange vorher auf Speicherprobleme stoßen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.