Um número feliz é definido pelo seguinte processo. Começando com qualquer número inteiro positivo, substitua o número pela soma dos quadrados de seus dígitos e repita o processo até que o número seja igual a 1 (onde permanecerá) ou faça um loop infinito em um ciclo que não inclui 1. Esses números para os quais esse processo termina em 1, são números felizes, enquanto aqueles que não terminam em 1 são números infelizes (ou tristes). Dada uma impressão numérica, seja feliz ou infeliz.
Sample Inputs
7
4
13
Sample Outputs
Happy
Unhappy
Happy
Nota: Seu programa não deve levar mais de 10 segundos para qualquer número abaixo de 1.000.000.000.
fonte
a <= 4
ea <= 1
. Se o ciclo tiver 1 nele, ele será feliz e, se houver 4, não será feliz. Veja a seção da Wikipedia sobre o ciclo infeliz. Assim, quando o valor dea
for 4 ou menos, ele verifica se a é - o resultado é a sua resposta.C - 115
Isso usa uma matriz de 2 30 bytes (1 GB) como um bitmap para acompanhar quais números foram encontrados no ciclo. No Linux, isso realmente funciona, e com eficiência, desde que a confirmação excessiva de memória esteja ativada (o que geralmente ocorre por padrão). Com o comprometimento excessivo, as páginas da matriz são alocadas e zeradas sob demanda.
Observe que a compilação deste programa no Linux usa um gigabyte de RAM.
fonte
Haskell - 77
fonte
Golfscript,
49 43 41 4039 caracteresTodo número feliz converge para 1; todo número infeliz converge para um ciclo contendo 4. Além de explorar esse fato, isso quase não é praticado.
(Graças a Ventero, de cuja solução Ruby, fiz um truque e salvei 6 caracteres).
fonte
eTeX, 153
Chamado como
etex filename.tex 34*23 + 32/2 ?
(incluindo o ponto de interrogação no final). Os espaços na expressão não importam.Edição: Eu desceu para 123 , mas agora a saída é dvi (se compilado com
etex
) ou pdf (se compilado compdfetex
). Como o TeX é uma linguagem tipográfica, acho que é justo.fonte
Python - 81 caracteres
Alguma inspiração tirada de Ventero e Peter Taylor.
fonte
int(c)
queord(c)-48
....Javascript (
94928786)A entrada é fornecida configurando a para o número desejado.
Créditos para mellamokb.
fonte
n==4?h="Unh":n==1?h="H":a=n+""}alert(h+"appy")
||
para|
.n==4?h...
. Mude para fazer ... enquanto loop com condiçãowhile(n>4)
. Em seguida, use esta declaração final em vez disso:alert(["H","Unh"][n>1?1:0]+"appy")
n=0;
Python (98, mas muito bagunçado para não compartilhar)
Caminho, tempo demais para ser competitivo, mas talvez seja bom para rir. Faz avaliação "preguiçosa" em Python. Muito parecido com a entrada de Haskell agora que penso nisso, apenas sem nenhum charme.
fonte
dc - 47 caracteres
Descrição breve:
I~
: Obtenha o quociente e o restante ao dividir por 10d*
.: calcule o quadrado do restante.0<H
: Se o quociente for maior que 0, repita recursivamente.+
: Soma os valores ao reduzir a pilha recursiva.4<h
: Repita o bit da soma dos quadrados enquanto o valor for maior que 4.fonte
Befunge, 109
Retorna os valores corretos para 1 <= n <= 10 9 -1.
fonte
J, 56
Um verbo em vez de um script independente, pois a pergunta é ambígua.
Uso:
fonte
Scala, 145 caracteres
fonte
(n*n)
seria mais curto comon*n
, ou o espaço em branco não é suficiente para separar uma expressão if doelse
?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)
Tenho certeza de que um J-er mais competente do que posso tornar isso ainda mais curto. Eu sou um novato relativo.
Novo e melhorado:
Mais novo e ainda mais aprimorado, graças ao ɐɔıʇǝɥʇuʎs:
fonte
("."0)
. Isso produz um erro de classificação, mas se eu não dividir 'Feliz' e deixar o resultado em caixa, posso salvar um personagem.("."0)
é que as conjunções se aplicam a todo o conjunto anterior de verbos aos quais estão ligados, o que não é o que eu quero. Se eu digo+/@:("."0)@":
, isso é muito diferente do+/@:"."0@:
que é realmente(+/@:".)"0@:
.'Unhappy';'Happy'
porUnhappy`Happy
.Python (91 caracteres)
fonte
Lisp comum 138
Mais legível:
Seria mais curto retornar apenas "Feliz" ou "Infeliz"
(do)
, mas sem dúvida isso não conta como um programa inteirofonte
K, 43
fonte
Gelatina , 17 bytes (não concorrente *)
* Desafio pós-data do idioma
Experimente online!
Quão?
fonte
Perl 5 - 77 bytes
$ n é o valor de entrada
fonte
05AB1E , 21 bytes
Experimente online ou verifique os 100 primeiros casos de teste .
Explicação:
Cada número acabará resultando em um
1
ou4
, portanto, fazemos um loop indefinidamente e paramos assim que o número estiver abaixo de 5.Veja esta dica 05AB1E meu (seção Como usar o dicionário? ) Para entender por que
'ŽØ
é"happy"
.fonte
C ++ 135, 2 linhas
Esta é uma versão modificada da que eu fiz aqui:
/programming/3543811/code-golf-happy-primes/3545056#3545056
fonte
&999
fazer? E como funciona sej
é um valor de lixo?if(j==999){n = 0;}else{n=n*n +i;}
, j não deve ser um valor de lixo, os globais são zero inicializados.Sim, esse desafio tem três anos; Sim, ele já tem uma resposta vencedora; mas como eu estava entediado e fiz isso por outro desafio, pensei em colocá-lo aqui. Surpresa surpresa, é longa - e ...
Java -
280264 bytesUngolfed:
fonte
Bytes C # 94
Para qualquer número (as
int
),h()
retornará o valor correto. Você pode tentar o código no .NetFiddle .Parabéns ao usuário desconhecido para o algoritmo original .
fonte
Clojure,
10797 bytesAtualização:
let
ligação desnecessária removida .Original:
Primeira vez usando um aninhado
for
: ofonte
R,
11791 bytes-16 bytes graças a Giuseppe
fonte
strtoi
vez deas.numeric
e empaste
vez deas.character
, mas existe uma abordagem mais curta para obter os dígitos . Se você usar,`if`(a-1,"unhappy","happy")
isso deve salvar outro byte. Por fim, você pode tornar esse anonimato para economizar mais alguns bytes.Perl 5 , 62 + 1 (
-p
) = 63 bytesExperimente online!
fonte
Python 2 , 71 bytes
Experimente online!
... ou, para a mesma contagem de bytes:
Experimente online!
fonte
C: 1092 caracteres
fonte