Concaténation des amorces

26

Défi:

Vous obtenez une chaîne contenant uniquement des chiffres. Votre tâche consiste à afficher le nombre minimum de nombres premiers qui doivent être concaténés pour former la chaîne. Si cela est impossible, sortez 0.

Cas de test:

Entrée -> Sortie:

252 -> 3
235 -> 2
92 -> 0
31149 -> 2
poi830
la source
1
En relation
Alex A.
Peut-il y avoir des zéros non significatifs?
Zgarb
Oui, il peut y avoir des zéros non significatifs.
poi830
Pouvons-nous prendre une liste de chiffres?
LegionMammal978
1
Que se passe-t-il s'il y a des zéros non significatifs?
Dennis

Réponses:

6

JavaScript (ES6), 123 121 120 octets

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

Un octet enregistré grâce à @Neil!

Explication

Prend une seule chaîne en entrée. En raison de la méthode de vérification principale (division d'essai récursive), le plus grand nombre pouvant être vérifié en toute sécurité est 13840. Certains nombres au-dessus de cela échoueront en raison du dépassement de la taille maximale de la pile d'appels. Cependant, il se termine instantanément pour chaque cas qu'il peut gérer.

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

user81655
la source
Est - ce moi ou pouvez - vous changer i?(a=...)&&(b=...)&&a+b:0pour i&&(a=...)&&(b=...)&&a+b?
Neil
5

MATL , 26 24 octets

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

Cela prend quelques secondes pour certains des cas de test.

Essayez-le en ligne!

Explication

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
Luis Mendo
la source
4

Pyth - 19 17 16 octets

lhf.AmP_sdTa./zY

Suite de tests .

Maltysen
la source
Dans sa forme la plus récente, celui-ci compte 0 et 1 comme nombres premiers. Cependant, avant l'édition, ce n'était pas le cas.
poi830
1
@ poi830 l'a corrigé.
Maltysen
2

Bash + coreutils, 169 158 149 octets

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

Nous comptons en unaire, produisant une ligne avec un bpour chaque nombre premier et une terminaison aà la fin de la ligne (ce qui printfa un jeton avec lequel travailler).

Le test de primalité est factor $n | grep -q ': \w*$', qui détermine si le nombre a exactement un facteur premier.

Nous partitionnons récursivement l'entrée; si la moitié gauche est première, nous filtrons les résultats de la moitié droite en ajoutant un à chaque valeur. Le retour ad'une entrée de longueur nulle met fin à la récursivité.

Enfin, nous prenons tous les résultats et trions pour trouver le plus court (en ignorant ceux qui n'ont pas le apour indiquer le succès); il faut en supprimer deux (pour l'inséré aet pour la nouvelle ligne), puis compter les caractères pour donner le résultat.

Les 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

J'ai ajouté 111aux tests pour montrer qu'il 1est correctement considéré comme non premier.

Toby Speight
la source
J'allais suggérer cela . La plupart de mes modifications sont probablement obsolètes maintenant, mais d'autres devraient encore fonctionner.
Dennis
@Dennis - J'aime cgénérer la finale 0. Pas si enthousiasmé par le copieux stderr, cependant. Vous pouvez utiliser (des versions de) ma réponse comme base pour la vôtre si vous le souhaitez.
Toby Speight
2

Mathematica, 142 135 octets

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

Comme vous pouvez le voir, Mathematica n'a pas été conçu pour cette tâche. Prend une liste de chiffres.

LegionMammal978
la source
Pouvez-vous utiliser à la And@@place de AllTrue? Devrait enregistrer 4-5 octets.
CalculatorFeline
Flatten[#,1]=Join@@@#
CalculatorFeline
Hum ... donne une erreur et une mauvaise réponse sur 133 ... vous avez utilisé tous les cas de test, non?
CalculatorFeline
@CatsAreFluffy Golfé et clarifié.
LegionMammal978