Um número narcisista é um número que é a soma de seus próprios dígitos, cada um deles elevado à potência do número de dígitos.
Por exemplo, use 153 (3 dígitos):
1 3 + 5 3 + 3 3 = 1 + 125 + 27 = 153
1634:
1 4 + 6 4 + 3 4 + 4 4 = 1 + 1296 + 81 + 256 = 1634
O desafio:
Seu código deve receber a entrada do usuário e gerar True ou False, dependendo de o número fornecido ser um número narcisista.
A verificação de erros para cadeias de texto ou outras entradas inválidas não é necessária. 1 ou 0 para a saída é aceitável. O código que simplesmente gera uma lista de Narcisistic Numbers ou verifica a entrada do usuário em uma lista não se qualifica.
True
se for um número assim, mas qualquer outra coisa (nesse caso, o próprio número), se não?Respostas:
APL (15)
Saídas
1
se true e0
false.Explicação:
∆←⍞
: leia uma linha (como caracteres), armazene em∆
(⍎¨∆)*⍴∆
: avaliar cada personagem∆
e elevá-lo ao poder⍴∆
∆≡⍕+/
: veja se a entrada é igual à representação de string da soma dessesfonte
GolfScript, 16 caracteres
A entrada deve ser fornecida no STDIN, a saída é 0 ou 1, indicando um número não-narcísico / narcísico.
Explicação do código:
fonte
Mathematica, 43 caracteres
fonte
Perl, 38 caracteres
Uma implementação bastante direta.
Aqui está uma versão ligeiramente diferente que cabe em 35 caracteres:
Esta versão gera um valor falso se a entrada é narcisista, caso contrário, gera um valor verdadeiro (aceito por Perl). Pode-se argumentar que esta versão reversa se enquadra nos limites da descrição do desafio, mas, após reflexão, decidi não fazê-lo. Não estou tão desesperada para melhorar minha pontuação. Ainda.
fonte
echo -n 153 | perl -pe '…'
vai funcionar sem-l
.perl -pe'map$s+=$_**@y,@y=/./g;$_=$_==$s'
J, 23 caracteres
(1!:1)1
é a entrada do teclado (retornando uma sequência).".
converte entrada em um número;"0
especifica uma classificação (dimensão) de 0, em outras palavras, pegando cada caractere e convertendo-o em um número.^
é a função de potência e#
é a função de comprimento, levando cada dígito à potência do comprimento da sequência (equivalentemente, o número de dígitos).+/
é apenas soma e=
está comparando a soma e o número.fonte
Ruby, 34 + 5 = 39
Com sinalizadores de linha de comando
Corre
Saídas verdadeiras ou falsas.
fonte
R,
7169665648Reduzido em 8 bytes graças a @ Giuseppe ! A idéia era realizar a divisão inteira antes da operação do módulo.
Versão antiga (de 3 anos) com explicação correspondente:
a<-scan()
recebe um número (inteiro, real, ...) como entrada (digamos,153
por exemplo).i
torna-se um vetor contendo 3 a 1 (o número de caracteresa
sendo 3).%%
é vetorizado, entãoa%%10^i
significaa
módulo 1000, 100 e 10: portanto, dá153, 53, 3
.(a%%10^i)%/%10^(i-1)
é a divisão inteira desse vetor por 100, 10, 1: portanto1, 5, 3
,.Nós elevamos isso com o primeiro elemento do
i
qual é o número de caracteres (aqui dígitos) dea
, ou seja3
, fornecendo um vetor1, 125, 27
que contém o qual nóssum
e o comparaa
.fonte
Python 3, 56 bytes
Não muito ofuscado, mas uma solução simples.
fonte
[
e]
são desnecessários, e você pode soltar o espaço em frentefor
também, então:sum(int(c)**len(s)for c in s)
s = input()
e outro movendo-o para 2,7, ondeprint
não é uma função.print
(daí um caractere a mais) tornaria essa uma solução válida para Python 2.xe Python 3.x.PHP,
807466 caracteresSolução PHP muito simples:
Ele assume
error_reporting
que não inclui avisos, caso contrário, serão necessários alguns caracteres extras para inicializar$s=0;
e$i=0
.Thx @manatwork para encurtar muitos caracteres.
fonte
<?for($i=0;$i<$l=strlen($a=$argv[1]);$i++){$s+=pow($a[$i],$l);}echo$s==$a;
é mais curto.<?for(;$i<$l=strlen($a=$argv[1]);)$s+=pow($a[$i++],$l);echo$s==$a;
.for(;$i<$l=strlen($a=$argn);)$s+=$a[$i++]**$l;echo$s==$a;
Dc: 48 caracteres
Exemplo de execução:
fonte
dc
, salvo erros tipográficos frenéticos em tentativa de escrevercd
K,
24231 char raspado com reordenação
fonte
R, 53 bytes
O
gsub
regex insere espaços entre os caracteres, para que ascan
função possa ler o número em um vetor de dígitos.fonte
Kona, 18
...
fonte
Powershell,
7563626058Edit: Atualizado de acordo com o comentário de @ Iszi
(nota: isso conta para$x
não existir)Edit: Adicionado as alterações de @ Danko.
5856 caracteresSe a entrada for limitada a 10 dígitos (inclui todos os int32)
fonte
$x
e usando+=
a soma em vez demeasure -sum
testar$x-eq$n
.($x=$n=read-host)-split''|%{$x-=[math]::pow($_,$n.length)};!$x
'($x=$n=read-host)-split""|%{$x-=[math]::pow($_,$n.length)};!$x'.length
''
que você substituiu''
. Levei o script original para o Excel para verificar novamente=LEN("($x=$n=read-host)-split''|%{$x-=[math]::pow($_,$n.length)};!$x")
e consegui 62 também. Claro, sempre poderíamos contar manualmente - mas quem realmente faz isso?Python 2.x - 51
Mesmo conceito da solução do crazedgremlin para o Python 3.x:
fonte
C -
9793 caracteresCom recuo:
fonte
int
para variáveis globais.argc
.-lm
tempo de compilação não deveria ter que contar com +1 byte?-lm
sinalizador não é necessário para os compiladores C89.Delphi - 166
Com recuo
fonte
05AB1E , 7 bytes (não concorrente)
Experimente online!
-2 bytes graças a @daHugLenny
fonte
§1ô
porS
Haskell 2010 - 76 caracteres
fonte
Awk:
4039 caracteresExemplo de execução:
fonte
Bash, 64 caracteres
a = $ 1; p = $ {# a}; para ((; a> 0; a / = 10)); do s = $ ((s + (a% 10) ** p)); concluído; echo $ ( (s == $ 1))fonte
for
poupar a sua separado;
:for((a=$1;a>0;a/=10));do s=$[s+(a%10)**${#1}];done;echo $[s==$1]
.for
mais um personagem pode ser encurtado:for((a=$1;a>0;s+=(a%10)**${#1},a/=10));do :; done;echo $[s==$1]
.Lua (101 caracteres)
Lua não é conhecida por ser concisa, mas foi divertido tentar de qualquer maneira.
Melhorias são bem-vindas.
fonte
for n in io.lines()do [...]end
porn=io.read()
salva alguns bytes ( TIO ).JavaScript -
7058 caracteresfonte
true
para mim, independentemente de entradaJava - 84 bytes
Versão não lambda: 101 bytes:
Chamado assim:
Devoluções:
fonte
a,l->
funciona exatamente da mesma maneira.(a,l)->
pode sera->l->
ebyte
pode serint
:a->l->{int s=0;for(int c:a.getBytes())s+=Math.pow(c-48,l);return a.equals(""+s);}
Japonês ,
1497 bytesExperimente online
Explicação
Entrada implícita de número inteiro
U
.Converta
U
para uma matriz de dígitos (ì
), passe-a por uma função e converta novamente para um número inteiro depois.Reduza por adição (
x
), elevando cada elemento à potência (p
) do comprimento (Ê
) da matriz no processo.Verifique se o resultado é estritamente igual a
U
.fonte
¥U¬®n pUlÃx
que funcionaria para 11 bytes;) #F # - 92 caracteres
fonte
Lisp comum -
116102 caracteresFormatado:
fonte
Smalltalk -
10299 caracteresNa área de trabalho, envie
value:
com o número e imprima.fonte
C #, 117
fonte
Haskell,
6866 bytesUso:
fonte