Un nombre narcissique est un nombre qui est la somme de ses propres chiffres, chacun élevé à la puissance du nombre de chiffres.
Par exemple, prenons 153 (3 chiffres):
1 3 + 5 3 + 3 3 = 1 + 125 + 27 = 153
1634:
1 4 + 6 4 + 3 4 + 4 4 = 1 + 1296 + 81 + 256 = 1634
Le défi:
Votre code doit recevoir une entrée de l'utilisateur et générer une valeur True ou False selon que le nombre donné est un nombre narcissique.
La vérification d'erreur pour les chaînes de texte ou d'autres entrées non valides n'est pas requise. 1 ou 0 pour la sortie est acceptable. Le code qui génère simplement une liste de nombres narcissiques ou vérifie la saisie de l'utilisateur par rapport à une liste n'est pas admissible.
True
si c'est un nombre, mais rien d'autre (dans ce cas, le nombre lui-même) sinon?Réponses:
APL (15)
Sorties
1
si vrai et0
si faux.Explication:
∆←⍞
: lire une ligne (en tant que caractères), stocker dans∆
(⍎¨∆)*⍴∆
: évalue chaque personnage∆
et élève-le au pouvoir⍴∆
∆≡⍕+/
: voir si l'entrée est égale à la représentation sous forme de chaîne de la somme de ceux-cila source
GolfScript, 16 caractères
L'entrée doit être donnée sur STDIN, la sortie est 0 ou 1, indiquant un nombre non narcissique / narcissique.
Explication du code:
la source
Mathematica, 43 caractères
la source
Perl, 38 caractères
Une implémentation assez simple.
Voici une version légèrement différente qui contient 35 caractères:
Cette version génère une valeur false si l'entrée est narcissique, sinon elle génère une valeur true (acceptée par Perl). On pourrait soutenir que cette version inversée est dans les limites de la description du défi, mais après réflexion, j'ai décidé de ne pas le faire. Je ne suis pas désespéré pour améliorer mon score. Encore.
la source
echo -n 153 | perl -pe '…'
travaillera sans-l
.perl -pe'map$s+=$_**@y,@y=/./g;$_=$_==$s'
J, 23 caractères
(1!:1)1
est une entrée au clavier (retourne une chaîne).".
convertit l'entrée en un nombre;"0
spécifie un rang (dimension) de 0, autrement dit, prend chaque caractère et le convertit en nombre.^
est la fonction de puissance et#
est la fonction de longueur, prenant ainsi chaque chiffre à la puissance de la longueur de la chaîne (équivalent, le nombre de chiffres).+/
est juste somme, et=
compare la somme et le nombre.la source
Rubis, 34 + 5 = 39
Avec des indicateurs de ligne de commande
Courir
Affiche vrai ou faux.
la source
R,
7169665648Réduit de 8 octets grâce à @Giuseppe ! L'idée était d'effectuer la division entière avant l'opération modulo.
Version (3 ans) avec explication correspondante:
a<-scan()
prend un nombre (entier, réel, ...) en entrée (par exemple153
pour l'exemple).i
devient un vecteur contenant 3 à 1 (le nombre de caractèresa
étant 3).%%
est vectorisé donca%%10^i
signifiea
modulo 1000, 100 et 10: il donne donc153, 53, 3
.(a%%10^i)%/%10^(i-1)
est la division entière de ce vecteur par 100, 10, 1: donc1, 5, 3
.Nous élevons cela avec le premier élément
i
qui est le nombre de caractères (ici des chiffres) dea
, c'est3
-à- dire , donnant ainsi un vecteur contenant ce1, 125, 27
que noussum
et auquel nous nous comparonsa
.la source
Python 3, 56 octets
Pas très obscur, mais une solution simple.
la source
[
et]
sont inutiles, et vous pouvez aussi laisser tomber l'espace devantfor
, alors:sum(int(c)**len(s)for c in s)
s = input()
et un autre en déplaçant ce paramètre vers 2.7 où ilprint
ne s'agit pas d'une fonction.print
(donc un caractère de plus) en ferait une solution valide Python 2.x et Python 3.x.PHP,
807466 caractèresSolution PHP très simple:
Il suppose
error_reporting
que les notifications ne sont pas incluses, sinon quelques caractères supplémentaires seront nécessaires pour initialiser$s=0;
et$i=0
.Thx @manatwork pour raccourcir beaucoup de caractères.
la source
<?for($i=0;$i<$l=strlen($a=$argv[1]);$i++){$s+=pow($a[$i],$l);}echo$s==$a;
est plus courte.<?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 caractères
Échantillon échantillon:
la source
dc
, sauf pour les fautes de frappe effrayantes dans une tentative d'écriturecd
K,
2423Rasé 1 personnage avec réorganisation
la source
R, 53 octets
La
gsub
regex insère des espaces entre les caractères, de sorte que lascan
fonction puisse lire le nombre dans un vecteur de chiffres.la source
Kona, 18 ans
...
la source
Powershell,
7563626058Edit: mis à jour par le commentaire de @ Iszi
(note: celanevautpaspour$x
non existant)Edit: Ajout des modifications de @ Danko.
5856 caractèresSi l'entrée est limitée à 10 chiffres (inclut tous les int32)
la source
$x
et en utilisant+=
pour faire votre somme au lieu demeasure -sum
puis testez$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 vous avez remplacés''
. J'ai pris le script original dans Excel pour vérifier avec=LEN("($x=$n=read-host)-split''|%{$x-=[math]::pow($_,$n.length)};!$x")
et obtenu 62 également. Bien sûr, nous pourrions toujours le compter manuellement - mais qui fait vraiment cela?Python 2.x - 51
Même concept que la solution de crazedgremlin pour Python 3.x:
la source
C -
9793 caractèresAvec indentation:
la source
int
pour les variables globales.argc
.-lm
à la compilation compter +1 octet?-lm
drapeau n'est pas requis pour les compilateurs C89.Delphi - 166
Avec retrait
la source
05AB1E , 7 octets (non concurrents)
Essayez-le en ligne!
-2 octets grâce à @daHugLenny
la source
§1ô
parS
Haskell 2010 - 76 caractères
la source
Awk:
4039 caractèresÉchantillon échantillon:
la source
Bash, 64 caractères
a = $ 1; p = $ {# a}; pour ((; a> 0; a / = 10)); do s = $ ((s + (a% 10) ** p)); done; echo $ ( (s == 1 $)la source
for
épargner son séparée;
:for((a=$1;a>0;a/=10));do s=$[s+(a%10)**${#1}];done;echo $[s==$1]
.for
un ou plusieurs caractères peut être raccourci:for((a=$1;a>0;s+=(a%10)**${#1},a/=10));do :; done;echo $[s==$1]
.Lua (101 caractères)
Lua n'est pas réputée pour sa concision, mais c'était amusant d'essayer quand même.
Les améliorations sont les bienvenues.
la source
for n in io.lines()do [...]end
parn=io.read()
enregistre quelques octets ( TIO ).JavaScript -
7058 caractèresla source
true
pour moi, peu importe l'entréeJava - 84 octets
Version non lambda: 101 octets:
Appelé comme ça:
Résultats:
la source
a,l->
fonctionne exactement de la même manière.(a,l)->
pouvez jouer au golf deux octets: peut êtrea->l->
etbyte
peut êtreint
:a->l->{int s=0;for(int c:a.getBytes())s+=Math.pow(c-48,l);return a.equals(""+s);}
Japt ,
1497 octetsEssayez-le en ligne
Explication
Entrée implicite d'entier
U
.Convertissez-le
U
en tableau de digits (ì
), transmettez-le à travers une fonction et reconvertissez-le en entier après.Réduire par addition (
x
), en élevant chaque élément à la puissance (p
) de la longueur (Ê
) du tableau dans le processus.Vérifiez si le résultat est strictement égal à
U
.la source
¥U¬®n pUlÃx
que fonctionnerait pour 11 octets;)F # - 92 caractères
la source
Common Lisp -
116102 caractèresFormaté:
la source
Smalltalk -
10299 caractèresDans l'espace de travail, envoyez
value:
avec le numéro et imprimez-le.la source
C #, 117
la source
Haskell,
6866 octetsUsage:
la source