Voici la conjecture de Collatz (OEIS A006577 ):
- Commencez avec un entier n > 1.
- Répétez les étapes suivantes:
- Si n est pair, divisez-le par 2.
- Si n est impair, multipliez-le par 3 et ajoutez 1.
Il est prouvé que pour tous les entiers positifs jusqu’à 5 * 2 60 , soit environ 5764000000000000000 , n finira par devenir 1 .
Votre tâche consiste à déterminer le nombre d’itérations (en divisant par deux ou en triplant plus une) pour atteindre 1 .
Règles:
- Le code le plus court gagne.
- Si un nombre <2 est entré ou un nombre non entier ou non, la sortie n'a pas d'importance.
Cas de test
2 -> 1
16 -> 4
5 -> 5
7 -> 16
1+
est spécial-casé comme)
.C -
5047 caractèresPauvre petit C nécessite malheureusement une énorme quantité de code pour les E / S de base, aussi, raccourcir tout cela a rendu l’interface utilisateur légèrement peu intuitive.
Compilez-le avec par exemple
gcc -o 1 collatz.c
. L'entrée est unaire avec des chiffres séparés par des espaces et vous trouverez la réponse dans le code de sortie. Un exemple avec le numéro 17:la source
return~-a?
enregistre 1. De plus, le fait de passerb++
à l’?
affaire devrait enregistrerb--
.Perl 34 (+1) caractères
Abuser
$\
pour le résultat final, comme d'habitude. Exécuter avec l'-p
option de ligne de commande, l'entrée est prise à partir destdin
.Un octet enregistré dû à Elias Van Ootegem . Plus précisément, il est observé que les deux suivants sont équivalents:
Bien que un octet plus, il enregistre deux octets en raccourcissant
$_/2
juste.5
.Exemple d'utilisation:
PHP 54 octets
L'archnémèse de Javascript pour le prix de la cuillère en bois semble être un peu à la hauteur de ce défi. Ce problème ne laisse toutefois pas beaucoup de place à la créativité. L'entrée est considérée comme un argument de ligne de commande.
Exemple d'utilisation:
la source
$_
dans le ternaire semble inutile, vous pouvez raser un autre personnage en utilisant*=
comme ceci:$\++,$_*=$_&1?3+1/$_:.5while$_>1}{
. Multiplier par1/$_
a le même effet que+1
, ça$_*=3+1/$_
marche donc très bien$_*=3+1/$_
est génial, merci!Mathematica (35)
Usage:
la source
Comme d'habitude, je commencerai les réponses par les miennes.
JavaScript,
4644 caractères (exécuté sur la console)la source
Java,
165, 156, 154,134,131,129,128, 126 (les langues verbeuses ont besoin d'amour aussi)Tout est fait à l'intérieur du pour
C'est paniquer bel homme. Merci à Pater Taylor !!!, et l’idée d’utiliser une boucle for a été volée à ugoren
J'ai remplacé Integer pour Short.
la source
i(,++y)
. Vous pouvez économiser deux autres en utilisant à la<
place de==
.class a{public static void main(String[]a){for(int x=new Short(a[0]),y=0;x>1;System.out.println(++y))x=x%2<1?x/2:x*3+1;}}
modifications apportées: 1) remplacéShort.valueOf(...)
parnew Short(...)
for -4 octets et 2) j'ai mis lex=x%2<1?x/2:x*3+1;
dans le corps de lafor
boucle pour se débarrasser des virgule pour -1 octet .Rebmu : 28
Sur un problème aussi bref et mathématique, GolfScript gagnera probablement quelques pour cent contre Rebmu (si vous n’avez pas à le dire, lisez des fichiers sur Internet ou générez des fichiers JPG). Pourtant, je pense que la plupart des gens conviendraient que la logique de Golfscript est loin d’être aussi facile à suivre, et que la pile exécutable totale qui l’exécute est plus grande.
Bien propre créateur de Rebol Carl Sassenrath m'a dit qu'il a trouvé Rebmu « illisible », il est occupé et n'a pas le temps de vraiment pratiquer la transformation de porc-latin comme par unmushing . Ceci est simplement transformé en:
Notez que l’espace était requis pour obtenir un a: au lieu d’ un . Ceci est un "mot de passe!" et l'évaluateur remarque que ce type de symbole déclenche l'affectation.
S'il était écrit en langage non abrégé (Rebol pourtant écrit maladroitement), vous obtiendriez:
Rebol, comme Ruby, évalue les blocs à leur dernière valeur. La boucle UNTIL est une forme de boucle curieuse qui ne prend pas de condition de boucle. Elle arrête simplement de faire une boucle lorsque son bloc est évalué à quelque chose qui n'est pas FALSE ou NONE. Donc, au moment où
1 ==
le résultat de l'affectation de A (l'argument à rebmu) au résultat du conditionnel de Collatz (ou bien un IF-ELSE qui correspond à la branche de son choix) ... la boucle se rompt.J et K sont initialisés à la valeur entière zéro dans Rebmu. Et comme mentionné ci-dessus, le tout est évalué à la dernière valeur. Ainsi, une référence J à la fin du programme signifie que vous obtenez le nombre d'itérations.
Usage:
la source
Python repl, 48
Je ne suis pas convaincu qu'il n'y ait pas d'expression plus courte que
n=3*n+1;n/=1+n%2*5;
. J'ai probablement trouvé une douzaine d'expressions différentes de la même longueur ...edit: J'ai trouvé une autre solution qui ne se disputera jamais, mais qui est trop amusante pour ne pas être partagée.
la source
(n//2,n*3+1)[n%2]
est plus courte.n/2
fonctionnerait pas aussi bien que nous savons qu'il est même?APL (31)
la source
{1=⍵:0⋄2|⍵:1+∇1+3×⍵⋄1+∇⍵÷2}
{1=⍵:0⋄1+∇⊃⍵⌽0 1+.5 3×⍵}
J, 30 caractères
S'est avéré un peu plus long que souhaité
usage:
-:`(1+3&*)`]
est un gérond composé de trois verbes, utilisé à trois reprises.-:
signifie "divise en deux",(1+3&*)
ou(1+3*])
encode l'étape de multiplication et la]
terminaison des aides (d'identité).2&|+1&=
forme un index pour le gérondif. littéralement, "le reste après division par deux plus s'il est égal à un".#verb^:a:
itère la fonction jusqu'à ce que le résultat soit stable (ici, forcé explicitement), lors de la collecte des étapes, puis les compte. Volé de @JB .<:
décrémente le nombre de pas d'une unité pour s'aligner sur les exigences de la question.la source
<:
,#-:
,:`(
,&*)
,=)
,)^:
.<:
signifie "décrémenter" ou "inférieur ou égal",#
signifier "nombre de" ou "n fois",-:
signifier "moitié ou epsilon-égalité",:`(
signifier à son tour la fin de ladite "moitié", le lien entre deux verbes au gérondif et une parenthèse gauche (utilisés pour grouper).&*)
signifie "qch. lié à la multiplication" (3 liés avec la multiplication crée l'opérateur "fois trois") et la fin du regroupement.=
effectue le contrôle d'égalité ou, au sens unaire, l'auto-classification.^:
est la conjonction de pouvoir (itération du verbe). Comme beaucoup de verbes J se terminent par un colon, ... :-)<:#a:2&(<*|+|6&*%~)
19 octets (-11)Schéma de jeu,
10698 caractères, 40 parenthèses(let((f(lambda(x)(cond((= x 1) 0)((odd? x)(+ 1(f(+ 1(* 3 x)))))(else(+ 1(f(/ x 2))))))))(f(read)))
9189 caractères avec définir directement(define(f x)(cond((= x 1)0)((odd? x)(+ 1(f(+ 1(* 3 x)))))(else(+ 1(f(/ x 2))))))(f(read))
la source
PowerShell:
7774717061Code de golf:
Remarques:
À l’origine, j’essayais de prendre l’entrée de l’utilisateur sans la forcer à un nombre entier, mais c’était cassant de manière intéressante. Tous les intrants impairs seraient traités de manière imprécise, mais même les intrants fonctionneraient correctement. Il m'a fallu une minute pour comprendre ce qui se passait.
Lors de la multiplication ou de l'addition, PowerShell considère d'abord les entrées non typées comme des chaînes. Ainsi,
'5'*3+1
devient "5551" au lieu de 16. Les entrées paires se sont bien comportées car PowerShell ne dispose pas d'une action par défaut pour la division contre les chaînes. Même les entrées paires qui progressaient dans les nombres impairs fonctionnaient bien car, au moment où PowerShell avait atteint un nombre impair dans la boucle, la variable était déjà forcée à un entier par les opérations mathématiques.Conseil de PowerShell Golfer: Pour certains scénarios, comme celui-ci,
switch
batif/else
. Ici, la différence était de 2 caractères.Il n'y a pas d'erreur de vérification pour les valeurs non-entières, ou les entiers inférieurs à deux.
Si vous souhaitez vérifier le script, insérez-le
;$i
juste avant la dernière accolade.Je ne sais pas exactement dans quelle mesure PowerShell gère les nombres qui évoluent vers des valeurs très grandes, mais je m'attends à ce que la précision disparaisse à un moment donné. Malheureusement, je m'attends aussi à ce qu'il n'y ait pas grand chose à faire à ce sujet sans gravement gonfler le script.
Ungolfed code, avec des commentaires:
Cas de test:
Vous trouverez ci-dessous des exemples d’audit activé. J'ai également modifié la sortie pour plus de clarté, en ajoutant des étiquettes à l'entrée et au décompte final et en insérant un espacement pour séparer les valeurs de Collatz.
Bits intéressants sur les nombres saisis qui ne proviennent pas des cas de test de la question:
14
et197
sont des nombres de Keith31
est un Mersenne Prime6174
est la constante de Kaprekar8008135
. Et Numberphile , évidemment.la source
switch
par$i=(($i/2),($i*3+1))[$i%2]
read-host
en nombre - il suffit de changer$i*3
pour3*$i
.$i*3
- pourquoi n'y ai-je pas déjà pensé?param($i)for(;$i-ne1;$x++){$i=(($i/2),(3*$i+1))[$i%2]}$x
- remplacez l'hôte de lecture par un paramètre, pour obtenir 56 octets . Essayez-le en ligne link80386 assembly, 16 octets
Cet exemple utilise la syntaxe AT & T et la convention d'appel fastcall. L'argument est le suivant
ecx
:Voici les 16 octets de code machine résultants:
la source
Brachylog , 16 octets
Essayez-le en ligne!
Explication
Une solution alternative au même nombre d'octets:
Essayez-le en ligne!
la source
GolfScript (23 caractères)
Test en ligne
la source
F # - 65 caractères
la source
Python
68585452 caractèresf=lambda n:1+(n-2and f((n/2,3*n+1)[n%2]));f(input())
Merci à Bakuriu et Boothby pour les conseils :)
la source
n%2and 3*n+1or n/2
pour enregistrer 5 caractères. Également dans python2, vous pouvez supprimer l'appelint
, réduisant ainsi la taille à 58 octets.[n/2,3*n+1][n%2]
.unsupported operand type(s) for -: 'str' and 'int'
Retina , 43 octets
Prend l’entrée et imprime la sortie unaire.
Chaque ligne doit aller dans son propre fichier. 1 octet par fichier supplémentaire ajouté au nombre d'octets.
Vous pouvez exécuter le code en tant que fichier unique avec l'
-s
indicateur. Par exemple:L'algorithme est une boucle consistant à faire une étape de Collatz avec le nombre unaire et à ajouter un nouveau marqueur de pas
x
à la fin de la chaîne si le nombre n'est pas 1.Lorsque la boucle se termine par
1
, nous convertissons les marqueurs en un nombre unaire (en supprimant le premier1
) qui correspond à la sortie souhaitée.la source
Gelée , non en compétition
12 octets Cette réponse est sans concurrence, car le défi était antérieur à la création de Jelly.
Essayez-le en ligne!
Comment ça fonctionne
la source
dc, 27 caractères
Appliquer la magie noire de boothby :
Je ne suis pas vraiment sûr de comprendre comment - ou cela - cela fonctionne.
Usage:dc, 36 caractères
Ma propre création; Une approche un peu plus traditionnelle, même si j'ai dû lutter un peu avec le langage pour pallier le manque d'éléments
else
dans lesif
déclarations:En interne, il produit tous les numéros de la séquence et les stocke dans la pile, puis
1
affiche la dernière et affiche la hauteur de la pile.la source
2<x
et vous en débarrasserk
. Juste au cas où vous voudriez récupérer un octet après quatre ans. : Dbrainfuck ,
5956 octetsEssayez-le en ligne! (Légèrement modifié pour la facilité d'utilisation)
Entrée et sortie en tant que codes de caractères. Ceci est plus utile avec des cellules de taille arbitraire, mais peut toujours fonctionner avec de petites valeurs dans des tailles de cellules limitées.
Comment ça fonctionne
la source
Hexagonie ,
4844 octetsEssayez-le en ligne!
Étendu:
Notez que cela échoue1
pour des raisons euhh . Honnêtement, je ne sais plus trop comment cela fonctionne. Tout ce que je sais, c'est que le code des nombres impairs est inversé pour les nombres pairs? En quelque sorte?La nouvelle version est beaucoup plus nette que la précédente, mais présente un peu plus de directions et se termine par une erreur de division par zéro. Le seul cas où cela ne se produit pas, c'est quand il gère
1
correctement.la source
If a number < 2 is input ... output does not matter.
: o)C,
7069 caractèresAssez simple, pas de trucs.
Lit les entrées de stdin.
la source
Q, 46
la source
(#)1_(1<){(1+3*x;x%2)0=x mod 2}\
Ruby 1.9, 49 caractères
La réponse Python de Rubyfied Valentin CLEMENT , en utilisant la syntaxe stabby lambda. Sqeezed en une seule déclaration pour plus de lisibilité.
Certains frais généraux parce que Ruby, contrairement à Python, n'est pas content de mélanger des nombres avec des booléens.
la source
C ++ (
5148)C'est une fonction récursive qui fait cela; la lecture d'entrée vient séparément.
Je suis sûr que je peux faire un truc "et / ou" avec le
== 0
truc, mais je ne sais pas comment.la source
==0
et échanger les côtés du conditionneln==1
parce que j'ai spécifié dans la question que le nombre est toujours supérieur à 1n==1
c'est le cas de base de la récursivité. Mettren==2
là-bas n'améliorerait pas le score.return~-n?
et échanger les côtés conditionnelsn==1
==n<2
.~ - ~! (Pas de commentaire) -
7153Cette langue n’est évidemment pas la meilleure pour jouer au golf car elle manque de nombreuses fonctionnalités natives, mais c’est la beauté de celle-ci.
Tout d’abord, réglez
'''
votre saisie. La fonction''
peut alors être appelée avec%
comme entrée et renverra la réponse, comme ceci:'''=~~~~~:''&%:
Cela va revenir
~~~~~
. Cela fonctionne réellement pourn==1
(il boucle pour toujoursn==0
).Comme toujours avec cette langue, non testée.
la source
JavaScript (ES6) - 29 caractères
Crée une fonction
f
qui accepte un seul argument et renvoie le nombre d'itérations.JavaScript - 31 caractères
Suppose que l’entrée est dans la variable
n
et crée une variablec
contenant le nombre d’itérations (et sera également transmisec
à la console en tant que dernière commande).la source
Perl 6, 40 octets
Méthode de la fonction récursive, selon Valentin CLEMENT et daniero : 40 caractères
Méthode de liste paresseuse: 32 caractères
la source
> <>,
27 2623 octetsComme l’autre> <> répond, cela construit la séquence sur la pile. Une fois que la séquence atteint 2, la taille de la pile est le nombre de pas effectués.
Grâce à @Hohmannfan, économisez 3 octets grâce à une méthode très intelligente de calcul direct de la valeur suivante. La formule utilisée pour calculer la valeur suivante de la séquence est la suivante:
La fraction mappe les nombres pairs sur 0,5 et les nombres impairs sur 3. Multiplier par
n
et ajoutern%2
complète le calcul - nul besoin de choisir la valeur suivante!Edit 2: Voici la version pré- @ Hohmannfan:
L'astuce ici est que les deux
3n+1
etn/2
sont calculés à chaque étape de la séquence, et l'une à être retirés de la séquence est choisie par la suite. Cela signifie que le code n'a pas besoin de créer de branche jusqu'à ce que 1 soit atteint et que le calcul de la séquence peut se faire sur une ligne de code.Édition: rejetez un autre caractère après avoir réalisé que le seul entier positif pouvant mener à 1 est 2. Comme la sortie du programme n'a pas d'importance pour l'entrée <2, la génération de séquence peut se terminer lorsque 2 est atteint, laissant ainsi la taille de la pile. étant le nombre exact d'étapes requises.
Version précédente:
la source
\::2%:@5*1+2,*+:2=?