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


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 )


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

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


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.


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?".





En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.