Primes verketten


26

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


Kann es führende Nullen geben?
Zgarb

Ja, es kann führende Nullen geben.
Poi830

Können wir eine Ziffernliste erstellen?
LegionMammal978

1
Was passiert, wenn führende Nullen vorhanden sind?
Dennis

Antworten:


6

JavaScript (ES6), 123 121 120 Byte

f=(s,v)=>(p=n=>--n-1?s%n&&p(n):1)(s)||[...s].map((_,i)=>!(n=i&&(a=f(s.slice(0,i)))&&(b=f(s.slice(i)))&&a+b)|n>v?0:v=n)|v

Dank @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.

f=(s,v)=>
  (p=n=>--n-1?s%n&&p(n):1)(s) // if s is prime, return 1
  ||[...s].map((_,i)=>        // else for each index in s, split s into 2
    !(n=i&&                   // v = return value (initialised to undefined)
      (a=f(s.slice(0,i)))&&
      (b=f(s.slice(i)))&&
      a+b
    )|n>v?0:v=n               // if i, a, b and n are all > 0 and !(n > v), v = n
  )|v                         // cast v to an integer and return it

// Test
var testCases = [ "252", "235", "92", "3149", "24747" ];
document.write("<pre>" + testCases.map(c => c + ": " + f(c)).join("\n"));


Ist es mir oder können Sie ändern , i?(a=...)&&(b=...)&&a+b:0zu i&&(a=...)&&(b=...)&&a+b?
Neil

5

MATL , 26 24 Bytes

0in:"GUtZq@Z^V10ZA=a?x@.

Bei einigen Testfällen dauert es einige Sekunden.

Probieren Sie es online!

Erläuterung

0       % Push 0
in:     % Take input. Generate array [1,2,...,N] where N is input length
"       % For each. In each iteration the number of used primes is increased
  GU    %   Push input. Convert to number
  tZq   %   Duplicate. Array of primes smaller than the input
  @     %   Push number of primes to bes tested in this iteration
  Z^    %   Cartesian power
  V     %   Convert to 2D array. Each row is a combination of primes
  10ZA  %   Convert each row to base 10, disregarding spaces
  =a    %   Do any of the results equal the input number? 
  ?     %   If so
    x   %     Remove the 0 that's at the bottom of the stack
    .   %     Break for each loop
        %   Implicitly end if
        % Implicitly end for each
        % Implicitly display


4

Pyth - 19 17 16 Bytes

lhf.AmP_sdTa./zY

Test Suite .


In seiner neueren Form zählt dieser als Primzahlen 0 und 1. Vor der Bearbeitung war dies jedoch nicht der Fall.
Poi830

1
@ poi830 behoben.
Maltysen

2

Bash + Coreutils, 169 158 149 Bytes

c()
{
test $1||echo a
for i in `seq ${#1}`
do factor ${1::$i}|grep -q ': \w*$'&&printf b%s\\n `c ${1:$i}`
done
}
c $1|sort|sed '/a/!d;s/..//;q'|wc -c

Wir zählen in unary und geben eine Zeile mit einer bfür jede Primzahl und einer Endung aam Ende der Zeile aus (so dass printfes 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 afü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 aErfolg anzeigen können); Wir müssen zwei (für die eingefügte aund für die neue Zeile) löschen und dann die Zeichen zählen, um das Ergebnis zu erhalten.

Tests

$ for i in 252 235 92 31149 111; do echo "$i:"$'\t'"$(./77623.sh $i)"; done
252:    3
235:    2
92:     0
31149:  2
111:    0

Ich 111habe den Tests hinzugefügt, um zu zeigen, dass dies 1korrekterweise als Nicht-Primzahl gilt.


Ich wollte vorschlagen dies . Die meisten meiner Änderungen sind wahrscheinlich veraltet, aber andere sollten noch funktionieren.
Dennis

@Dennis - Ich mag ces das Finale zu generieren 0. 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.
Toby Speight

2

Mathematica, 142 135 Bytes

Min[Length/@Select[Join@@@Permutations/@IntegerPartitions@Length[a=#],And@@PrimeQ@*FromDigits/@a~Internal`PartitionRagged~#&]]/.∞->0&

Wie Sie sehen, wurde Mathematica nicht für diese Aufgabe entwickelt. Nimmt eine Liste von Ziffern.


Können Sie And@@anstelle von verwenden AllTrue? Sollte 4-5 Bytes sparen.
CalculatorFeline

Flatten[#,1]=Join@@@#
CalculatorFeline

Um ... gibt Fehler und falsche Antwort auf 133 ... Sie haben alle Testfälle verwendet, richtig?
CalculatorFeline

@CatsAreFluffy Golf und geklärt.
LegionMammal978
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.