Décomposition en nombres premiers

14

Étant donné un entier n, retournez le nombre de façons dont n peut être écrit sous forme de liste de nombres premiers. Par exemple, 2323peut être écrit sous la forme (2,3,23), (23,23)ou (2,3,2,3)ou (23,2,3), de sorte que vous produisiez 4. Si elle ne peut pas être écrite de cette manière, vous devez sortir 0.

Un nombre premier tel que 019ou 00000037est un nombre premier valide pour ce problème.

Cas de test:

5 -> 1
55 -> 1 
3593 -> 4 (359 and 3, or 3 and 593, or 3 and 59 and 3, or 3593)
3079 -> 2 (3 and 079, or 3079)
119 -> 0 
5730000037 -> 7 (5,7,3,000003,7, 5,7,3,0000037, 5,73,000003,7, 5,73,0000037, 5,73000003,7, 5,7,30000037, 5730000037)
0-> undefined (you do not have to handle this case)

Il s'agit de , donc la réponse la plus courte en octets dans chaque langue gagne!

Edit: maintenant je sais pourquoi je devrais utiliser le bac à sable la prochaine fois

gréé
la source
En relation
Peter Taylor

Réponses:

7

Haskell , 96 89 octets

5 octets économisés grâce au test de primalité de H.PWiz

p x=[1|0<-mod x<$>[2..x]]==[1]
f[]=1
f b=sum[f$drop i b|i<-[1..length b],p$read$take i b]

Essayez-le en ligne!

Explication

La première chose à faire est de créer une fonction de test principale en utilisant le théorème de Wilson en utilisant la définition de prime.

p x=[1|0<-mod x<$>[2..x]]==[1]

Commencez ensuite à définir f. La première chose que j'ai pensé quand j'ai vu ce problème était d'utiliser la programmation dynamique. Cependant, la programmation dynamique coûte des octets et utilise donc un algorithme de "programmation pseudo-dynamique". Alors que dans la programmation dynamique, vous stockez ici un graphe acyclique dirigé, nous utilisons simplement la récursivité et recalculons chaque nœud chaque fois que nous en avons besoin. Il perd tout le temps des avantages de la programmation dynamique, mais c'est du alors peu importe. (encore mieux que la recherche par force brute)

L'algorithme est le suivant, nous construisons un graphe acyclique dirigé, L , où chaque nœud représente une sous-chaîne du nombre. En particulier, L i représente les i derniers chiffres de notre entrée (appelons-le n ).

Nous définissons L 0 pour avoir une valeur de 1 et chaque autre valeur dans L pour avoir la somme de chaque L j telle que j <i et la sous-chaîne de n de i à j est première.

Ou dans une formule:

Formula

Nous revenons alors la valeur au plus grand indice de L . ( L kk est le nombre de chiffres de n )

Post Rock Garf Hunter
la source
6

Gelée , 8 octets

ŒṖḌÆPẠ€S

Essayez-le en ligne!

-1 octet grâce à Leaky Nun
-1 octet grâce à Dennis

Explication

ŒṖḌÆPẠ€S  Main Link
ŒṖ        List Partitions (automatically converts number to decimal digits)
  Ḍ       Convert back to integers (auto-vectorization)
   ÆP     Are they primes? (auto-vectorization)
     Ạ€   For each, are they all truthy (were the numbers all primes?); 1/0 for truthy/falsy
       S  Sum; gets number of truthy elements
HyperNeutrino
la source
J'ai remarqué que 05AB1E ne peut pas faire cela facilement. Les partitions semblent être une excellente commande.
Urne de poulpe magique le
5

Brachylog , 10 octets

ṫ{~cịᵐṗᵐ}ᶜ

Essayez-le en ligne!

Convertit d' abord l'entrée en une chaîne. {…}ᶜCompte le nombre de sorties possibles pour .

À {…}l' intérieur, la sortie de est alimentée ~c. La sortie de ce prédicat vérifie que, lorsqu'il est concaténé, il est égal à l'entrée. Ceci est introduit dans ịᵐ, qui spécifie que sa sortie est son entrée avec chaque chaîne convertie en entier. ṗᵐspécifie que son entrée est constituée de nombres premiers

H.PWiz
la source
1
Vous n'avez pas besoin de convertir en chaîne et en arrière, ces 7 octets suffisent: {~cṗᵐ}ᶜ. C'est vraiment lent car ~csur les entiers fonctionne avec l'arithmétique des contraintes, mais en théorie cela fonctionne.
Fatalize
@Fatalize Je pense que cela ne tient pas compte des zéros non
significatifs
4

Pyth , 13 octets

lf.AmP_sdT./`

Suite de tests.

Leaky Nun
la source
Je ne connais pas bien Pyth mais au lieu de filtrer puis de prendre la longueur, pourriez-vous faire for_each au lieu de filtrer puis additionner?
HyperNeutrino
@HyperNeutrino cela fait-il une différence?
Leaky Nun
Je ne suis pas sûr, je n'ai pas testé. C'est le cas pour Jelly (probablement à cause du filtre rapide à deux octets) mais je ne suis pas sûr.
HyperNeutrino
@HyperNeutrino filter is one byte here ...
Leaky Nun
2

Python 2 , 161 octets

lambda n:sum(all(d>1and all(d%i>0for i in range(2,d))for d in v)for v in g(`n`))
g=lambda s:[[int(s[:i])]+t for i in range(1,len(s))for t in g(s[i:])]+[[int(s)]]

Essayez-le en ligne!

La fonction gcrée les partitions de manière récursive (elle prend une chaîne en entrée mais génère une liste de listes d'entiers). La plupart du code restant consiste simplement à implémenter "est dun premier?".

Chas Brown
la source
1

Nettoyer , 199 141 131 octets

import StdEnv
?n|n<2=0|and[gcd n i<2\\i<-[2..n-1]]=1=0
@n#s=toString n
#f=toInt o(%)s
= ?n+sum[@(f(0,i))\\i<-[0..n]| ?(f(i+1,n))>0]

Essayez-le en ligne!

Οurous
la source
0

Pyth, 12 octets

lf*FmP_sdT./    

Prend les entrées sous forme d'entier, les sorties TrueouFalse

Essayez-le en ligne!

Dave
la source