Angka narsis adalah angka yang merupakan jumlah dari digitnya sendiri, masing-masing dinaikkan menjadi kekuatan jumlah digit.
Misalnya, ambil 153 (3 digit):
1 3 + 5 3 + 3 3 = 1 + 125 + 27 = 153
1634:
1 4 + 6 4 + 3 4 + 4 4 = 1 + 1296 + 81 + 256 = 1634
Tantangan:
Kode Anda harus mengambil input dari pengguna dan menghasilkan Benar atau Salah tergantung pada apakah nomor yang diberikan adalah Nomor Narsis.
Kesalahan memeriksa string teks atau input tidak valid lainnya tidak diperlukan. 1 atau 0 untuk output dapat diterima. Kode yang hanya menghasilkan daftar Nomor Narsis, atau memeriksa input pengguna terhadap daftar, tidak memenuhi syarat.
True
jika nomor tersebut, tetapi hal lain (dalam hal ini nomor itu sendiri) jika tidak?Jawaban:
APL (15)
Keluaran
1
jika benar dan0
jika salah.Penjelasan:
∆←⍞
: baca baris (sebagai karakter), simpan di∆
(⍎¨∆)*⍴∆
: mengevaluasi setiap karakter∆
dan meningkatkannya ke kekuasaan⍴∆
∆≡⍕+/
: lihat apakah input sama dengan representasi string dari jumlah inisumber
GolfScript, 16 karakter
Input harus diberikan pada STDIN, output adalah 0 atau 1 yang menunjukkan angka non-narsis / narsis.
Penjelasan kode:
sumber
Mathematica, 43 karakter
sumber
Perl, 38 karakter
Implementasi yang cukup mudah.
Berikut versi yang sedikit berbeda yang cocok untuk 35 karakter:
Versi ini menghasilkan nilai yang salah jika inputnya narsis, jika tidak menghasilkan nilai sebenarnya (Perl-accept). Orang mungkin berpendapat bahwa versi mundur ini berada dalam batas-batas deskripsi tantangan, tetapi setelah refleksi saya memutuskan untuk tidak melakukannya. Saya tidak begitu ingin meningkatkan skor saya. Namun.
sumber
echo -n 153 | perl -pe '…'
akan bekerja tanpa-l
.perl -pe'map$s+=$_**@y,@y=/./g;$_=$_==$s'
J, 23 karakter
(1!:1)1
adalah input keyboard (mengembalikan string).".
mengonversi input ke nomor;"0
menentukan peringkat (dimensi) 0, dengan kata lain, mengambil setiap karakter dan mengubahnya menjadi angka.^
adalah fungsi daya dan fungsi#
panjang, sehingga mengambil setiap digit ke kekuatan panjang string (ekuivalen, jumlah digit).+/
hanya jumlah, dan=
membandingkan jumlah dan jumlah.sumber
Ruby, 34 + 5 = 39
Dengan bendera baris perintah
Lari
Output benar atau salah.
sumber
R,
7169665648Dikurangi 8 byte berkat @Giuseppe ! Idenya adalah untuk melakukan pembagian integer sebelum operasi modulo.
(3 tahun) versi lama dengan penjelasan yang sesuai:
a<-scan()
mengambil nomor (integer, real, ...) sebagai input (katakanlah153
misalnya).i
menjadi vektor yang mengandung 3 to 1 (jumlah karaktera
menjadi 3).%%
adalah vektor sehinggaa%%10^i
berartia
modulo 1000, 100 dan 10: karena itu memberi153, 53, 3
.(a%%10^i)%/%10^(i-1)
adalah pembagian bilangan bulat dari vektor tersebut dengan 100, 10, 1: oleh karena itu1, 5, 3
,.Kami meninggikan itu dengan elemen pertama
i
yang merupakan jumlah karakter (di sini digit)a
, yaitu3
, dengan demikian memberikan vektor yang berisi1, 125, 27
yang kitasum
dan bandingkana
.sumber
Python 3, 56 byte
Tidak terlalu membingungkan, tetapi solusi sederhana.
sumber
[
dan]
tidak diperlukan, dan Anda bisa drop ruang di depanfor
juga, jadi:sum(int(c)**len(s)for c in s)
s = input()
dan yang lain dengan memindahkan ini ke 2,7 di manaprint
bukan fungsi.print
(maka satu karakter lebih) akan membuat ini solusi Python 2.x dan Python 3.x yang valid.PHP,
807466 karakterSolusi PHP yang sangat mudah:
Diasumsikan
error_reporting
tidak termasuk pemberitahuan, jika tidak beberapa karakter tambahan akan diperlukan untuk menginisialisasi$s=0;
dan$i=0
.Thx @manatwork untuk mempersingkat banyak karakter.
sumber
<?for($i=0;$i<$l=strlen($a=$argv[1]);$i++){$s+=pow($a[$i],$l);}echo$s==$a;
lebih pendek.<?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 karakter
Contoh dijalankan:
sumber
dc
, simpan untuk kesalahan ketik panik dalam upaya untuk menuliscd
K,
2423Dicukur 1 char dengan pemesanan ulang
sumber
R, 53 byte
The
gsub
regex menyisipkan spasi di antara karakter, sehinggascan
fungsi akan dapat membaca nomor menjadi vektor digit.sumber
Kona, 18
...
sumber
Powershell,
7563626058Sunting: Diperbarui per komentar Iszi
(catatan: ini dianggap$x
tidak ada)Edit: Menambahkan perubahan @ Danko.
5856 karakterJika input dibatasi hingga 10 digit (termasuk semua int32)
sumber
$x
dan gunakan+=
untuk melakukan penjumlahan alih-alihmeasure -sum
menguji$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
''
yang Anda ganti''
. Saya mengambil skrip asli ke Excel untuk mengecek=LEN("($x=$n=read-host)-split''|%{$x-=[math]::pow($_,$n.length)};!$x")
dan mendapatkan 62 juga. Tentu saja, kita selalu dapat menghitungnya secara manual - tetapi siapa yang benar-benar melakukannya?Python 2.x - 51
Konsep yang sama dengan solusi crazedgremlin untuk Python 3.x:
sumber
C -
9793 karakterDengan lekukan:
sumber
int
variabel global.argc
.-lm
pada waktu kompilasi +1 byte?-lm
flag tidak diperlukan untuk kompiler C89.Delphi - 166
Dengan indentasi
sumber
05AB1E , 7 byte (Tidak bersaing)
Cobalah online!
-2 byte terima kasih kepada @daHugLenny
sumber
§1ô
denganS
Haskell 2010 - 76 karakter
sumber
Awk:
4039 karakterContoh dijalankan:
sumber
Bash, 64 karakter
a = $ 1; p = $ {# a}; untuk ((; a> 0; a / = 10)); do s = $ ((s + (% 10) ** p)); selesai; echo $ ( (s == $ 1))sumber
for
untuk cadangan yang terpisah;
:for((a=$1;a>0;a/=10));do s=$[s+(a%10)**${#1}];done;echo $[s==$1]
.for
satu karakter yang lebih dapat dipersingkat:for((a=$1;a>0;s+=(a%10)**${#1},a/=10));do :; done;echo $[s==$1]
.Lua (101 karakter)
Lua tidak dikenal ringkas, tetapi bagaimanapun juga menyenangkan untuk mencoba.
Perbaikan disambut baik.
sumber
for n in io.lines()do [...]end
dengann=io.read()
menyimpan beberapa byte ( TIO ).JavaScript -
7058 karaktersumber
true
untuk saya, terlepas dari inputJava - 84 byte
Versi non-lambda: 101 byte:
Disebut seperti ini:
Pengembalian:
sumber
a,l->
bekerja persis sama.(a,l)->
bisaa->l->
danbyte
bisaint
:a->l->{int s=0;for(int c:a.getBytes())s+=Math.pow(c-48,l);return a.equals(""+s);}
Japt ,
1497 byteCobalah online
Penjelasan
Input bilangan bulat implisit
U
.Konversikan
U
ke array angka (ì
), sampaikan melalui fungsi dan konversikan kembali ke integer setelah.Kurangi dengan penambahan (
x
), naikkan setiap elemen ke kekuatan (p
) dari panjang (Ê
) array dalam proses.Periksa apakah hasilnya sama dengan
U
.sumber
¥U¬®n pUlÃx
akan bekerja selama 11 byte;)F # - 92 karakter
sumber
Common Lisp -
116102 karakterDiformat:
sumber
Smalltalk -
10299 karakterDi Workspace, kirim
value:
dengan nomor itu, dan Cetak.sumber
C #, 117
sumber
Haskell,
6866 bytePemakaian:
sumber