Fairerweise basiert dies auf einer StackExchange-Frage - aber es ist eine gute Frage.
Die Herausforderung ist ziemlich einfach:
- Nehmen Sie eine Reihe von Ziffern
- Suchen und drucken Sie die größte zusammenhängende Primzahl in der Zeichenfolge
Wertung:
- Die niedrigste Anzahl von Charakteren gewinnt.
- Victor wird wahrscheinlich ein Golfscript-Eintrag sein, aber wir werden das nicht gegen sie aufbringen , weil wir alle Spaß haben und Dinge lernen, richtig.
- Gewinner werden wir ausgezeichnet, wenn ich bemerke, dass ich den grünen Knopf nicht wirklich angekreuzt habe.
Annahmen:
- Die Zeichenfolge besteht nur aus Zahlen
- Wenn die Zeichenfolge Buchstaben enthält, liegt möglicherweise ein undefiniertes Verhalten vor
- Die Zeichenfolge enthält mindestens 1 Primzahl
- Wenn die Zeichenfolge keine gültige Primzahl enthält, liegt möglicherweise ein undefiniertes Verhalten vor
- Geschwindigkeit ist keine Einschränkung
- Verwenden Sie einen kürzeren Primalgorithmus gegenüber einem schnelleren.
- Wenn Ihr Eintrag irgendwann fertig ist, ist das in Ordnung. Stellen Sie einfach sicher, dass dies nachweislich vor dem Hitzetod des Universums geschieht.
- Die Länge der Zeichenfolge kann mit weniger als 15 Zeichen angenommen werden
Zum Beispiel:
>> Input: 3571
<< Output: 3571
>> Input: 123
<< Output: 23
>> Input: 1236503
<< Output: 236503
>> Input: 46462
<< Output: 2
>> Input: 4684
<< Output: ValueError: max() arg is an empty sequence
>> Input: 460
<< Output: 0 # Note, zero is not a prime, but the above string has no valid prime
>> Input: 4601
<< Output: 601
>> Input: "12 monkeys is a pretty good movie, but not as good as se7en"
<< Output: ValueError: Fight Club was also good, I find Brad Pitt to be a consistantly good actor.
Mögliche Implementierungen:
- Suchen Sie alle Teilzeichenfolgen der Eingabe und prüfen Sie, ob sie Primzahlen sind. - Legostormtroopr (Original)
- Finden Sie alle Ganzzahlen, die kleiner als die Eingabe sind, prüfen Sie, ob sie in der Eingabe enthalten sind, und prüfen Sie, ob es sich um eine Primzahl handelt - Ben Reich
- Nehmen Sie eine Liste aller Primzahlen, die kleiner als die Eingabe sind, und prüfen Sie, ob sie in der Eingabe enthalten sind - daniero
Antworten:
GolfScript
4037Dies betrachtet alle Zahlen, die kleiner oder gleich der Eingabe sind, filtert bis zu denjenigen, die Teilzeichenfolgen der Eingabe sind, und filtert dann weiter bis zu den Primzahlen. Dann braucht es das größte derartige Element (das offensichtlich die meisten Ziffern hat).
Lassen Sie es uns in zwei Hauptabschnitte aufteilen:
Dieser Teil des Codes filtert nach allen in der Eingabe enthaltenen Ganzzahlzeichenfolgen. Es verwendet einen starken Akzent, um Zahlen in Zeichenfolgen
?
umzuwandeln und dann den Index der Teilzeichenfolge zu bestimmen. Da?
kehrt-1
in dem Fall ohne Containment, inkrementierte verwendet ,)
so dass der Ausgang0
für nicht-substrings, die gut mit dem verhalten,
Filterung.Dieser Teil des Codes wird auf die Primzahlen heruntergefiltert, indem die Anzahl der Faktoren gezählt wird, die kleiner als die angegebene Anzahl sind (eine Ganzzahl ist nur dann ein Faktor, wenn sie 1
number factor %!
ist. Eine Primzahl hat genau 1 Faktor, der streng kleiner ist als sie selbst1=
.Da die Zahlen in Ordnung sind, nehmen Sie die letzte und löschen Sie den Stapel mit
)\;
Dies ist offensichtlich nicht so effizient wie möglich (da es unnötigerweise über alle Ganzzahlen iteriert, die kleiner als die Eingabe sind), aber es endet immer noch mit einer großen Eingabe wie
1236503
relativ schnell auf meinem Computer (1 Minute).quelle
Python 2.7 - 84
Hier ist eine Referenzimplementierung, die es zu schlagen gilt. Ich habe sie für die Beispielausgabe in der Frage verwendet, daher ist garantiert, dass sie funktioniert. * Keine tatsächliche Garantie
Schamlose Verbesserung basierend auf Ben Reichs viel besserer Lösung als meine ursprüngliche. Mit großer Unterstützung von Volatility
Frühere Beschwörungsformeln der zweiten Zeile umfassen:
Die Originalversion - 143
quelle
p
und ersetzenot p(x)
durchsum(x%i for i in range(2,x))<1
- es sollte funktionieren und bringt dich auf 86 Zeichen.sum(x%i for i in range(2,x))
wird für die meisten Zahlen ziemlich hoch sein. Aber der Generator ist eine großartige Idee und ich habe sie auf 91 gebracht.all(x%i for i in range(2,x))
stattdessen verwenden.all
und(`x`in`N`)
speichern Sie die Saves noch ein paar mehr!Rubin 61
Nehmen Sie alle Primzahlen bis N und prüfen Sie, ob sie in der Zeichenfolge enthalten sind
Ich denke, das funktioniert nur unter Ruby 1.9 und neuer, bin mir aber nicht sicher.
quelle
Scala (83 Zeichen)
Ich war mir nicht sicher, wie ich Eingaben für das Programm bereitstellen sollte, daher dachte ich, dass dies
n
die Eingabe ist. Hier ist die tatsächliche Lösung (basierend auf der die Lösungslänge bewertet wird). Darunter befindet sich eine ausführbare Form der Lösung (die noch nicht gespielt ist) zur Ausführung zusammen mit der Ausgabe (für die Beispiele gibt OP an).Lösung:
Ausführbare Lösung:
Beispielausgabe:
Erläuterung:
Die Schritte sind ziemlich einfach.
Eingabe -> Alle Teilzeichenfolgen suchen -> Nicht-Primzahlen filtern -> längsten Wert suchen
main(Array[String])
: Methode liefert Beispieleingabe und führt Methodeq(String)
für jede Eingabe ausq(String)
: Schließt die tatsächliche Programmlogik ab,p(String)
sodass alle Ausnahmen angemessen gemeldet werden. Hilft bei der Formatierung der Ausgabe besser, da ungültige EingabenNumberFormatException
s bekommen, wo das Fehlen einer Primzahl eineUnsupportedOperationException
p(String)
: Aktuelle Logik des Programms. Teilen wir die Erklärung dafür in Teile aufn.inits
: Erstellt eineIterator
, um über die String-Eingabe zu iterieren (n
)flatMap(f)
: Wendet eine Operation auf die anIterator
und schiebt das Ergebnis in eineList
_.tails.toList.init.map(BigInt(_))
: Teilt dasString
und entfernt leereString
s aus dem ErgebnisList
. Konvertiert schließlich dasString
in a,BigInt
was einem Äquivalent von entsprichtjava.math.BigInteger
. Aus GolfgründenBigInt
wird ausgewählt (kürzerer Name).filter(f)
: Wennf
zurückgegeben wirdfalse
, wird der Wert aus dem Ergebnis entferntList
_ isProbablePrime 1
: Diese Zeile hätte geschrieben werden können,_.isProbablePrime(1)
aber die verwendete Darstellung spart 1 Byte. Diese Zeile prüft tatsächlich, ob der Wert eine Primzahl ist (wahrscheinlich; da gesetztcertainty
ist1
, steigt die Ausführungszeit, aber das System stellt (mehr oder weniger) sicher, dass die Zahl eine Primzahl ist.max
: Findet den Maximalwert (nichtString
basierte Länge. Tatsächlicher Maximalwert)quelle
J (
2422)Das Lesen von der Tastatur ist tatsächlich kürzer als das Definieren einer Funktion.
Prüfung:
Erläuterung:
1!:1[1
: Lesen Sie eine Textzeile von der Tastatur".\.\
: die Auswertung (".
) jedes Suffix (\.
) jedes Präfixes (\
) der Zeichenfolge.;
: Reduzieren Sie die Matrix*1&p:
: Multiplizieren Sie jeden Wert damit, ob es sich um eine Primzahl handelt oder nicht (alle Nicht-Primzahlen sind also Null).>./
: Holen Sie sich den größten Wert in der Listequelle
Haskell, 94
main=getLine>>=print.maximum.filter(\x->and$map((0/=).mod x)[2..x-1]).map read.init.scanr(:)[]
quelle
main = getLine >>= print . maximum . filter isPrime . map read . allNums
ist die ursprüngliche Form. es erhält eine Zeile und gibt sie (>>=
) an die große kombinierte Funktion - kombiniert mit dem.
Infix-Operator, der einfach das Ergebnis der rechten Funktion in die linke Funktion setzt. Dinge wie(\x -> ...)
sind Lambda-Ausdrücke. Funktionsparameter werden ohne Klammern angewendet und Funktionen können teilweise angewendet werden ((0/=)
z. B. eine Funktion, die prüft, ob eine Zahl nicht 0 ist).allNums = init . scanr (:) []
.scanr
scans and init entfernt den letzten Wert des Ergebnisses von scanr, bei dem es sich um eine leere Zeichenfolge handelt, die nicht in eine Ganzzahl gelesen werden kann.map read
Liest eine Liste von Zeichenfolgen zu den festgelegten Werten. in diesem Fall Integer oder etwas anderes aus der Integral-Typklasse, daisPrime
ein Integral benötigt wird.filter isPrime
macht genau das, was es sagt.isPrime x = and $ map ((0/=). mod x) [2..(x-1)]
bedeutet, bei einer Liste von 2 bis (x-1) die Teilungsprüfung durchzuführen und dannand
auf die Bool-Liste anzuwenden .Perl 6 (40 Zeichen, 41 Bytes)
Bei der ersten
get
Eingabe in$_
verkürzt sich der Regex-Match-Aufruf.:ex
gibt erschöpfendes Matching für Regex, es gibt alle Möglichkeiten. Der Hyper-Op+«
(oder+<<
funktioniert auch) macht Zahlen aus den Match-Objekten, diegrep
mit&is-prime
sub als Selektor übergeben werden. Nehmen Sie zum Schluss das Maximum der verbleibenden Liste und geben Sie es aus.quelle
Mathematica
6747Erläuterung
Der Code ist eine reine Funktion. Es hat keinen Namen. Darin
#
steht die vollständige Eingabezeichenfolge.StringCases
Nimmt die Eingabe # und sucht nach Teilzeichenfolgena
eines oder mehrerer Zeichen (deshalb wurde __ anstelle von _ verwendet), die Primzahlen sind. PrimeQ muss True für den Teilstring zurückgeben.Alle günstigen Fälle, dh die Teilzeichenfolgen, die Primzahlen sind, werden standardmäßig in einer Liste zurückgegeben.
〚1〛
oder[[1]]
nimmt den ersten Teil, dh das erste Element dieser Liste von Primzahlen.element[[1]]
ist eine Abkürzung fürPart[element, 1]
. Wenn es mehr als eine Primzahl gibt, ist die erste die längste Primzahl (StringCases
überprüft zuerst die längsten Teilzeichenfolgen).Beispiele
quelle
〚1〛
Zeichen für uns Nicht-Mathematiker-Programmierer sadistisch war. (Cue mich verzweifelt besorgt, dass ich blind werde, und dann andere Klammern mit der Verwirrung betrachten, dass sie scharf aussehen, während dies nicht ist!)〚1〛
hat doppelte Klammern und entspricht[[1]]
. Ich habe sie verwendet, weil eine doppelte Klammer als einzelnes Zeichen zählt.Perl 6 (50 Zeichen, 51 Bytes)
+«
Ordnet Zeichenfolgen Zahlen zu,max
erhält die größte Zahl undget
erhält eine Zeile./(.+)<?{(+$0).is-prime}>/
ist ein regulärer Ausdruck, der alle Primzahlen erhält,<?{}>
ist eine Code-Behauptung.is-prime
ist eineInt
Klassenmethode, die prüft, ob die Zahl eine Primzahl ist. Ich muss den Wert mithilfe von in Zahl umwandeln+
, da diesStr
standardmäßig der Fall ist.:ex
bedeutet, dass versucht wird, ALLE Übereinstimmungen zu finden (einschließlich solcher, bei denen sich andere überschneiden). Aufgrund des Rakudo Perl-Fehlers ist eine Verwendungm//
hier derzeit nicht möglich .Dies funktioniert für jede Nummer und wenn Sie sie entfernen
max
(oder durch ersetzen)sort
andere ), erhalten Sie eine Liste aller Primzahlen in der Zahl, um einen zusätzlichen Bonus zu erhalten (nicht, dass dies Punkte oder irgendetwas gibt). Zum Beispiel (mitsort
in diesem Fall):quelle