Concatenare i Primi


26

Sfida:

Ti viene data una stringa contenente solo cifre. Il tuo compito è produrre il numero minimo di numeri primi che devono essere concatenati per formare la stringa. Se ciò è impossibile, emettere 0.

Casi test:

Ingresso -> Uscita:

252 -> 3
235 -> 2
92 -> 0
31149 -> 2


Possono esserci zero iniziali?
Zgarb,

Sì, possono esserci zero iniziali.
poi830,

Possiamo prendere un elenco di cifre?
LegionMammal978,

1
Cosa succede se ci sono zeri iniziali?
Dennis,

Risposte:


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

Salvataggio di un byte grazie a @Neil!

Spiegazione

Accetta una singola stringa come input. Grazie al metodo di controllo primario (divisione di prova ricorsiva), il numero più grande che può essere verificato in sicurezza è 13840. Alcuni numeri sopra indicati falliranno a causa del superamento della dimensione massima dello stack di chiamate. Tuttavia, termina immediatamente per ogni caso che può gestire.

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"));


Sono io o si può cambiare i?(a=...)&&(b=...)&&a+b:0a i&&(a=...)&&(b=...)&&a+b?
Neil,

5

MATL , 26 24 byte

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

Ci vogliono alcuni secondi per alcuni dei casi di test.

Provalo online!

Spiegazione

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 byte

lhf.AmP_sdTa./zY

Test Suite .


Nella sua forma più recente, questo conta 0 e 1 come numeri primi. Tuttavia, prima della modifica, non lo faceva.
poi830,

1
@ poi830 risolto.
Maltysen,

2

Bash + coreutils, 169 158 149 byte

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

Contiamo in unario, producendo una riga con una bper ogni numero primo e una terminazione aalla fine della riga (in modo che printfabbia un token con cui lavorare).

Il test di primalità è factor $n | grep -q ': \w*$', che determina se il numero ha esattamente un fattore primo.

Partizioniamo ricorsivamente l'input; se la metà sinistra è primaria, filtriamo i risultati della metà destra aggiungendone uno a ciascun valore. Il ritorno aper un input di lunghezza zero termina la ricorsione.

Infine, prendiamo tutti i risultati e riordiniamo per trovare il più breve (ignorando quelli che non hanno il asegno di successo); dobbiamo eliminarne due (per l'inserimento ae per la nuova riga), quindi contare i caratteri per dare il risultato.

test

$ 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

Ho aggiunto 111ai test per dimostrare che 1è correttamente considerato non-prime.


Stavo per suggerire questo . La maggior parte delle mie modifiche sono probabilmente obsolete ora, ma altre dovrebbero ancora funzionare.
Dennis,

@Dennis - Mi piace cgenerare la finale 0. Tuttavia, non è così appassionato dell'abbondante stderr. Se preferisci, puoi usare (versioni di) la mia risposta come base per la tua.
Toby Speight,

2

Mathematica, 142 135 byte

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

Come puoi vedere, Mathematica non è stato creato per questo compito. Prende un elenco di cifre.


Puoi usare And@@invece di AllTrue? Dovrebbe salvare 4-5 byte.
CalculatorFeline

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

Um ... dà errore e risposta sbagliata su 133 ... hai usato tutti i casi di test, giusto?
CalculatorFeline

@CatsAreFluffy Golf e chiarito.
LegionMammal978,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.