Eine narzisstische Zahl ist eine Zahl, die die Summe ihrer eigenen Ziffern darstellt, wobei jede Zahl zur Potenz der Anzahl der Ziffern erhoben wird.
Nehmen Sie zum Beispiel 153 (3 Stellen):
1 3 + 5 3 + 3 3 = 1 + 125 + 27 = 153
1634
1 4 + 6 4 + 3 4 + 4 4 = 1 + 1296 + 81 + 256 = 1634
Die Herausforderung:
Ihr Code muss Eingaben vom Benutzer entgegennehmen und Wahr oder Falsch ausgeben, je nachdem, ob es sich bei der angegebenen Nummer um eine narzisstische Zahl handelt.
Eine Fehlerprüfung auf Textzeichenfolgen oder andere ungültige Eingaben ist nicht erforderlich. 1 oder 0 für die Ausgabe ist akzeptabel. Code, der lediglich eine Liste narzisstischer Zahlen generiert oder die Benutzereingabe mit einer Liste vergleicht, ist nicht geeignet.
True
ob es sich um eine solche Nummer handelt, aber sonst noch etwas (in diesem Fall die Nummer selbst), wenn nicht?Antworten:
APL (15)
Gibt aus,
1
ob true und0
false.Erläuterung:
∆←⍞
: Lesen Sie eine Zeile (als Zeichen), speichern Sie in∆
(⍎¨∆)*⍴∆
: bewerte jedes Zeichen in∆
und hebe es an die Macht⍴∆
∆≡⍕+/
: Überprüfen Sie, ob die Eingabe der Zeichenfolgendarstellung der Summe dieser Werte entsprichtquelle
GolfScript, 16 Zeichen
Die Eingabe muss auf STDIN erfolgen, die Ausgabe ist 0 oder 1, was eine nicht narzisstische / narzisstische Zahl angibt.
Erklärung des Codes:
quelle
Mathematica, 43 Zeichen
quelle
Perl, 38 Zeichen
Eine ziemlich unkomplizierte Implementierung.
Hier ist eine etwas andere Version, die in 35 Zeichen passt:
Diese Version gibt einen falschen Wert aus, wenn die Eingabe narzisstisch ist, andernfalls gibt sie einen (von Perl akzeptierten) wahren Wert aus. Man könnte argumentieren, dass diese Rückwärtsversion innerhalb der Grenzen der Herausforderungsbeschreibung liegt, aber nach Überlegung habe ich mich dagegen entschieden. Ich bin nicht so verzweifelt, meine Punktzahl zu verbessern. Noch.
quelle
echo -n 153 | perl -pe '…'
wird funktionieren ohne-l
.perl -pe'map$s+=$_**@y,@y=/./g;$_=$_==$s'
J, 23 Zeichen
(1!:1)1
ist eine Tastatureingabe (die einen String zurückgibt).".
wandelt die Eingabe in eine Zahl um;"0
Gibt einen Rang (eine Dimension) von 0 an, dh jedes Zeichen wird in eine Zahl umgewandelt.^
ist die Potenzfunktion und#
ist die Längenfunktion, die jede Ziffer zur Potenz der Länge der Zeichenkette macht (entsprechend der Anzahl der Stellen).+/
ist nur Summe und=
vergleicht die Summe und die Zahl.quelle
Rubin, 34 + 5 = 39
Mit Befehlszeilenflags
Lauf
Gibt true oder false aus.
quelle
R
7169665648Reduziert um 8 Bytes dank @Giuseppe ! Die Idee war, die Ganzzahldivision vor der Modulo-Operation durchzuführen.
(3 Jahre) alte Version mit entsprechender Erklärung:
a<-scan()
Nimmt eine Zahl (Integer, Real, ...) als Eingabe (sagen wir153
für das Beispiel).i
wird zu einem Vektor mit 3 zu 1 (die Anzahl der Zeichena
ist 3).%%
ist vektorisiert,a%%10^i
bedeutet alsoa
modulo 1000, 100 und 10: es gibt also153, 53, 3
.(a%%10^i)%/%10^(i-1)
ist die ganzzahlige Division dieses Vektors durch 100, 10, 1: daher1, 5, 3
.Wir heben das auf, wobei das erste Element
i
die Anzahl der Zeichen (hier Ziffern) von ista
, dh3
,1, 125, 27
wir geben einen Vektor an, der das enthält , womit wirsum
vergleichena
.quelle
Python 3, 56 Bytes
Nicht sehr verschleiert, aber eine einfache Lösung.
quelle
[
und]
sind unnötig, und Sie können das Leerzeichen vorfor
auch fallen lassen, so:sum(int(c)**len(s)for c in s)
s = input()
und ein anderes entfernen, indem Sie dies auf 2.7 verschieben, woprint
keine Funktion vorhanden ist.print
(daher ein Zeichen mehr) dies zu einer gültigen Python 2.x- und Python 3.x-Lösung machen würde.PHP,
807466 ZeichenSehr einfache PHP-Lösung:
Es wird davon
error_reporting
ausgegangen, dass keine Hinweise enthalten sind, da andernfalls einige zusätzliche Zeichen zum Initialisieren von$s=0;
und erforderlich sind$i=0
.Vielen Dank an @manatwork, um viele Zeichen zu verkürzen.
quelle
<?for($i=0;$i<$l=strlen($a=$argv[1]);$i++){$s+=pow($a[$i],$l);}echo$s==$a;
ist kürzer.<?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;
Gleichstrom: 48 Zeichen
Probelauf:
quelle
dc
, außer für hektische Tippfehler beim Versuch zu schreibencd
K
24,231 Saibling mit Nachbestellung rasiert
quelle
R, 53 Bytes
Der
gsub
Regex fügt Leerzeichen zwischen die Zeichen ein, damit diescan
Funktion die Zahl in einen Ziffernvektor einlesen kann.quelle
Kona, 18
...
quelle
Powershell,
7563626058Bearbeiten: Aktualisiert per @ Iszis Kommentar
(Hinweis: Dies gilt für$x
nicht existierende)Bearbeiten: @ Danko Änderungen hinzugefügt.
5856 ZeichenWenn die Eingabe auf 10 Stellen begrenzt ist (einschließlich aller int32)
quelle
$x
und+=
zum Summieren verwenden, anstatt zumeasure -sum
testen$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
''
die Sie ersetzt haben''
. Ich nahm das ursprüngliche Skript in Excel, um es zu überprüfen,=LEN("($x=$n=read-host)-split''|%{$x-=[math]::pow($_,$n.length)};!$x")
und bekam auch 62. Natürlich könnten wir es immer manuell zählen - aber wer macht das wirklich?Python 2.x - 51
Gleiches Konzept wie die Lösung von crazedgremlin für Python 3.x:
quelle
C -
9793 ZeichenMit Einrückung:
quelle
int
globalen Variablen definieren .argc
.-lm
zur Kompilierungszeit +1 Byte zu zählen?-lm
Flag wird für C89-Compiler nicht benötigt.Delphi - 166
Mit Einzug
quelle
05AB1E , 7 Bytes (nicht konkurrierend)
Probieren Sie es online!
-2 Bytes dank @daHugLenny
quelle
§1ô
mitS
Haskell 2010 - 76 Zeichen
quelle
Awk:
4039 ZeichenProbelauf:
quelle
Bash, 64 Zeichen
a = $ 1; p = $ {# a}; für ((; a> 0; a / = 10)); do s = $ ((s + (a% 10) ** p)); done; echo $ ( (s == $ 1))quelle
for
ihre einzelnen zu ersparen;
:for((a=$1;a>0;a/=10));do s=$[s+(a%10)**${#1}];done;echo $[s==$1]
.for
kann ein Zeichen mehr verkürzt werden:for((a=$1;a>0;s+=(a%10)**${#1},a/=10));do :; done;echo $[s==$1]
.Lua (101 Zeichen)
Lua ist nicht dafür bekannt, prägnant zu sein, aber es hat Spaß gemacht, es trotzdem zu versuchen.
Verbesserungen sind willkommen.
quelle
for n in io.lines()do [...]end
durchn=io.read()
spart einige Bytes ( TIO ).JavaScript -
7058 Zeichenquelle
true
für mich zurück, unabhängig von der EingabeJava - 84 Bytes
Nicht-Lambda-Version: 101 Bytes:
So genannt:
Kehrt zurück:
quelle
a,l->
funktioniert genauso.(a,l)->
Kann seina->l->
undbyte
kann seinint
:a->l->{int s=0;for(int c:a.getBytes())s+=Math.pow(c-48,l);return a.equals(""+s);}
Japt ,
1497 BytesProbieren Sie es online aus
Erläuterung
Implizite Eingabe einer Ganzzahl
U
.Konvertieren Sie
U
in ein Array von Ziffern (ì
), übergeben Sie es einer Funktion und konvertieren Sie es anschließend zurück in eine Ganzzahl.Reduzieren Sie
x
jedes Element durch Addition ( ) und erhöhen Sie dabei die Potenz (p
) der Länge (Ê
) des Arrays.Überprüfen Sie, ob das Ergebnis genau gleich ist
U
.quelle
¥U¬®n pUlÃx
würde für 11 Bytes arbeiten;)F # - 92 Zeichen
quelle
Common Lisp -
116102 ZeichenFormatiert:
quelle
Smalltalk -
102 bis99 ZeichenSenden
value:
Sie im Arbeitsbereich die Nummer und drucken Sie sie aus.quelle
C #, 117
quelle
Haskell,
6866 BytesVerwendungszweck:
quelle