É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, 2323
peut ê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 019
ou 00000037
est 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 code-golf , 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:
Haskell ,
9689 octets5 octets économisés grâce au test de primalité de H.PWiz
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 enutilisant la définition de prime.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 code-golf 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:
Nous revenons alors la valeur au plus grand indice de L . ( L k où k est le nombre de chiffres de n )
la source
Gelée , 8 octets
Essayez-le en ligne!
-1 octet grâce à Leaky Nun
-1 octet grâce à Dennis
Explication
la source
Brachylog , 10 octets
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 premiersla source
{~cṗᵐ}ᶜ
. C'est vraiment lent car~c
sur les entiers fonctionne avec l'arithmétique des contraintes, mais en théorie cela fonctionne.Pyth , 13 octets
Suite de tests.
la source
Python 2 ,
1059591 octetsC'est très lent.
Essayez-le en ligne!
la source
Python 2 , 161 octets
Essayez-le en ligne!
La fonction
g
cré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 "estd
un premier?".la source
Gaia , 12 octets
Essayez-le en ligne!
la source
Nettoyer ,
199141131 octetsEssayez-le en ligne!
la source
J ,
6564 octetsEssayez-le en ligne!
la source
Pyth, 12 octets
Prend les entrées sous forme d'entier, les sorties
True
ouFalse
Essayez-le en ligne!
la source