Inspiré par http://xkcd.com/710/, voici un code golf pour cela.
Le défi
Étant donné un entier positif supérieur à 0, imprimez la séquence de grêle pour ce nombre.
La séquence de grêle
Voir Wikipedia pour plus de détails.
- Si le nombre est pair, divisez-le par deux.
- Si le nombre est impair, triplez-le et ajoutez-en un.
Répétez ceci avec le nombre produit jusqu'à ce qu'il atteigne 1. (s'il continue après 1, il ira dans une boucle infinie de 1 -> 4 -> 2 -> 1...
)
Parfois, le code est le meilleur moyen d'expliquer, alors voici quelques-uns de Wikipedia
function collatz(n)
show n
if n > 1
if n is odd
call collatz(3n + 1)
else
call collatz(n / 2)
Ce code fonctionne, mais j'ajoute un défi supplémentaire. Le programme ne doit pas être vulnérable aux débordements de pile . Il doit donc soit utiliser l'itération, soit la récursivité de queue.
En outre, des points bonus pour savoir s'il peut calculer de grands nombres et que la langue ne l'a pas déjà implémenté. (ou si vous réimplémentez la prise en charge des grands nombres en utilisant des entiers de longueur fixe)
Cas de test
Number: 21
Results: 21 -> 64 -> 32 -> 16 -> 8 -> 4 -> 2 -> 1
Number: 3
Results: 3 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1
En outre, le code golf doit inclure une entrée et une sortie utilisateur complètes.
Réponses:
assemblage x86, 1337 caractères
la source
int 23h
.Befunge
la source
CODE LOL: 406 CHARAKTERZ
TESTD UNDR INTERPRÉTÉ DE JUSTIN J. MEZA . KTHXBYE!
la source
Python -
95645146 caractèresNe produit évidemment pas de débordement de pile.
la source
input
ne fait pas de fichiereval
.n=input()*2
Perl
J'ai décidé d'être un peu anticoncurrentiel et de montrer comment vous coderiez normalement un tel problème en Perl.
Il y a aussi une entrée de code-golf de 46 caractères (au total) à la fin.
Ces trois premiers exemples commencent tous par cet en-tête.
Version récursive simple
Version itérative simple
Version itérative optimisée
Je vais maintenant vous montrer comment vous feriez ce dernier exemple avec une version de Perl antérieure à la v5.10.0
Référence
Tout d'abord, les E / S seront toujours la partie la plus lente. Donc, si vous les comparez tels quels, vous devriez obtenir à peu près la même vitesse pour chacun d'eux.
Pour les tester ensuite, j'ai ouvert un descripteur de fichier vers
/dev/null
($null
), et je les ai tous modifiéssay $n
à la placesay {$null} $n
. Cela permet de réduire la dépendance à l'égard des IO.Après l'avoir exécuté 10 fois, voici un exemple de sortie représentatif:
Enfin, une véritable entrée de code-golf:
46 caractères au total
Si vous n'avez pas besoin d'imprimer la valeur de départ, vous pouvez supprimer 5 caractères supplémentaires.
41 caractères totalisent
31 caractères pour la partie de code réelle, mais le code ne fonctionnera pas sans le
-n
commutateur. J'inclus donc l'exemple entier dans mon décompte.la source
$i + 1
y a toujours addition (réponse à l'entrée du blog). L'utilisationSub::Call::Recur
est également une optimisation. Sinon j'utiliserais@_=$n;goto &Collatz
. (Il est 10-20% plus lent si vous changezstate @next
pourmy @next
Haskell, 62 caractères
637683,86,97,137L'entrée utilisateur, la sortie imprimée, utilise la mémoire et la pile constantes, fonctionne avec des entiers arbitrairement grands.
Un exemple d'exécution de ce code, avec un nombre à 80 chiffres de tous les «1» (!) En entrée, est assez amusant à regarder.
Version d'origine, fonction uniquement:
Haskell 51 caractères
Qui le @ & ^ # a besoin de conditions, de toute façon?
(edit: j'étais "intelligent" et j'ai utilisé un correctif. Sans cela, le code est tombé à 54 caractères. edit2: est tombé à 51 en factorisant
f()
)la source
c 1=[1];c n=n:(c$div(n
mod2*(5*n+2)+n)2)
- 41 caractères, cela utilise le fait que c'est k * (3n + 1) + (1-k) * n / 2 où k = n mod 2Golfscript: 20 caractères
Cela équivaut à
la source
21
par~
, le programme utilisera un nombre de stdin(eval):1:in
la méthode initialize ': undefinedleftparen' for nil:NilClass (NoMethodError)
lors du remplacement21
par~
.echo 21 | ruby golfscript.rb collatz.gs
bc 41 caractères
Je suppose que ce genre de problèmes est ce
bc
pour quoi il a été inventé:Tester:
Code approprié:
bc
gère les nombres avec jusqu'àINT_MAX
chiffresEdit: L' article de Wikipedia mentionne que cette conjecture a été vérifiée pour toutes les valeurs jusqu'à 20x2 58 (environ 5.76e18 ). Ce programme:
tests 2 20000 +1 (environ 3,98e6,020 ) en 68 secondes, 144404 cycles.
la source
cat /dev/urandom | tr -dc '0-9' | head -c 10000 | bc collatz-conjecture.bc
bc
Perl: 31 caractères
Modifié pour supprimer 2 espaces inutiles.
Modifié pour supprimer 1 espace inutile.
la source
MS Excel, 35 caractères
Tiré directement de Wikipedia :
Il n'a fallu que copier / coller la formule 111 fois pour obtenir le résultat pour un nombre de départ de 1000.;)
la source
C: 64 caractères
Avec prise en charge des grands nombres entiers: 431 caractères (nécessaires)
Remarque : ne supprimez pas
#include <stdlib.h>
sans au moins prototyper malloc / realloc, car cela ne sera pas sûr sur les plates-formes 64 bits (64 bits void * sera converti en 32 bits int).Celui-ci n'a pas encore été testé vigoureusement. Il pourrait également utiliser un raccourcissement.
Versions précédentes:
(12 caractères supprimés car personne ne suit le format de sortie ...: |)
la source
Une autre version assembleur. Celui-ci n'est pas limité aux nombres de 32 bits, il peut gérer des nombres jusqu'à 10 65534 bien que le format ".com" utilisé par MS-DOS soit limité à 80 chiffres. Écrit pour l'assembleur A86 et nécessite une boîte DOS Win-XP pour fonctionner. Assemble à 180 octets:
la source
dc - 24 caractères
2528dc
est un bon outil pour cette séquence:Aussi 24 caractères utilisant la formule de l' entrée Golfscript :
57 caractères pour répondre aux spécifications:
la source
Schéma: 72
Cela utilise la récursivité, mais les appels sont récursifs en queue, donc je pense qu'ils seront optimisés pour l'itération. Lors de quelques tests rapides, je n'ai pas été en mesure de trouver un nombre pour lequel la pile déborde de toute façon. Juste par exemple:
(c 9876543219999999999000011234567898888777766665555444433332222 7777777777777777777777777777777798797657657651234143375987342987 53987098123749825298309837432974329852309858309837432974329852309858309837432974329852309858309837432974329852309857398730873098573987305983983987553987583987553987583987
... fonctionne très bien. [c'est tout un chiffre - je viens de le casser pour qu'il tienne à l'écran.]
la source
Mathematica, 45 ans
50caractèresla source
OddQ[#]
parOddQ@#
pour enregistrer 1 caractère.c[n_]:=NestWhileList[If[OddQ@#,3#+1,#/2]&,n,#>1&]
Ruby, 50 caractères, pas de débordement de pile
Fondamentalement, une rip directe de la solution Python de makapuf :
Ruby, 45 caractères, débordera
Fondamentalement, une déchirure directe du code fourni dans la question:
la source
n.odd??
ne suis pas défini. En outre, cela est vulnérable aux débordements de pile avec un grand nombre.p n=[n/2,n*3+1][n%2]
la source
Python 45 caractères
Rasé un omble de la réponse de makapuf.
la source
TI-BASIC
Pas la plus courte, mais une nouvelle approche. Certain de ralentir considérablement avec de grandes séquences, mais cela ne devrait pas déborder.
la source
Haskell: 50
la source
c 1=[1];c n=n:(c$[n
div2,3*n+1]!!(n
mod2))
, 44 caractèrespas la plus courte, mais une solution de clojure élégante
la source
C #: 216 caractères
sous forme longue:
Nouvelle version, accepte un nombre comme entrée fournie via la ligne de commande, aucune validation d'entrée.
173154 caractères.sous forme longue:
Je suis capable de raser quelques caractères en arrachant l'idée dans cette réponse d'utiliser une boucle for plutôt qu'un moment. 150 caractères.
la source
Rubis, 43 caractères
bignum pris en charge, avec susceptibilité de débordement de pile:
... et 50 caractères, bignum pris en charge, sans débordement de pile:
Félicitations à la Jordanie. Je ne connaissais pas «p» en remplacement des put.
la source
nroff 1
Courir avec
nroff -U hail.g
1. version groff
la source
groff -U hail.g
et vous obtenez PostScript! :-)Scala + Scalaz
Et en action:
Scala 2.8
Cela inclut également le dernier 1.
Avec ce qui suit implicite
cela peut être raccourci à
Modifier - 58 caractères (y compris l'entrée et la sortie, mais sans compter le numéro initial)
Peut être réduit de 2 si vous n'avez pas besoin de nouvelles lignes ...
la source
F #, 90 caractères
Ou si vous n'utilisez pas F # interactif pour afficher le résultat, 102 caractères:
la source
Common Lisp, 141 caractères:
Essai:
la source
Le programme frm Jerry Coffin a un débordement entier, essayez celui-ci:
testé avec
Le nombre inférieur à 100 millions avec le temps d'arrêt total le plus long est 63 728 127, avec 949 étapes.
Le nombre inférieur à 1 milliard avec le temps d'arrêt total le plus long est 670 617 279, avec 986 étapes.
la source
unsigned long long
.ruby, 43 ans, répondant peut-être aux exigences d'E / S
Courir avec
ruby -n hail
la source
C #: 659 caractères avec prise en charge BigInteger
Non golfées
la source