Herausforderung:
Sie erhalten eine Zeichenfolge, die nur Ziffern enthält. Ihre Aufgabe ist es, die minimale Anzahl von Primzahlen auszugeben, die verkettet werden müssen, um die Zeichenfolge zu bilden. Ist dies nicht möglich, wird ausgegeben 0
.
Testfälle:
Eingabe -> Ausgabe:
252 -> 3
235 -> 2
92 -> 0
31149 -> 2
Antworten:
JavaScript (ES6),
123121120 ByteDank @Neil ein Byte gespeichert!
Erläuterung
Nimmt eine einzelne Zeichenfolge als Eingabe. Aufgrund der Prime-Checking-Methode (rekursive Trial-Division) kann die größte Zahl sicher überprüft werden
13840
. Einige Zahlen darüber schlagen fehl, weil die maximale Call-Stack-Größe überschritten wird. Es endet jedoch sofort für jeden Fall, den es behandeln kann.quelle
i?(a=...)&&(b=...)&&a+b:0
zui&&(a=...)&&(b=...)&&a+b
?MATL ,
2624 BytesBei einigen Testfällen dauert es einige Sekunden.
Probieren Sie es online!
Erläuterung
quelle
Pyth, 16 Bytes
Testsuite
Erklärung folgt.
quelle
Pyth -
191716 BytesTest Suite .
quelle
Bash + Coreutils,
169158149 BytesWir zählen in unary und geben eine Zeile mit einer
b
für jede Primzahl und einer Endunga
am Ende der Zeile aus (so dassprintf
es einen Token gibt, mit dem wir arbeiten können).Der Primalitätstest
factor $n | grep -q ': \w*$'
bestimmt, ob die Zahl genau einen Primfaktor hat.Wir partitionieren die Eingabe rekursiv. Wenn die linke Hälfte eine Primzahl ist, filtern wir die Ergebnisse der rechten Hälfte, indem wir zu jedem Wert eine hinzufügen. Wenn Sie
a
für eine Eingabe der Länge Null zurückgeben, wird die Rekursion beendet.Schließlich nehmen wir alle Ergebnisse und sortieren, um die kürzesten zu finden (ignorieren alle, die keinen
a
Erfolg anzeigen können); Wir müssen zwei (für die eingefügtea
und für die neue Zeile) löschen und dann die Zeichen zählen, um das Ergebnis zu erhalten.Tests
Ich
111
habe den Tests hinzugefügt, um zu zeigen, dass dies1
korrekterweise als Nicht-Primzahl gilt.quelle
c
es das Finale zu generieren0
. Nicht so begeistert von der Menge Stderr. Gerne können Sie (Versionen von) meiner Antwort als Grundlage für Ihre eigenen verwenden, wenn Sie möchten.Mathematica,
142135 BytesWie Sie sehen, wurde Mathematica nicht für diese Aufgabe entwickelt. Nimmt eine Liste von Ziffern.
quelle
And@@
anstelle von verwendenAllTrue
? Sollte 4-5 Bytes sparen.Flatten[#,1]
=Join@@@#