Un número feliz se define mediante el siguiente proceso. Comenzando con cualquier número entero positivo, reemplace el número por la suma de los cuadrados de sus dígitos y repita el proceso hasta que el número sea igual a 1 (donde permanecerá), o se repite sin parar en un ciclo que no incluye 1. Esos números para los cuales este proceso termina en 1 son números felices, mientras que los que no terminan en 1 son números infelices (o números tristes). Dado un número, imprima si es feliz o infeliz.
Sample Inputs
7
4
13
Sample Outputs
Happy
Unhappy
Happy
Nota: Su programa no debería tomar más de 10 segundos para cualquier número por debajo de 1,000,000,000.
fuente
a <= 4
ya <= 1
. Si el ciclo tiene un 1, entonces es feliz, y si tiene un 4, entonces no es feliz. Vea la sección de wikipedia sobre el ciclo infeliz. Entonces, una vez que el valor dea
es 4 o menos, verifica si a es - el resultado de eso es su respuesta.C - 115
Utiliza una matriz de 2 30 bytes (1 GB) como mapa de bits para realizar un seguimiento de los números que se han encontrado en el ciclo. En Linux, esto realmente funciona, y de manera eficiente, siempre y cuando se habilite el sobrecompromiso de memoria (que generalmente es por defecto). Con el exceso de compromiso, las páginas de la matriz se asignan y se ponen a cero bajo demanda.
Tenga en cuenta que compilar este programa en Linux usa un gigabyte de RAM.
fuente
Haskell - 77
fuente
Golfscript,
49 43 41 4039 caracteresCada número feliz converge a 1; cada número infeliz converge a un ciclo que contiene 4. Además de explotar ese hecho, esto apenas se juega al golf.
(Gracias a Ventero, de cuya solución de Ruby he robado un truco y guardo 6 caracteres).
fuente
eTeX, 153
Llamado como
etex filename.tex 34*23 + 32/2 ?
(incluido el signo de interrogación al final). Los espacios en la expresión no importan.EDITAR: bajé a 123 , pero ahora la salida es dvi (si está compilada con
etex
) o pdf (si está compilada conpdfetex
). Dado que TeX es un lenguaje tipográfico, supongo que es justo.fuente
Python - 81 caracteres
Alguna inspiración tomada de Ventero y Peter Taylor.
fuente
int(c)
queord(c)-48
....Javascript (
94928786)La entrada se proporciona estableciendo a en el número deseado.
Créditos a mellamokb.
fuente
n==4?h="Unh":n==1?h="H":a=n+""}alert(h+"appy")
||
a|
.n==4?h...
. Cambiar para hacer ... mientras bucle con condiciónwhile(n>4)
. Luego use esta declaración final en su lugar:alert(["H","Unh"][n>1?1:0]+"appy")
n=0;
Python (98, pero demasiado desordenado para no compartir)
Demasiado largo para ser competitivo, pero tal vez bueno para reír. Hace una evaluación "perezosa" en Python. Realmente bastante similar a la entrada de Haskell ahora que lo pienso, simplemente sin nada de encanto.
fuente
dc - 47 caracteres
Breve descripción:
I~
: Obtenga el cociente y el resto al dividir por 10d*
.: Cuadre el resto.0<H
: Si el cociente es mayor que 0, repita recursivamente.+
: Suma los valores al reducir la pila recursiva.4<h
: Repite el bit de suma de cuadrados mientras el valor es mayor que 4.fuente
Befunge, 109
Devuelve los valores correctos para 1 <= n <= 10 9 -1.
fuente
J, 56
Un verbo en lugar de un guión independiente ya que la pregunta es ambigua.
Uso:
fuente
Scala, 145 caracteres
fuente
(n*n)
sería más corto comon*n
, o el espacio en blanco no es suficiente para separar una expresión if delelse
?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)
Estoy seguro de que es un J-er más competente de lo que puedo hacer esto aún más corto. Soy un nuevo pariente.
Nuevo y mejorado:
Más nuevo e incluso más mejorado, gracias a ɐɔıʇǝɥʇuʎs:
fuente
("."0)
. Eso produce un error de rango, pero si no divido 'Happy' y dejo el resultado en el recuadro, puedo guardar un personaje.("."0)
es que las conjunciones se aplican a todo el tren de verbos anterior al que están unidas, que no es lo que quiero. Si digo+/@:("."0)@":
, eso es muy diferente de lo+/@:"."0@:
que es en realidad(+/@:".)"0@:
.'Unhappy';'Happy'
conUnhappy`Happy
.Python (91 caracteres)
fuente
Lisp común 138
Más legible:
Sería más corto simplemente devolver "Feliz" o "Infeliz" directamente desde el
(do)
, pero podría decirse que eso no contaría como un programa completofuente
K, 43
fuente
Jalea , 17 bytes (no competidora *)
* Desafío post-fechas de idiomas
Pruébalo en línea!
¿Cómo?
fuente
Perl 5 - 77 Bytes
$ n es el valor de entrada
fuente
05AB1E , 21 bytes
Pruébelo en línea o verifique los primeros 100 casos de prueba .
Explicación:
Cada número eventualmente resultará en uno
1
o4
, por lo que hacemos un bucle indefinidamente y nos detenemos tan pronto como el número esté por debajo de 5.Ver este consejo 05AB1E mío (sección Cómo usar el diccionario? ) Para entender por qué
'ŽØ
es"happy"
.fuente
C ++ 135, 2 líneas
Esta es una versión modificada de la que hice aquí:
/programming/3543811/code-golf-happy-primes/3545056#3545056
fuente
&999
hacer? ¿Y cómo funciona sij
es un valor basura?if(j==999){n = 0;}else{n=n*n +i;}
, j no debería ser un valor basura, los globales son cero inicializados.Sí, este desafío tiene tres años; sí, ya tiene una respuesta ganadora; pero como estaba aburrido e hice esto para otro desafío, pensé que podría ponerlo aquí. Sorpresa sorpresa, es larga ... y en ...
Java -
280264 bytesSin golf:
fuente
C # 94 bytes
Para cualquier número dado (como
int
),h()
devolverá el valor correcto. Puede probar el código en .NetFiddle .Felicitaciones al usuario desconocido para el algoritmo original .
fuente
Clojure,
10797 bytesActualización: se eliminó el
let
enlace innecesario .Original:
Primera vez que usa un anidado
for
: ofuente
R,
11791 bytes-16 bytes gracias a Giuseppe
fuente
strtoi
lugar deas.numeric
y enpaste
lugar deas.character
, pero hay un enfoque más corto para obtener los dígitos . Si usa`if`(a-1,"unhappy","happy")
en su lugar eso debería guardar otro byte. Finalmente, puede hacer esto anónimo para ahorrar unos pocos bytes más.Perl 5 , 62 + 1 (
-p
) = 63 bytesPruébalo en línea!
fuente
Python 2 , 71 bytes
Pruébalo en línea!
... o, para el mismo número de bytes:
Pruébalo en línea!
fuente
C: 1092 caracteres
fuente