Erdos und Copeland haben 1946 bewiesen, dass eine bestimmte Zahl eine normale Zahl ist , dh die Ziffern in ihrer Dezimalerweiterung sind gleichmäßig verteilt.
Die Benutzer geben eine Ziffernfolge ein, und Sie finden die kleinste Primzahl, die diese Zeichenfolge enthält, in Basis 10.
Beispiel:
input -> output
"10" -> 101
"03" -> 103
"222" -> 2221
"98765" -> 987659
Kürzester Code in Bytes gewinnt. Ich weiß, dass einige Sprachen (Mathematica, Salbei, Pari-GP ...) eingebaute Funktionen haben, die sich auf Primzahlen beziehen. -50 Bytes, wenn Ihr Programm nicht auf solche Funktionen angewiesen ist. Versuchen Sie nicht, dies zu betrügen. Wenn Ihre Sprache bereits einen großen Vorteil hat, fordern Sie den Bonus nicht an.
Bearbeiten
Nach einigen Kommentaren ist die kleinste Primzahl, die "03" enthält, 3. Macht dies wirklich einen Unterschied? Das Einzige, woran ich denken kann, ist, dass Zahlen möglicherweise einfacher zu handhaben sind als Zeichenfolgen.
In Fällen wie "03" wäre die bevorzugte Ausgabe 103. Ich halte sie jedoch nicht für den grundlegenden Teil Ihres Programms, so dass Sie jede führende Null ignorieren können, wenn sie Ihnen eine niedrigere Byteanzahl gewährt.
Antworten:
Golfscipt,
3332 Bytes = -18 PunkteErläuterung:
2{...}{)}/
- beginnend mit2
, während etwas wahr ist, erhöhen Sie die Oberseite des Stapels;;x
- die von{}{}/
und die Eingabe gesammelten Zwischenwerte verwerfen und den zuletzt getesteten Wert dort ablegen:x,2>
- Speichern Sie den Wert alsx
, und erstellen Sie eine Liste von2
bisx-1
{x\%!},!!
- Behalte diejenigen,x
die durch teilbar sind, und zwinge sie dann zum Booleschen (nicht leer)x`3?)!
- Nachschlagen der Eingabe in der Textformx
(-1
falls nicht gefunden), Inkrementieren, Negieren.|
- oderquelle
Haskell-Programm, 97 Zeichen = 47 Punkte
Haskell-Funktion, 75 Zeichen = 25 Punkte
die Art
p
ist(Integral a, Show a) => [Char] -> a
. Wenn Sie einen eigenen ganzzahligen Typ angeben, können Sie diese Werte in Ihrer eigenen Darstellung nachschlagen. Der StandardInteger
verwendet die erwartete Dezimalschreibweise für Ganzzahlen.Nicht sehr schnell. Quadratisch im Wert (nicht in der Größe) der Ausgabe.
ungolfed version:
Beispiel:
quelle
Java - 175 Zeichen.
quelle
indexOf(a[0])>=0)
und entfernen{System.out.println(n)
.boolean p=true
etwas wieint p=1
usw. ersetzen .Mathematica 58
Relative Timings auf meinem Mac (2,6 GHz i7 mit 8 GB Speicher).
Finde die kleinste Primzahl mit "01".
Finde die kleinste Primzahl mit "012345".
Finde die kleinste Primzahl mit "0123456".
quelle
StringFreeQ
, um es kürzer zu machen.Salbei , 72
Läuft in der interaktiven Eingabeaufforderung
Primes().unrank(i)
gibt diei
th Primzahl an, wobei die 0th Primzahl 2 ist.quelle
R, 56 Zeichen - 50 = 6
Eingabe als stdin übernehmen. Inkremente k bis k ist eine Primzahl (getestet durch Summieren der Instanzen, für die k mod 2 bis k Nullen sind, daher FALSE, da 0 zu einer logischen ist FALSE) und enthält den als Eingabe gegebenen String (getestet mit einem einfachen grep, hier grepl da wir ein logisches als Ergebnis wollen).
Verwendung:
quelle
Shell Oneliner (Coreutils): 45 Zeichen
Hier wird keine Funktion definiert ... nur ein Oneliner, der ein Argument aufnimmt
$n
und den Integer-Bereich abtastet (eigentlich ein bisschen mehr, um den Code zu verkürzen). Die 55-stellige Version:Es ist nicht einmal zu langsam. Denn
n=0123456
es kehrt201234563
in81.715s
. Das ist beeindruckend schnell für eine lange Pipeline mit zwei String-Prozessoren.Wenn wir zwei Zeichen (bis zu 53) und eine Pipe entfernen, können wir es noch schneller zum Laufen bringen:
Und zum Schluss ein
sed
bisschen Zauberei, um es auf 45 Zeichen zu bringen , obwohl der Ausdruck hässlich ist:quelle
J - 38 Zeichen -50 = -12 Punkte
Normalerweise würden Sie in J die sehr optimierten Buildins für Primzahlen verwenden, sodass ich mich nicht für langsame Ausführung entschuldigen werde.
Erklärt:
>:@]^:(...)^:_&2
- Beginnen Sie mit 2 und erhöhen Sie, bis(...)
false zurückgegeben wird.(+.i.)@]
- Nehmen Sie die GCD des Zählers mit jeder kleineren Ganzzahl. (Wir verwenden die Konvention GCD (X, 0) = X.)]=*/@
- Nehmen Sie das Produkt aus all diesen Zahlen und prüfen Sie, ob es mit dem Zähler übereinstimmt. Wenn der Zähler prim ist, war die Liste alle 1s, mit Ausnahme der GCD mit 0; Andernfalls ist mindestens eine GCD größer als 1, sodass das Produkt größer als der Zähler ist.>./@(E.":)
- Prüfen Sie, ob die Zeichenfolgendarstellung des Zählers":
(E.
) an einer beliebigen Stelle die Zeichenfolge ( ) enthält .>./
ist die Max-Funktion, und wir verwenden es, weilE.
einen booleschen Vektor mit einer 1 zurückgibt, wo immer der Teilstring im Hauptstring beginnt.*:
- Logisch und die Ergebnisse zusammen. Dies ist nur dann falsch, wenn beide Eingaben wahr sind, dh wenn der Zähler prim war und die Teilzeichenfolge enthielt.Verwendung:
Für die Nachwelt ist hier die Version mit dem eingebauten Prime (30 Zeichen lang, aber ohne Bonus):
1 p:]
Testet den Zähler auf Primalität anstelle des GCD-Tricks.quelle
Brachylog (v2), 3 Bytes in der Brachylog-Codierung
Probieren Sie es online!
Funktionsübergabe, Eingabe aus dem rechten Argument, Ausgabe durch Mutation des linken Arguments. (Dies ist das Gegenteil der normalen Brachylog-Konvention. Weitere Informationen finden Sie in diesem Metapost . Das Vertauschen der Argumente in die üblichere Reihenfolge kostet drei Bytes.) Der TIO-Link verfügt über einen Wrapper, der die Funktion mit der entsprechenden Aufrufkonvention aufruft und druckt das Ergebnis.
Erläuterung
Leider ist Brachylog für dieses Problem so geeignet, dass ich nach den Regeln des Problems nicht einmal versuchen kann, den Bonus zu bekommen (was ironischerweise bedeutet, dass er nicht gewinnen kann).
Einer der Gründe, warum ich Brachylog so sehr mag, ist, dass Programmierung eine Kommunikation zwischen Mensch und Computer ist und daher in einer "perfekten" Sprache die Problemspezifikation direkt ins Englische übersetzt werden kann. Die Ideen, über die das Problem festgestellt wurde und über die das Programm geschrieben wird, wären die gleichen. Brachylog kann dieses Ideal überraschend oft treffen; Die Frage lautet hier "Finde die kleinste Primzahl, die einen bestimmten Teilstring enthält", und ich kann die Begriffe "kleinste Primzahl, die einen Teilstring enthält" buchstäblich in der richtigen Reihenfolge aneinanderreihen und ein funktionierendes Programm haben. Als solches sagt Brachylog viel mehr über die Natur der Kommunikation aus als eine Sprache, in der Sie explizit einen Algorithmus zur Lösung des Problems spezifizieren müssten; manchmal, wenn mit anderen Menschen gesprochen wird, Wir versuchen, ein Problem zu erklären, indem wir die Schritte erläutern, die Sie unternehmen würden, um es zu lösen. Dies ist jedoch selten. Warum sollten unsere Sprachen anders sein?
quelle
JavaScript 83 Bytes = 33 Punkte
Golf gespielt:
Ungolfed (ein bisschen):
quelle
Javascript (Node.JS) - 93 Bytes = 43 Punkte
In extrahierter Form mit sinnvollen Variablennamen:
quelle
Rust 0,9 136 Bytes = 86 Punkte
Trotz der Kompaktheit sehr deutlich. Zu viel Platz für die Suche nach Saiten. :(
Hier die Version ohne Leerzeichen (136 Zeichen)
quelle
Japt, 10 Bytes
Versuch es
quelle
Ordentlich , 37 Bytes
Probieren Sie es online!
quelle
Perl 6 , 36 - 50 = -14 Punkte
Probieren Sie es online!
Berücksichtigt
$_%%one ^$_
wird, dass nur 2 Byteskleinerals sind.is-prime
, denke ich, dass es sich für den Bonus lohnt. Dies ist eine Zeitüberschreitung für den letzten Testfall.Erläuterung:
quelle
:$
Python 3 ,
8079 Bytes - 50 =3029 Punkte-1 Byte dank der kreativen Verwendung von @ ASCII-only
%s
anstelle vonstr
Der Testfall "98765" wurde noch nicht bestätigt, da derTest erst nach ein paar Stunden durchgeführt werden kann. Der Testfall "98765" wurde bestätigt. Bei einem ähnlichen Ansatz, bei dem eine Kurzschlussbewertung verwendet wird, um einige Primärtests zu vermeiden, funktioniert der Test viel schneller. Alternativ kann dies ~ 2x so schnell sein, wenn wir wissen, dass "2" keine Eingabe ist (wir können es vermeiden, gerade Zahlen auf Primalität zu prüfen), indem Siei=3
anfänglich undi+=2
in der Schleife ohne zusätzliche Bytekosten festlegen.Probieren Sie es online!
Erläuterung der
while
Bedingung ((x in"%s"%i)*all(i%j for j in range(2,i))-1
):(x in"%s"%i)
:True
/1
wenn der aktuelle Zähler die gewünschte Zahlenfolge enthält;False
/0
ansonsten.all(i%j for j in range(2,i))
:True
/1
wenn der aktuelle Zähler immer einen Rest hat, wenn er durch eine beliebige Ganzzahl von 2 (einschließlich) bis zu sich selbst (ausschließlich) geteilt wird, dh eine Primzahl ist;False
/0
ansonsten.Das
*
multipliziert die beiden Bedingungen und agiert alsand
Operator - das Produkt istTrue
/1
wenn und nur wenn beide Bedingungen sindTrue
/1
.Das
-1
wirkt alsnot
Operator:False
/0
- 1 ergibt-1
, was als wahr angesehen wird, wohingegenTrue
/1
- 1 ergibt0
, was als falsch gilt. Somit wird die Schleife fortgesetzt, während die Zahl entweder nicht die gewünschte Folge von Zahlen enthält oder keine Primzahl ist.Ersetzen Sie das
*
mitand
und setzen Sie Klammern um alles außer dem-1
um eine viel schnellere, gleichwertige Lösung zu erhalten (die etwas länger ist).Eine 76-Byte- Lösung mit 50 = 26 Punkten in Python 2, die nur von @ ASCII angegeben wird (verwendet
``
anstelle vonstr()
,Probieren Sie es online!
quelle
return I
JavaScript, 65 - 50 = 15 Punkte
Probieren Sie es online!
quelle