La conjecture de Collatz postule que si vous prenez un entier positif, répétez l'algorithme suivant suffisamment de fois:
if number is odd, then multiply by three and add one
if number is even, then divide by two
vous finirez par finir à 1. Cela semble toujours fonctionner, mais il n'a jamais été prouvé que cela fonctionne toujours.
Vous avez déjà joué au golf en calculant le temps qu'il faut pour arriver à 1 , alors j'ai pensé changer un peu les choses.
En partant d'un entier positif donné, calculez le temps qu'il faut pour arriver à 1 (son «temps d'arrêt»). Trouvez ensuite l'heure d'arrêt de ce numéro.
Répétez jusqu'à ce que vous atteigniez 1, ou jusqu'à ce que vous atteigniez la limite entièrement arbitraire de 100 itérations. Dans le premier cas, indiquez le nombre d'itérations nécessaires. Dans ce dernier cas, imprimez "Fail" ou une autre sortie cohérente de votre choix, tant qu'il ne s'agit pas d'un entier 1≤n≤100
. Vous ne pouvez pas générer de chaîne vide pour cette option. La sortie d'un entier en dehors de la plage [1, 100] est cependant autorisée.
Exemples:
Input: 2
2->1
Output: 1
Input: 5
5->5->5->5->5->...
Output: Fail
Input: 10
10->6->8->3->7->16->4->2->1
Output: 8
Input: 100
100->25->23->15->17->12->9->19->20->7->16->4->2->1
Output: 13
Input: 10^100
10^100->684->126->108->113->12->9->19->20->7->16->4->2->1
Output: 13
Input: 12345678901234567890
12345678901234567890->286->104->12->9->19->20->7->16->4->2->1
Output: 11
Input: 1
--Depending on your code, one of two things may happen. Both are valid for the purposes of this question.
1
Output: 0
--Or:
1->3->7->16->4->2->1
Output: 6
Comme je l'ai calculé 10^100
et en 12345678901234567890
utilisant une langue qui ne prend en charge que les réels pour cette taille, si votre langue est plus précise, vous pouvez obtenir des résultats différents pour ceux-ci.
Notation
Comme il s'agit de code-golf , la réponse avec le plus petit nombre d'octets l'emporte.
la source
Réponses:
Gelée , 24 octets
Essayez-le en ligne!
la source
³
au lieu deȷ2
est autorisée ).Python 2 , 70 octets
Renvoie 199 pour cent ou plusieurs itérations.
Essayez-le en ligne!
la source
Attaché , 40 octets
Essayez-le en ligne!
Ceci est un nouveau langage que j'ai créé. Je voulais me familiariser avec la création d'un langage d'infixe approprié, et voici le résultat: un knock-off mathématique. Hourra?
Explication
Il s'agit d'une composition de quelques fonctions. Ces fonctions sont:
PeriodicSteps[CollatzSize@Max&1]
Cela donne une fonction qui applique son argument jusqu'à ce que les résultats contiennent un élément en double. Cette fonction ,,CollatzSize@Max&1
s'appliqueCollatzSize
à la plus grande des entrées et1
, pour éviter l'entrée non valide0
à CollatSize.`#
est un opérateur entre guillemets; appliqué monadiquement dans ce sens, il obtient la taille de son argument`-&3
est une fonction liée, qui lie l'argument3
à la fonction`-
, qui se lit comme «moins 3». En effet, l'application PeriodicSteps donne des0
s, qui doivent être pris en compte. (Il gère également parfaitement les nombres hors limites comme ceux5
qui correspondent à-1
.)la source
J ,
4945 octets-4 octets grâce au code Collatz Sequence plus court extrait du commentaire de @ randomra ici .
Sorties
101
pour des résultats invalides.Essayez-le en ligne!
Explication
Sans surprise, cette explication est rapidement devenue obsolète. Je vais le laisser en termes de l'ancienne réponse de 49 octets que j'avais, que j'inclus ci-dessous. Si vous voulez une mise à jour, faites le moi savoir. La façon dont il trouve la longueur de la séquence récursive reste la même, je viens d'utiliser une méthode de séquence Collatz plus courte.
Trouver la longueur de la séquence Collatz
Cette section du code est la suivante
Voici l'explication:
Malheureusement, le verbe apply (
^:
) lorsqu'il est invité à stocker les résultats stocke également la valeur initiale, ce qui signifie que nous sommes (comme toujours) décalés d'un. Par conséquent, pourquoi nous soustrayons 1.Trouver la longueur de la séquence récursive
la source
*i.~(<101)1&(#@}.a:2&(<*|{%~,*+1+])])]
devraient être équivalentsC (gcc) , 75 octets
Renvoie
-1
pour lesn>=100
itérations.Essayez-le en ligne!
C (gcc) , 73 octets
Renvoie
0
pour lesn>=100
itérations.Essayez-le en ligne!
la source
JavaScript (ES6), 57 octets
Retourne en
true
cas d'échec. Retourne0
pour1
.Cas de test
Afficher l'extrait de code
la source
APL (Dyalog Unicode) ,
3960535249 octets-3 octets grâce à @ngn
Essayez-le en ligne!
Utilise le code @ngn pour Collatz, mais utilisait précédemment le code @ Uriel.
Voici l'ancienne version qui ne répondait pas aux spécifications:
la source
2|⍵:1+∇1+3×⍵⋄1+∇⍵÷2
->1+∇⊃⍵⌽0 1+.5 3×⍵
Perl 6 , 56 octets
Essayez-le en ligne!
Renvoie
101
une séquence sans fin.la source
Husk , 21 octets
Essayez-le en ligne! Retourne
-1
en cas d'échec,0
en entrée1
.Explication
la source
C (gcc) ,
7073 octetsEssayez-le en ligne!
Renvoie
101
lorsque le nombre d'itérations dépasse 100.la source
m=0
dans votref
(probablement même en utilisant l'for
intiailiser actuellement vide pour en enregistrer un;
).Nettoyer ,
146... 86 octets-11 octets grâce à Ørjan Johansen
Comme une fonction partielle littérale.
Essayez-le en ligne!
Abandonne avec
hd of []
si le nombre d'itérations dépasse 100.Quitte avec
Heap Full
pour les entrées supérieures à ~2^23
sauf si vous spécifiez une taille de segment de mémoire plus grande.la source
j f l n=hd[u\\1<-iterate f n&u<-l]
.\a=...a
pièce, elle curry. (Ou eta réduit.)Python 2 ,
999897 octetsc and t or f
au lieu det if c else f
.-1
placef
ou'f'
pour des entrées sans interruption.Essayez-le en ligne!
la source
BiwaScheme , 151 caractères
Vous pouvez l'essayer ici .
la source
R ,
119107 octetsUtilise partiellement le code collatz de Jarko Dubbeldam d' ici . Renvoie
0
pour> 100 itérations (échec).Essayez-le en ligne!
la source
APL NARS, 115 octets, 63 caractères
Probablement en utilisant des boucles, ce serait plus clair ... Il y a 4 fonctions, 2 imbriquées et ricorsives, et la première uniquement pour définir et initialiser à = 0, la variable d, vue de la 2ème fonction comme un compteur de variable globale.
Cette 3ème fonction, serait la fonction qui retourne combien d'appels il y a pour résoudre la conjecture Collatz pour son arg
C'est la 2ième fonction, si a son arg = 1, arrête sa récursivité et retourne d le nombre de fois où elle est appelée elle-même-1; sinon, si elle est appelée plus de 99 fois, arrêtez sa récursivité et retournez -1 (échec). Sinon, calculez la conjecture Collatz pour son arg et appelez-la pour la valeur de la longueur de la séquence Collatz. Pour moi, même si tout cela semble exécuté, cela pourrait être un gros problème si l'on définit une variable globale et une variable dans une fonction du même nom, lorsque le programmeur la considère comme une simple variable locale.
la source
(Emacs, Common, ...) Lisp, 105 octets
Renvoie t pour les itérations> 100
Étendu:
la source