Il y a quelque temps, j'ai jeté un œil à la factorisation de 27000:
27000 = 2 3 × 3 3 × 5 3
Il y a deux choses spéciales à ce sujet:
- consécutive-prime : Les nombres premiers sont consécutifs: 2 est le 1er premier, 3 est le 2ème premier, 5 est le 3ème premier.
- exposant constant : l'exposant est le même pour chaque nombre premier (toujours 3)
Exprimé mathématiquement:
Un entier x est un nombre consécutif premier / exposant constant s'il existe des entiers strictement positifs n , k , m tels que x = p n m × p n +1 m × ... × p n + k m , où p j est le j premier -ième
Votre tâche consiste à tester si un entier positif remplit ces conditions.
Contribution:
Un entier positif> 1, sous toute forme raisonnable.
Sortie:
L'une des deux valeurs, dont au moins une doit être constante, indiquant si l'entrée est un nombre consécutif premier / exposant constant.
Cas de bord:
- les nombres premiers sont véridiques, car la factorisation de p premier est p 1
- d'autres nombres qui peuvent s'écrire p m où p est un nombre premier sont également vrais.
Règles:
- Des échappatoires standard s'appliquent.
- Pas de soucis de débordement d'entier, mais les nombres jusqu'à 255 doivent fonctionner.
- Le code le plus court en octets gagne.
Cas de test:
Vérité:
2
3
4
5
6
7
8
9
11
13
15
27000
456533
Faux:
10
12
14
72
10000000
Voici un script python générant des cas de test.
x = Pn^m
pièce. Je suppose que vous vouliez dire que Pn est le nième nombreRéponses:
05AB1E , 4 octets
Essayez-le en ligne!
Explication
la source
ÎÓKË
c'est tout ce que je peux penser d'autre que ça, gentil ... Je pensaisß
mais ça fait le contraire de ce que je pensais.Regex (ECMAScript),
276205201193189 octetsLa comparaison des multiplicités (exposants) de différents facteurs premiers est un problème intéressant à résoudre avec les expressions rationnelles ECMAScript - le manque de références inverses qui persistent à travers les itérations d'une boucle fait qu'il est difficile de compter n'importe quoi. Même s'il est possible de compter le trait numérique en question, une approche plus indirecte permet souvent un meilleur golf.
Comme pour mes autres publications sur les expressions rationnelles ECMA, je vais donner un avertissement de spoiler: je recommande fortement d'apprendre à résoudre des problèmes mathématiques unaires dans les expressions régulières ECMAScript. Ce fut un voyage fascinant pour moi, et je ne veux pas le gâter pour quiconque pourrait vouloir l'essayer lui-même, en particulier ceux qui s'intéressent à la théorie des nombres. Voir ce post précédent pour une liste des problèmes recommandés consécutivement marqués de spoiler à résoudre un par un.
Alors ne lisez pas plus loin si vous ne voulez pas que la magie regex unaire avancée soit gâtée pour vous . Si vous voulez essayer de découvrir cette magie vous-même, je vous recommande vivement de commencer par résoudre certains problèmes dans les expressions rationnelles ECMAScript, comme indiqué dans cet article lié ci-dessus.
La charge utile principale d'une expression régulière que j'ai développée précédemment s'est avérée très applicable à ce défi. C'est l' expression rationnelle qui trouve le ou les nombres premiers de la multiplicité la plus élevée . Ma première solution a été très longue, et je l'ai ensuite étudiée par étapes, la réécrivant d' abord pour utiliser l'antichambre moléculaire , puis la portant à nouveau sur ECMAScript en utilisant une technique avancée pour contourner le manque d'anticipation moléculaire , puis jouer au golf pour être beaucoup plus petit que la solution ECMAScript originale.
La partie de cette expression rationnelle qui s'applique à ce problème est la première étape, qui trouve Q, le plus petit facteur de N qui partage tous ses facteurs premiers. Une fois que nous avons ce nombre, tout ce que nous avons à faire pour montrer que N est un "nombre d'exposants constants" est de diviser N par Q jusqu'à ce que nous ne puissions plus; si le résultat est 1, tous les nombres premiers sont de multiplicité égale.
Après avoir soumis une réponse en utilisant mon algorithme développé précédemment pour trouver Q, je me suis rendu compte qu'il pouvait être calculé d'une manière entièrement différente: Trouver le plus grand facteur sans carré de N (en utilisant le même algorithme que mon expression rationnelle de Carmichael ). Il s'avère que cela ne pose aucune difficulté * en termes de contournement du manque d'anticipation moléculaire et de recherche de longueur variable (pas besoin de recourir à la technique avancée précédemment utilisée), et est 64 octets plus court! De plus, cela élimine la complexité du traitement du N sans carré et du N premier comme différents cas spéciaux, en laissant tomber 7 autres octets de cette solution.
(Il reste encore d'autres problèmes qui nécessitent la technique avancée précédemment utilisée ici pour jouer au golf le calcul de Q, mais actuellement aucun d'entre eux n'est représenté par mes messages PPCG.)
Je mets le test de multiplicité avant le test des nombres premiers consécutifs car ce dernier est beaucoup plus lent; mettre des tests qui peuvent échouer plus rapidement en premier accélère l'expression régulière pour une entrée uniformément distribuée. Il est également préférable de mettre le golf en premier, car il utilise plus de références arrières (qui coûteraient plus cher si elles étaient à deux chiffres).
J'ai pu supprimer 4 octets de cette expression régulière (193 → 189) en utilisant une astuce trouvée par Grimy qui peut encore raccourcir la division dans le cas où le quotient est garanti supérieur ou égal au diviseur.
^(?=(|(x+)\2*(?=\2$))((?=(xx+?)\4*$)(?=(x+)(\5+$))\6(?!\4*$))*x$)(?=.*$\2|((?=((x*)(?=\2\9+$)x)(\8*$))\10)*x$)(?!(((x+)(?=\13+$)(x+))(?!\12+$)(x+))\11*(?=\11$)(?!(\15\14?)?((xx+)\18+|x?)$))
Essayez-le en ligne!
* Il est toujours plus propre avec l'anticipation moléculaire, sans cas particulier pour N étant sans carré. Cela laisse tomber 6 octets, ce qui donne une solution de
195187183 octets :^(?=(?*(x+))\1*(?=\1$)((?=(xx+?)\3*$)(?=(x+)(\4+$))\5(?!\3*$))*x$)(?=((?=((x*)(?=\1\8+$)x)(\7*$))\9)*x$)(?!(((x+)(?=\12+$)(x+))(?!\11+$)(x+))\10*(?=\10$)(?!(\14\13?)?((xx+)\17+|x?)$))
Ici, il est porté sur une apparence de longueur variable:
Regex (ECMAScript 2018),
198195194186182 octets^(?=(x+)(?=\1*$)(?<=^x((?<!^\5*)\3(?<=(^\4+)(x+))(?<=^\5*(x+?x)))*))((?=((x*)(?=\1\8+$)x)(\7*$))\9)*x$(?<!(?!(\14\16?)?((xx+)\12+|x?)$)(?<=^\13+)((x+)(?<!^\15+)((x+)(?<=^\17+)(x+))))
Essayez-le en ligne!
la source
.*$\2
par\2^
^(?=(|(x+)\2*(?=\2$))(((?=(xx+?)\5*$)(?=(x+)(\6+$))\7(?!\5*$))*x$))(?!(((xx+)(?=\10+$)(x+))(?!\9+$)(x+))\8*(?=\8$)(?!(\12\11?)?(xx+)\14+$))((?=((x*)(?=\2\17+$)x)(\16*$))\19)*\3$
Gelée ,
1365 octetsEssayez-le en ligne!
Toujours dépassé ... (merci Erik pour -1 octet)
Explication
la source
œl
->t
. Il n'y a aucune raison que des zéros de fin soient présents dans la sortie de ÆE.JavaScript (ES6), 87 octets
Renvoie 0 pour la vérité ou un entier non nul pour la fausse.
Essayez-le en ligne!
Commenté
la source
j||i
lai
. Il donne maintenant beaucoup de faux positifs.CJam ,
3029 octetsEssayez-le en ligne!
Ma première réponse après une pause de près de 2 (!) Ans, donc il peut probablement être joué plus. Il s'agit d'un bloc qui prend l'entrée comme un entier (peut également être mappé pour des tableaux d'entiers).
Explication
la source
Stax ,
56 octetsExécuter et déboguer
Déballé, non golfé et commenté, il ressemble à ceci.
Modifier:
cela ne fonctionne pasÇa fonctionne maintenant.512
. Je vais y réfléchir et, espérons-le, une solution plus tard.la source
Stax , 9 octets
1 est vrai, 0 est faux
Exécuter et déboguer
Explication
Peut probablement être plus joué au golf, mais il couvre les cas qui me manquaient dans la dernière solution.
la source
MATL ,
12 1110 octetsEssayez-le sur MATL Online!
Merci à Luis Mendo pour la partie supprimer les zéros non significatifs. Il a également souligné que l'échange de valeurs de vérité est autorisé, ce qui renvoie 0 pour les nombres qui satisfont aux exigences du défi et toute valeur positive dans le cas contraire.
Grosso Modo, cela génère les exposants de la factorisation première séquentielle, supprime les zéros en tête et calcule l'écart type.
la source
0iYFhdz
fonctionne pour 7 octets: ajoutez un 0 aux exposants de la factorisation séquentielle, des différences consécutives, du nombre de non-zéros. Le résultat est1
si une entrée satisfait à l'exigenceJava 10,
223191178 178176168 octetsRetourne
1
comme véridique et>=2
comme falsey.Essayez-le en ligne.
Explication:
Quelques exemples d'entrées:
n=15
:1
pour le premier premier 2 (car 15 n'est pas divisible par 2).1
à0
dès que nous sommes au premier 3. Puisque 15 est divisible par 3,n
devient 5 (15/3 1 ), et l'ensemble devient[] → [1]
.n
devient 1 (5/5 1 ), et l'ensemble reste le même ([1] → [1]
).n=1
, nous arrêtons la boucle externe. Set ([1]
) ne contient qu'un seul élément, celui1
des deux nombres premiers adjacents 3 et 5, donc nous retournons vrai.n=14
:1
à0
pour le premier premier 2 (car 14 est divisible par 2).n
devient 7 (14/2 1 ), et l'ensemble devient[] → [1]
.n
reste le même, et l'ensemble devient[1] → [1,0]
.n
reste le même, et l'ensemble reste le même ([1,0] → [1,0]
).n
devient 1 (7/7 1 ), et l'ensemble reste le même ([1,0] → [1,0]
).n=1
, nous arrêtons la boucle externe. Set ([1,0]
) contient deux éléments, celui1
des nombres premiers non adjacents 2 et 7, et celui0
des nombres premiers 3 et 5, donc nous retournons faux.n=72
:1
à0
pour le premier premier 2, car 72 est divisible par 2 (plusieurs fois). Devientn
ainsi 9 (72/2 3 ), et l'ensemble devient[] → [3]
.n
devient 1 (9/3 2 ), et l'ensemble devient[3] → [3,2]
.n=1
, nous arrêtons la boucle externe. Set ([3,2]
) contient deux éléments, le3
from prime 2 et le2
from prime 3, nous retournons donc false.la source
<2
et renvoyer un int (spécifiez que vous renvoyez 1 pour true).1
est véridique et2
ou plus est falsey. Merci.J , 16 octets
Un grand merci à FrownyFrog pour -8 octets!
Essayez-le en ligne!
Mon ancienne solution:
J , 24 octets
Essayez-le en ligne!
Explication:
_&q:
principaux exposants{.@I.}.]
supprime les zéros non significatifs en trouvant le premier élément non nul:1=[:#@~.
teste si tous les nombres restants sont égaux:la source
Husk , 11 octets
Essayez-le en ligne!
Renvoie 0 si ce n'est un nombre consécutif premier / exposant constant.
la source
MATL , 7 octets
Le résultat est
1
si une entrée satisfait à l'exigence.Essayez-le en ligne! Ou vérifiez tous les cas de test
Explication
la source
Octave , 67 octets
Essayez-le en ligne!
Je pense que c'est la seule solution qui utilise un histogramme.
Explication:
Cela fait un histogramme, où la variable à compter sont les facteurs de l'entrée, et placés dans les bacs
primes(x)
, qui sont tous des nombres premiers inférieurs à l'entrée. Nous trouvons ensuite l'emplacement des facteurs premiers, prend la différence entre chacun des indices et soustrayons un. S'il y a des éléments qui ne sont pas nuls (c'est-à-dire que la différence des indices des nombres premiers n'est pas 1), alors cela se traduira par une valeur fausse, sinon cela retournera une valeur vraie.On vérifie ensuite que tous les éléments non nuls de l'histogramme sont égaux à l'élément maximum. S'il y a des valeurs qui ne sont pas égales, cela se traduira par une valeur fausse, sinon cela renverra une valeur vraie.
Si ces deux blocs sont véridiques, notre entrée est un nombre d'exposants constants premiers consécutifs!
la source
APL (Dyalog Extended) , 28 octets
Essayez-le en ligne!
Comment:
la source
Wolfram Language (Mathematica) , 65 octets
Essayez-le en ligne!
la source
Pari / GP , 63 octets
Essayez-le en ligne!
la source
J , 14 octets
1 dans la sortie indique un exposant constant consécutif.
Essayez-le en ligne!
la source
Nettoyer , 127 octets
Essayez-le en ligne!
Définit la fonction à l'
? :: Int -> Bool
aide$ :: Int -> [Int]
de la factorisation et@ :: Int -> Bool
de la vérification de la primalité.la source
APL (NARS) 41 caractères, 82 octets
{π⍵} est la factorisation de la fonction de l'argument ⍵ dans la liste des facteurs premiers (répétez si un nombre premier apparaît plus longtemps);
{1π⍵} est la fonction next prime (notez que dans ce cas, son argument n'est pas un scalaire mais un tableau d'entiers). tester:
la source