Un nombre heureux est défini par le processus suivant. En commençant par n'importe quel entier positif, remplacez le nombre par la somme des carrés de ses chiffres et répétez le processus jusqu'à ce que le nombre soit égal à 1 (où il restera), ou il boucle sans fin dans un cycle qui ne comprend pas 1. Ces nombres pour lesquels ce processus se termine par 1 sont des nombres heureux, tandis que ceux qui ne se terminent pas par 1 sont des nombres malheureux (ou des nombres tristes). Étant donné un numéro, indiquez s'il est heureux ou non.
Sample Inputs
7
4
13
Sample Outputs
Happy
Unhappy
Happy
Remarque: Votre programme ne devrait pas prendre plus de 10 secondes pour tout nombre inférieur à 1 000 000 000.
la source
a <= 4
eta <= 1
. Si le cycle a un 1, alors il est heureux, et s'il a un 4, alors il n'est pas heureux. Voir la section wikipedia sur le cycle malheureux. Donc, une fois la valeur dea
4 ou moins, il vérifie si a est - le résultat est votre réponse.C - 115
Cela utilise un 2 tableau de 30 octets (1 Go) comme bitmap pour garder une trace des numéros rencontrés au cours du cycle. Sous Linux, cela fonctionne réellement et efficacement, à condition que la surcharge de mémoire soit activée (ce qui est généralement le cas par défaut). En cas de surcharge, les pages du tableau sont allouées et remises à zéro à la demande.
Notez que la compilation de ce programme sous Linux utilise un gigaoctet de RAM.
la source
Haskell - 77
la source
Golfscript,
49 43 41 4039 caractèresChaque nombre heureux converge vers 1; chaque nombre malheureux converge vers un cycle contenant 4. En plus d'exploiter ce fait, c'est à peine joué au golf.
(Merci à Ventero, de la solution Ruby dont j'ai réussi une astuce et enregistré 6 caractères).
la source
eTeX, 153
Appelé comme
etex filename.tex 34*23 + 32/2 ?
(y compris le point d'interrogation à la fin). Les espaces dans l'expression n'ont pas d'importance.EDIT: je suis descendu à 123 , mais maintenant la sortie est dvi (si compilée avec
etex
) ou pdf (si compilée avecpdfetex
). Puisque TeX est un langage de composition, je suppose que c'est juste.la source
Python - 81 caractères
Une inspiration inspirée de Ventero et Peter Taylor.
la source
int(c)
queord(c)-48
....Javascript (
94928786)L'entrée est fournie en réglant a sur le nombre souhaité.
Crédits à mellamokb.
la source
n==4?h="Unh":n==1?h="H":a=n+""}alert(h+"appy")
||
pour|
.n==4?h...
. Changez pour faire ... tout en boucle avec conditionwhile(n>4)
. Utilisez alors cette déclaration finale à la place:alert(["H","Unh"][n>1?1:0]+"appy")
n=0;
Python (98, mais trop foiré pour ne pas partager)
Bien trop long pour être compétitif, mais peut-être bon pour rire. Il fait une évaluation "paresseuse" en Python. Vraiment assez similaire à l'entrée Haskell maintenant que j'y pense, juste sans aucun charme.
la source
dc - 47 caractères
Brève description:
I~
: Obtenez le quotient et le reste lorsque vous divisez par 10d*
.: Mettez le reste au carré.0<H
: Si le quotient est supérieur à 0, répétez récursivement.+
: Somme les valeurs lors de la réduction de la pile récursive.4<h
: Répéter le bit de somme des carrés lorsque la valeur est supérieure à 4.la source
Befunge, 109
Renvoie des valeurs correctes pour 1 <= n <= 10 9 -1.
la source
J, 56
Un verbe plutôt qu'un script autonome car la question est ambiguë.
Usage:
la source
Scala, 145 caractères
la source
(n*n)
plus court quen*n
, ou les espaces ne suffisent-ils pas pour séparer une expression if duelse
?def h(s: String):String=if(s=="1")"H"else if(s=="4")"Unh"else h(s.map(_.asDigit).map(a=>a*a).sum+"");print(h(readLine)+"appy")
J (50)
Je suis sûr qu'un J-er plus compétent que je ne peux le rendre encore plus court. Je suis relativement nouveau.
Nouveau et amélioré:
Plus récent et encore plus amélioré, grâce aux ɐɔıʇǝɥʇuʎs:
la source
("."0)
. Cela produit une erreur de classement, mais si je ne divise pas «Heureux» et que je laisse le résultat dans une case, je peux enregistrer un personnage.("."0)
est que les conjonctions s'appliquent à l'ensemble du train de verbes précédent auquel elles sont attachées, ce qui n'est pas ce que je veux. Si je dis+/@:("."0)@":
, c'est très différent de+/@:"."0@:
ce qui est en fait(+/@:".)"0@:
.'Unhappy';'Happy'
parUnhappy`Happy
.Python (91 caractères)
la source
Common Lisp 138
Plus lisible:
Serait plus court pour renvoyer juste "Heureux" ou "Malheureux" directement depuis le
(do)
, mais sans doute cela ne compterait pas comme un programme entierla source
K, 43
la source
Gelée , 17 octets (hors compétition *)
* Défi linguistique post-dates
Essayez-le en ligne!
Comment?
la source
Perl 5-77 octets
$ n est la valeur d'entrée
la source
05AB1E , 21 octets
Essayez-le en ligne ou vérifiez les 100 premiers cas de test .
Explication:
Chaque nombre entraînera éventuellement l'un
1
ou l' autre4
, nous bouclons donc indéfiniment et nous nous arrêtons dès que le nombre est inférieur à 5.Voir cette astuce de la mine de 05AB1E (section Comment utiliser le dictionnaire? ) Pour comprendre pourquoi
'ŽØ
est"happy"
.la source
C ++ 135, 2 lignes
Ceci est une version modifiée de celle que j'ai faite ici:
/programming/3543811/code-golf-happy-primes/3545056#3545056
la source
&999
faire? Et comment ça marche sij
c'est une valeur poubelle?if(j==999){n = 0;}else{n=n*n +i;}
, j ne devrait pas être une valeur poubelle, les globaux sont initialisés à zéro.Oui, ce défi a trois ans; oui, il a déjà une réponse gagnante; mais comme je m'ennuyais et que je faisais cela pour un autre défi, j'ai pensé que je pourrais le mettre ici. Surprise surprise, c'est long - et en ...
Java -
280264 octetsNon golfé:
la source
C # 94 octets
Pour tout nombre donné (as
int
),h()
renvoie la valeur correcte. Vous pouvez essayer le code sur .NetFiddle .Félicitations à l' utilisateur inconnu pour l' algorithme d' origine .
la source
Clojure,
10797 octetsMise à jour: suppression de la
let
liaison inutile .Original:
Première utilisation d'un imbriqué
for
: ola source
R,
11791 octets-16 octets grâce à Giuseppe
la source
strtoi
au lieu deas.numeric
etpaste
au lieu deas.character
, mais il existe une approche plus courte pour obtenir les chiffres . Si vous utilisez à la`if`(a-1,"unhappy","happy")
place cela devrait enregistrer un autre octet. Enfin, vous pouvez le rendre anonyme pour raser quelques octets supplémentaires.Perl 5 , 62 + 1 (
-p
) = 63 octetsEssayez-le en ligne!
la source
Python 2 , 71 octets
Essayez-le en ligne!
... ou, pour le même nombre d'octets:
Essayez-le en ligne!
la source
C: 1092 caractères
la source