Szczęśliwa liczba jest definiowana przez następujący proces. Zaczynając od dodatniej liczby całkowitej, zamień liczbę na sumę kwadratów jej cyfr i powtarzaj proces, aż liczba wyniesie 1 (gdzie pozostanie), lub zapętli się bez końca w cyklu, który nie obejmuje 1. Te liczby dla których ten proces kończy się na 1 są liczbami szczęśliwymi, podczas gdy te, które nie kończą się na 1 są liczbami nieszczęśliwymi (lub liczbami smutnymi). Biorąc pod uwagę wydruk numeru, czy jest szczęśliwy czy nieszczęśliwy.
Sample Inputs
7
4
13
Sample Outputs
Happy
Unhappy
Happy
Uwaga: Twój program nie powinien trwać dłużej niż 10 sekund dla dowolnej liczby poniżej 1 000 000 000.
źródło
a <= 4
ia <= 1
. Jeśli cykl ma 1, to jest szczęśliwy, a jeśli ma 4, to nie jest szczęśliwy. Zobacz sekcję wikipedii o nieszczęśliwym cyklu. Kiedy więc wartośća
wynosi 4 lub mniej, sprawdza, czy jest - wynikiem jest twoja odpowiedź.C - 115
Wykorzystuje tablicę 2 30- bajtową (1 GB) jako mapę bitową do śledzenia, które liczby napotkano w cyklu. W systemie Linux działa to faktycznie i wydajnie, pod warunkiem, że włączone jest nadmierne zaangażowanie pamięci (co zwykle jest domyślnie). Przy nadmiernym zaangażowaniu strony tablicy są przydzielane i zerowane na żądanie.
Pamiętaj, że kompilacja tego programu w systemie Linux wymaga gigabajta pamięci RAM.
źródło
Haskell - 77
źródło
Golfscript,
49 43 41 4039 znakówKażda szczęśliwa liczba jest zbieżna do 1; każda nieszczęśliwa liczba zbiega się w cykl zawierający 4. Poza wykorzystaniem tego faktu, jest to ledwo w golfa.
(Dzięki Ventero, z którego rozwiązania Ruby stworzyłem lewę i zaoszczędziłem 6 znaków).
źródło
eTeX, 153
Nazywany jako
etex filename.tex 34*23 + 32/2 ?
(w tym znak zapytania na końcu). Spacje w wyrażeniu nie mają znaczenia.EDYCJA: przeszedłem do 123 , ale teraz wyjście to dvi (jeśli skompilowane z
etex
) lub pdf (jeśli skompilowane zpdfetex
). Ponieważ TeX jest językiem składanym, to chyba sprawiedliwe.źródło
Python - 81 znaków
Inspiracje zaczerpnięte z Ventero i Petera Taylora.
źródło
int(c)
niż niżord(c)-48
...JavaScript (
94928786)Wprowadzanie odbywa się poprzez ustawienie a na żądaną liczbę.
Kredyty dla mellamokb.
źródło
n==4?h="Unh":n==1?h="H":a=n+""}alert(h+"appy")
||
na|
.n==4?h...
. Zmień na czyn ... podczas pętli z warunkiemwhile(n>4)
. Zamiast tego użyj tego końcowego oświadczenia:alert(["H","Unh"][n>1?1:0]+"appy")
n=0;
Python (98, ale zbyt popsuty, by go nie udostępniać)
Zbyt długo, by być konkurencyjnym, ale być może dobrym do śmiechu. Dokonuje „leniwej” oceny w Pythonie. Naprawdę całkiem podobny do wpisu Haskell, kiedy o tym myślę, tylko bez uroku.
źródło
dc - 47 znaków
Krótki opis:
I~
: Uzyskaj iloraz i resztę, dzieląc przez 10d*
.: Kwadrat reszty.0<H
: Jeśli iloraz jest większy niż 0, powtarzaj rekurencyjnie.+
: Zsumuj wartości podczas zmniejszania stosu rekurencyjnego.4<h
: Powtórz bit sumy kwadratów, gdy wartość jest większa niż 4.źródło
Befunge, 109
Zwraca poprawne wartości dla 1 <= n <= 10 9 -1.
źródło
J, 56
Czasownik zamiast samodzielnego skryptu, ponieważ pytanie jest dwuznaczne.
Stosowanie:
źródło
Scala, 145 znaków
źródło
(n*n)
byłby krótszyn*n
, czy białe znaki nie wystarczają do oddzielenia wyrażenia if odelse
?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)
Jestem pewien, że bardziej kompetentny J-er, niż mogę to uczynić jeszcze krótszym. Jestem względnym nowicjuszem.
Nowe i ulepszone:
Nowsze i jeszcze bardziej ulepszone dzięki ɐɔıʇǝɥʇuʎs:
źródło
("."0)
. Powoduje to błąd rangi, ale jeśli nie podzielę „Szczęśliwego” i nie zostawię wyniku w polu, mogę zapisać postać.("."0)
jest to, że spójniki mają zastosowanie do całego poprzedzającego zestawu czasowników, do których są dołączone, co nie jest tym, czego chcę. Jeśli powiem+/@:("."0)@":
, to bardzo różni się od tego+/@:"."0@:
, co jest w rzeczywistości(+/@:".)"0@:
.'Unhappy';'Happy'
jeUnhappy`Happy
.Python (91 znaków)
źródło
Common Lisp 138
Bardziej czytelny:
Krótsze byłoby po prostu zwrócenie „Szczęśliwego” lub „Nieszczęśliwego” od razu
(do)
, ale prawdopodobnie nie byłoby to liczone jako cały programźródło
K, 43
źródło
Galaretka , 17 bajtów (niekonkurencyjna *)
* Wyzwanie po dacie językowej
Wypróbuj online!
W jaki sposób?
źródło
Perl 5 - 77 bajtów
$ n jest wartością wejściową
źródło
05AB1E , 21 bajtów
Wypróbuj online lub sprawdź pierwsze 100 przypadków testowych .
Wyjaśnienie:
Każda liczba ostatecznie spowoduje albo,
1
albo4
, więc zapętlamy w nieskończoność i zatrzymamy się, gdy tylko liczba spadnie poniżej 5.Zobacz moją wskazówkę 05AB1E (sekcja Jak korzystać ze słownika? ), Aby zrozumieć, dlaczego tak
'ŽØ
jest"happy"
.źródło
C ++ 135, 2 linie
To jest zmodyfikowana wersja tej, którą tutaj zrobiłem:
/programming/3543811/code-golf-happy-primes/3545056#3545056
źródło
&999
zrobić? I jak to działa, jeślij
wartość śmieci jest wartością?if(j==999){n = 0;}else{n=n*n +i;}
, j nie powinno być wartością śmieciową, globały są inicjowane na zero.Tak, wyzwanie to trwa trzy lata; tak, ma już odpowiedź zwycięzcy; ale ponieważ nudziłem się i robiłem to dla kolejnego wyzwania, pomyślałem, że mogę to tutaj postawić. Niespodzianka niespodzianka, jej długi - i ...
Java -
280264 bajtówNie golfowany:
źródło
C # 94 bajtów
Dla dowolnej liczby (as
int
),h()
zwróci prawidłową wartość. Możesz wypróbować kod na .NetFiddle .Uznanie dla użytkownika nieznane dla oryginalnego algorytmu .
źródło
Clojure,
10797 bajtówAktualizacja: Usunięto niepotrzebne
let
powiązanie.Oryginalny:
Pierwszy raz używając zagnieżdżonego
for
: oźródło
R,
11791 bajtów-16 bajtów dzięki Giuseppe
źródło
strtoi
zamiastas.numeric
ipaste
zamiastas.character
, ale istnieje krótsze podejście do uzyskania cyfr . Jeśli użyjesz`if`(a-1,"unhappy","happy")
zamiast tego, powinien zapisać kolejny bajt. Na koniec możesz uczynić to anonimowym, aby zgolić jeszcze kilka bajtów.Perl 5 , 62 + 1 (
-p
) = 63 bajtyWypróbuj online!
źródło
Python 2 , 71 bajtów
Wypróbuj online!
... lub dla tej samej liczby bajtów:
Wypróbuj online!
źródło
C: 1092 znaków
źródło