Eine Glückszahl wird durch den folgenden Prozess definiert. Beginnen Sie mit einer positiven ganzen Zahl, ersetzen Sie die Zahl durch die Summe der Quadrate ihrer Ziffern und wiederholen Sie den Vorgang, bis die Zahl gleich 1 ist (wo sie verbleibt), oder sie wiederholt sich endlos in einem Zyklus, der nicht 1 enthält. Diese Zahlen für die dieser Prozess mit 1 endet, sind glückliche Zahlen, während diejenigen, die nicht mit 1 enden, unglückliche Zahlen (oder traurige Zahlen) sind. Gegeben, eine Zahl drucken, ob es glücklich oder unglücklich ist.
Sample Inputs
7
4
13
Sample Outputs
Happy
Unhappy
Happy
Hinweis: Ihr Programm sollte für Zahlen unter 1.000.000.000 nicht länger als 10 Sekunden dauern.
quelle
a <= 4
unda <= 1
. Wenn der Zyklus eine 1 enthält, ist er glücklich, und wenn er eine 4 enthält, ist er nicht glücklich. Siehe den Wikipedia-Abschnitt über den unglücklichen Zyklus. Sobald der Werta
4 oder weniger ist, prüft er, ob a ist - das Ergebnis ist Ihre Antwort.C - 115
Dies verwendet ein 2 30- Byte-Array (1 GB) als Bitmap, um zu verfolgen, welche Zahlen im Zyklus aufgetreten sind. Unter Linux funktioniert dies tatsächlich und effizient, vorausgesetzt, die Speicherüberlastung ist aktiviert (was normalerweise die Standardeinstellung ist). Bei einem Overcommitting werden Seiten des Arrays bei Bedarf zugewiesen und auf Null gesetzt.
Beachten Sie, dass beim Kompilieren dieses Programms unter Linux ein Gigabyte RAM benötigt wird.
quelle
Haskell - 77
quelle
Golfscript,
49 43 41 4039 ZeichenJede glückliche Zahl konvergiert zu 1; Jede unglückliche Zahl konvergiert zu einem Zyklus, der 4 enthält. Abgesehen davon, dass diese Tatsache ausgenutzt wird, wird hier kaum Golf gespielt.
(Dank an Ventero, von dessen Ruby-Lösung ich einen Trick geklaut und 6 Zeichen gespart habe).
quelle
eTeX, 153
Genannt als
etex filename.tex 34*23 + 32/2 ?
(einschließlich des Fragezeichens am Ende). Leerzeichen im Ausdruck spielen keine Rolle.EDIT: Ich bin auf 123 gekommen , aber jetzt ist die Ausgabe dvi (wenn kompiliert mit
etex
) oder pdf (wenn kompiliert mitpdfetex
). Da TeX eine Schriftsprache ist, halte ich das für fair.quelle
Python - 81 Zeichen
Inspiration von Ventero und Peter Taylor.
quelle
int(c)
alsord(c)-48
....Javascript (
94928786)Die Eingabe erfolgt durch Setzen von a auf die gewünschte Zahl.
Dank an mellamokb.
quelle
n==4?h="Unh":n==1?h="H":a=n+""}alert(h+"appy")
||
habe|
.n==4?h...
. Ändern, um ... while-Schleife mit Bedingung auszuführenwhile(n>4)
. Verwenden Sie stattdessen diese abschließende Aussage:alert(["H","Unh"][n>1?1:0]+"appy")
n=0;
Python (98, aber zu durcheinander, um es nicht zu teilen)
Viel zu lange, um wettbewerbsfähig zu sein, aber vielleicht gut zum Lachen. In Python wird "faul" ausgewertet. Wirklich ziemlich ähnlich dem Haskell-Eintrag, jetzt, wo ich darüber nachdenke, nur ohne den Charme.
quelle
DC - 47 Zeichen
Kurze Beschreibung:
I~
: Ermitteln Sie den Quotienten und den Rest bei der Division durch 10d*
.: Quadrieren Sie den Rest.0<H
: Wenn der Quotient größer als 0 ist, rekursiv wiederholen.+
: Summiere die Werte beim Verkleinern des rekursiven Stapels.4<h
: Wiederholen Sie das Quadratsummenbit, während der Wert größer als 4 ist.quelle
Befunge, 109
Gibt korrekte Werte für 1 <= n <= 10 9 -1 zurück.
quelle
J, 56
Ein Verb und kein eigenständiges Skript, da die Frage nicht eindeutig ist.
Verwendung:
quelle
Scala, 145 Zeichen
quelle
(n*n)
kürzer alsn*n
, oder reicht Leerzeichen nicht aus, um einen if-Ausdruck vom zu trennenelse
?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)
Ich bin sicher ein kompetenterer J-er, als ich das noch kürzer machen kann. Ich bin ein relativer Neuling.
Neu und verbessert:
Neu und noch besser dank ʇǝɥʇıɐɔuʇǝɥʇs:
quelle
("."0)
. Das führt zu einem Rangfehler, aber wenn ich nicht 'Happy' teile und das Ergebnis in der Box lasse, kann ich einen Charakter speichern.("."0)
ist, dass Konjunktionen für die gesamte vorhergehende Reihe von Verben gelten, an die sie angehängt sind, was ich nicht möchte. Wenn ich sage+/@:("."0)@":
, ist das ganz anders als das+/@:"."0@:
, was eigentlich ist(+/@:".)"0@:
.'Unhappy';'Happy'
mitUnhappy`Happy
.Python (91 Zeichen)
quelle
Common Lisp 138
Besser lesbar:
Wäre kürzer, wenn Sie einfach "Happy" oder "Unhappy" aus dem zurückgeben würden
(do)
, aber das würde wohl nicht als ganzes Programm geltenquelle
K, 43
quelle
Gelee , 17 Bytes (nicht konkurrierend *)
* Herausforderung nach den Terminen
Probieren Sie es online!
Wie?
quelle
Perl 5 - 77 Bytes
$ n ist der Eingabewert
quelle
05AB1E , 21 Bytes
Probieren Sie es online aus oder überprüfen Sie die ersten 100 Testfälle .
Erläuterung:
Jede Zahl wird irgendwann entweder
1
oder ergeben4
, so dass wir eine Endlosschleife ausführen und anhalten, sobald die Zahl unter 5 liegt.Sehen Sie diese 05AB1E Spitze von mir (Abschnitt Wie das Wörterbuch benutzen? ) Zu verstehen , warum
'ŽØ
ist"happy"
.quelle
C ++ 135, 2 Zeilen
Dies ist eine modifizierte Version von der, die ich hier gemacht habe:
/programming/3543811/code-golf-happy-primes/3545056#3545056
quelle
&999
tun? Und wie funktioniert es, wennj
ein Müllwert ist?if(j==999){n = 0;}else{n=n*n +i;}
, j sollte kein Müllwert sein, Globals werden mit Null initialisiert.Ja, diese Herausforderung hat drei Jahre; Ja, es gibt bereits eine Gewinnerantwort. aber da ich gelangweilt war und dies für eine andere Herausforderung tat, dachte ich, ich könnte es hier aufstellen. Überraschung Überraschung, es ist lang - und in ...
Java -
280264 BytesUngolfed:
quelle
C # 94 Bytes
Gibt für eine bestimmte Zahl (as
int
)h()
den korrekten Wert zurück. Sie können den Code auf .NetFiddle ausprobieren .Lob an den Benutzer unbekannt für den ursprünglichen Algorithmus .
quelle
Clojure,
10797 BytesUpdate: Unnötig entfernt
let
Bindung entfernt.Original:
Zum ersten Mal mit einem verschachtelten
for
: oquelle
R
11791 Bytes-16 Bytes dank Giuseppe
quelle
strtoi
anstelle vonas.numeric
undpaste
anstelle vonas.character
, aber es gibt einen kürzeren Ansatz, um die Ziffern zu erhalten . Wenn Sie`if`(a-1,"unhappy","happy")
stattdessen verwenden, sollte das ein anderes Byte speichern. Schließlich können Sie dies anonymisieren, um ein paar weitere Bytes zu entfernen.Perl 5 , 62 + 1 (
-p
) = 63 BytesProbieren Sie es online!
quelle
Python 2 , 71 Bytes
Probieren Sie es online!
... oder bei gleicher Byteanzahl:
Probieren Sie es online!
quelle
C: 1092 Zeichen
quelle