Redivosite est un mot-valise inventé dans le seul but de ce défi. C'est un mélange de réduction, de division et de composite.
Définition
Étant donné un entier N> 6 :
- Si N est premier, N n'est pas un nombre de redivosite.
- Si N est composite:
- calculer à plusieurs reprises N '= N / d + d + 1 jusqu'à ce que N' soit premier, où d est le plus petit diviseur de N supérieur à 1
- N est un nombre redivosite si et seulement si la valeur finale de N ' est un diviseur de N
Voici les 100 premiers numéros de redivosite (aucune entrée OEIS au moment de la publication):
14,42,44,49,66,70,143,153,168,169,176,195,204,260,287,294,322,350,414,462,518,553,572,575,592,629,651,702,726,735,775,806,850,869,889,891,913,950,1014,1023,1027,1071,1118,1173,1177,1197,1221,1235,1254,1260,1302,1364,1403,1430,1441,1554,1598,1610,1615,1628,1650,1673,1683,1687,1690,1703,1710,1736,1771,1840,1957,1974,2046,2067,2139,2196,2231,2254,2257,2288,2310,2318,2353,2392,2409,2432,2480,2522,2544,2635,2640,2650,2652,2684,2717,2758,2760,2784,2822,2835
Exemples
- N = 13 : 13 est premier, donc 13 n'est pas un nombre redivosite
- N = 32 : 32/2 + 3 = 19; 19 n'est pas un diviseur ou 32, donc 32 n'est pas un nombre redivosite
- N = 260 : 260/2 + 3 = 133, 133/7 + 8 = 27, 27/3 + 4 = 13; 13 est un diviseur ou 260, donc 260 est un nombre redivosite
Ta tâche
- Étant donné un entier N , renvoyer une valeur véridique s'il s'agit d'un nombre redivosite ou d'une valeur fausse sinon. (Vous pouvez également générer deux valeurs distinctes, tant qu'elles sont cohérentes.)
- L'entrée est garantie supérieure à 6 .
- C'est le code-golf , donc la réponse la plus courte en octets l'emporte!
a(n)
directement, soit parce que vous pouvez calculer un terme à partir des précédents). Merci, Arnauld, d'avoir changé le défi. :)Réponses:
Haskell,
918583807574 octetsEssayez-le en ligne!
Edit: -2 octets grâce à @BMO, -3 octets grâce à @ H.PWiz et
-5-6 octets grâce à @ Ørjan Johansenla source
Husk , 14 octets
Essayez-le en ligne!
-3 merci à H.PWiz .
la source
Ω
Γ
...Γ
, étant donné une liste [a, b, c ...] s'appliquera~+→Π
àa
et[b,c...]
.~+→Π
ajoutea+1
àproduct[b,c...]
.a
est le plus petit diviseur,product[b,c...]
estN/d
C (gcc) ,
9489 octetsEssayez-le en ligne!
Explication
la source
Gelée , 14 octets
Essayez-le en ligne!
Comment ça marche
la source
Python 2 ,
9791 octetsEssayez-le en ligne!
Sorties via code de sortie.
Non golfé:
Essayez-le en ligne!
la source
05AB1E ,
1716 octetsEssayez-le en ligne!
Explication
la source
Pyth , 20 octets
Essayez-le ici!
Comment ça marche
Et les 4 premiers octets (
<P_Q
) vérifient simplement si l'entrée n'est pas première.Avec l'aide d' Emigna , j'ai réussi à économiser 3 octets.
la source
head(P)
au lieu de lafiITZ2
partie, car le plus petit diviseur supérieur à 1 sera toujours un nombre premier?Python 3 , 149 octets
Essayez-le en ligne!
Utiliser une approche par tamisage. Devrait être rapide (
O(N log log N)
= complexité temporelle du tamis d'Eratosthène) même avec de grandsN
(mais stocke desO(N)
entiers en mémoire)Remarque:
n
ne dépassent pasN
etN > 7
p
peuvent être aurange(2,N)
lieu derange(2,N+1)
tamiser./
ne fonctionne pas,//
doit être utilisé, en raison de l'index de liste.range
Malheureusement, le stockage dans une autre variable n'aide pas.Explication:
-~N
==N+1
.s
est initialisé avec desN+1
zéros (Python est à 0 indexation, donc les indices le sont0..N
)s[n]
on s'attend à ce que0
ifn
soit un nombre premier, etp
pourp
le nombre minimum premier qui se divisen
sin
est un composite.s[0]
et less[1]
valeurs ne sont pas importantes.Pour chacun
p
dans la gamme[2 .. N-1]
:s[p] < 1
(c'est-à-dires[p] == 0
), alorsp
est un nombre premier, et pour chacunq
étant un multiple dep
ets[q] == 0
, attribuezs[q] = p
.Les 2 dernières lignes sont simples, sauf que
n//s[n]-~s[n]
==(n // s[n]) + s[n] + 1
.Python 3 , 118 octets
Essayez-le en ligne!
Au prix d'une performance légèrement pire. (Celui-ci s'exécute dans la
O(N log N)
complexité du temps, supposons une implémentation raisonnable des tranches Python)Le programme complet équivalent est de 117 octets .
la source
n//s[n]-~s[n]
au lieu den//s[n]+s[n]+1
149 octets.or p
peut être|p
or p
exécute logique ou, tout en|p
exécutant bit ou. C'est,a or b
estb if a == 0 else a
.for
pour utiliser une tranche à la place d'une autrefor
. Lerange
est inversé, donc les index inférieurs remplaceront les plus grands, et le démarrage de la tranche à2*p
vous ne remplacera pass[0]
ous[p]
.Haskell , 110 octets
Essayez-le en ligne!
Pas très content ...
la source
Octave , 92 octets
Essayez-le en ligne!
la source
APL (Dyalog) , 50 octets
Essayez-le en ligne!
la source
Japt,
2524 octetsJe crains de ne pas être allé dans la bonne direction avec cela, mais je n'ai plus de temps pour essayer une approche différente.
Sorties
0
pour faux ou1
pour vrai.Essayez-le
la source
Perl 5 , 291 + 1 (-a) = 292 octets
Darn Perl pour ne pas avoir de vérificateur principal natif.
Version non golfée,
Essayez-le en ligne!
la source
Wolfram Language (Mathematica) , 64 octets
Implémentation simple en utilisant le remplacement de modèle récursif
(le remplacement de "\ [Divides]" par le symbole "∣" économise 7 octets)
Essayez-le en ligne!
la source
Propre ,
128117114 octetsEssayez-le en ligne!
la source
J , 35 octets
Essayez-le en ligne!
Le diviseur minimum étant le premier facteur premier a été volé à la solution @ Dennis's Jelly (que j'utilisais auparavant
<./@q:
).Il devrait y avoir une meilleure façon de faire l'itération, mais je n'arrive pas à la trouver. J'ai pensé à éviter de faire le test de primalité (
^:(0&p:)
) et d'utiliser plutôt adverse, mais il semble que cela sera un peu plus long car vous aurez besoin d'un_2{
et de quelques changements qui pourraient ne pas donner une réduction nette.J'ai vraiment l'impression qu'il doit aussi y avoir un moyen d'éviter d'avoir des parens autour du contrôle de primalité.
Explication (développée)
la source
APL NARS, 43 caractères, 85 octets
(en espérant qu'il converge pour tous les nombres> 6) test:
L'idée d'utiliser 2 fonctions anonymes me donne accès à une autre solution Apl.
la source
Pyt , 44 octets
Voir le code ci-dessous pour une explication - les seules différences sont (1) que N est décrémenté avant pour tenir compte de l'incrémentation au début de la boucle, et (2) il utilise NOR au lieu de OR.
Essayez-le en ligne!
Je l'ai fait avant de relire la question et j'ai remarqué qu'il ne voulait qu'un vrai / faux.
Pyt, 52 octets
Imprime une liste infinie de nombres Redivosite.
Explication:
Essayez-le en ligne!
la source