Un número narcisista es un número que es la suma de sus propios dígitos, cada uno elevado a la potencia del número de dígitos.
Por ejemplo, tome 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
El reto:
Su código debe recibir información del usuario y generar Verdadero o Falso dependiendo de si el número dado es un Número Narcisista.
No se requiere la comprobación de errores para cadenas de texto u otras entradas no válidas. 1 o 0 para la salida es aceptable. El código que simplemente genera una lista de números narcisistas, o verifica la entrada del usuario en una lista, no califica.
True
si es un número así, pero cualquier otra cosa (en este caso, el número en sí) si no?Respuestas:
APL (15)
Salidas
1
si es verdadero y0
si es falso.Explicación:
∆←⍞
: leer una línea (como caracteres), almacenar en∆
(⍎¨∆)*⍴∆
: evaluar cada personaje∆
y elevarlo al poder⍴∆
∆≡⍕+/
: ver si la entrada es igual a la representación de cadena de la suma de estosfuente
GolfScript, 16 caracteres
La entrada se debe dar en STDIN, la salida es 0 o 1 que indica un número no narcisista / narcisista.
Explicación del código:
fuente
Mathematica, 43 caracteres
fuente
Perl, 38 caracteres.
Una implementación bastante sencilla.
Aquí hay una versión ligeramente diferente que cabe en 35 caracteres:
Esta versión genera un valor falso si la entrada es narcisista; de lo contrario, genera un valor verdadero (aceptado por Perl). Se podría argumentar que esta versión hacia atrás se encuentra dentro de los límites de la descripción del desafío, pero después de reflexionar, decidí no hacerlo. No estoy tan desesperado por mejorar mi puntaje. Todavía.
fuente
echo -n 153 | perl -pe '…'
funcionará sin-l
.perl -pe'map$s+=$_**@y,@y=/./g;$_=$_==$s'
J, 23 caracteres
(1!:1)1
es entrada de teclado (devuelve una cadena).".
convierte la entrada a un número;"0
especifica un rango (dimensión) de 0, en otras palabras, toma cada carácter y lo convierte en un número.^
es la función de potencia y#
es la función de longitud, llevando así cada dígito a la potencia de la longitud de la cadena (equivalentemente, el número de dígitos).+/
es solo suma y=
compara la suma y el número.fuente
Rubí, 34 + 5 = 39
Con banderas de línea de comando
correr
Salidas verdadero o falso.
fuente
R,
7169665648¡Reducido en 8 bytes gracias a @Giuseppe ! La idea era realizar la división entera antes de la operación del módulo.
(3 años) versión anterior con la explicación correspondiente:
a<-scan()
toma un número (entero, real, ...) como entrada (153
por ejemplo, por ejemplo).i
se convierte en un vector que contiene 3 a 1 (el número de caracteres dea
ser 3).%%
está vectorizado, por lo quea%%10^i
significaa
módulo 1000, 100 y 10: por lo tanto, da153, 53, 3
.(a%%10^i)%/%10^(i-1)
es la división entera de ese vector por 100, 10, 1: por lo tanto1, 5, 3
,.Elevamos eso con el primer elemento
i
cuyo es el número de caracteres (aquí dígitos) dea
, es decir3
, dando así un vector1, 125, 27
que contienesum
y con el que se comparaa
.fuente
Python 3, 56 bytes
No muy ofuscado, pero es una solución simple.
fuente
[
y]
son innecesarios, y también puede soltar el espacio delantefor
, así que:sum(int(c)**len(s)for c in s)
s = input()
y otro moviendo esto a 2.7 dondeprint
no es una función.print
(por lo tanto, un carácter más) haría que esta sea una solución válida de Python 2.xy Python 3.x.PHP,
807466 caracteresSolución PHP muy sencilla:
Asume
error_reporting
que no incluye avisos, de lo contrario se necesitarán bastantes caracteres adicionales para inicializar$s=0;
y$i=0
.Thx @manatwork para acortar muchos caracteres.
fuente
<?for($i=0;$i<$l=strlen($a=$argv[1]);$i++){$s+=pow($a[$i],$l);}echo$s==$a;
Es más corto.<?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
Ejecución de muestra:
fuente
dc
, excepto por errores tipográficos frenéticos en un intento de escribircd
K,
2423Afeitado 1 char con reordenamiento
fuente
R, 53 bytes
La
gsub
expresión regular inserta espacios entre caracteres, de modo que lascan
función podrá leer el número en un vector de dígitos.fuente
Kona, 18
...
fuente
Powershell,
7563626058Editar: actualizado según el comentario de @ Iszi
(nota: esto cuenta con$x
no existente)Editar: Se agregaron los cambios de @ Danko.
5856 caracteresSi la entrada está limitada a 10 dígitos (incluye todos los int32)
fuente
$x
y utilizándola+=
para hacer la suma en lugar demeasure -sum
luego hacer la prueba$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 reemplazó''
. Tomé el script original en Excel para verificarlo nuevamente=LEN("($x=$n=read-host)-split''|%{$x-=[math]::pow($_,$n.length)};!$x")
y obtuve 62 también. Por supuesto, siempre podríamos contarlo manualmente, pero ¿quién lo hace realmente?Python 2.x - 51
El mismo concepto que la solución de crazedgremlin para Python 3.x:
fuente
C -
9793 caracteresCon sangría:
fuente
int
para variables globales.argc
.-lm
en tiempo de compilación recuento +1 byte?-lm
indicador no es necesario para los compiladores C89.Delphi - 166
Con sangría
fuente
05AB1E , 7 bytes (no competitivos)
Pruébalo en línea!
-2 bytes gracias a @daHugLenny
fuente
§1ô
conS
Haskell 2010 - 76 personajes
fuente
Awk:
4039 caracteresEjecución de muestra:
fuente
Bash, 64 caracteres
a = $ 1; p = $ {# a}; para ((; a> 0; a / = 10)); do s = $ ((s + (a% 10) ** p)); hecho; echo $ ( (s == $ 1))fuente
for
que perder su separada;
:for((a=$1;a>0;a/=10));do s=$[s+(a%10)**${#1}];done;echo $[s==$1]
.for
uno de los personajes más puede acortarse:for((a=$1;a>0;s+=(a%10)**${#1},a/=10));do :; done;echo $[s==$1]
.Lua (101 caracteres)
Lua no es conocido por ser conciso, pero fue divertido intentarlo de todos modos.
Mejoras bienvenidas.
fuente
for n in io.lines()do [...]end
conn=io.read()
guarda algunos bytes ( TIO ).JavaScript -
7058 caracteresfuente
true
para mí, independientemente de la entradaJava - 84 bytes
Versión no lambda: 101 bytes:
Llamado así:
Devoluciones:
fuente
a,l->
funciona exactamente igual.(a,l)->
puede sera->l->
ybyte
puede serint
:a->l->{int s=0;for(int c:a.getBytes())s+=Math.pow(c-48,l);return a.equals(""+s);}
Japt ,
1497 bytesPruébalo en línea
Explicación
Entrada implícita de entero
U
.Convierta
U
a una matriz de dígitos (ì
), páselo a través de una función y vuelva a convertirlo en un entero después.Reduzca mediante la suma (
x
), elevando cada elemento a la potencia (p
) de la longitud (Ê
) de la matriz en el proceso.Compruebe si el resultado es estrictamente igual a
U
.fuente
¥U¬®n pUlÃx
que funcionaría para 11 bytes;)F # - 92 caracteres
fuente
Lisp común -
116102 caracteresFormateado:
fuente
Smalltalk -
10299 caracteresEn el espacio de trabajo, envíe
value:
con el número e imprímalo.fuente
C #, 117
fuente
Haskell,
6866 bytesUso:
fuente