Narsisizm için bir sayı sınayın


53

Bir Narsisistik sayısı kendi basamak toplamı olan bir sayı, her bir basamak sayısı gücüne yükseltilmiş olup.

Örneğin, 153 (3 rakam):

1 3 + 5 3 + 3 3 = 1 + 125 + 27 = 153

1634:

1 4 + 6 4 + 3 4 + 4 4 = 1 + 1296 + 81 + 256 = 1634

Meydan okuma:

Kodunuz kullanıcıdan girmeli ve verilen numaranın Narsisistik Sayı olmasına bağlı olarak Doğru veya Yanlış olarak yazılmalıdır.

Metin dizeleri veya diğer geçersiz girişler için hata kontrolü gerekli değildir. Çıkış için 1 veya 0 kabul edilebilir. Sadece bir Narsisistik Sayıların listesini oluşturan ya da kullanıcı girişini bir listeye göre kontrol eden kod geçerli değildir.

OEIS A005188


3
TrueEğer böyle bir sayıysa çıktı, eğer başka bir şey varsa, eğer başka bir şey (eğer bu durumda sayı kendisi) değilse sorun olur mu?
devRicher

Yanıtlar:


39

APL (15)

∆≡⍕+/(⍎¨∆)*⍴∆←⍞

Çıkışlar 1true ve 0false eğer.

Açıklama:

  • ∆←⍞: bir satır okumak (karakter olarak), saklamak
  • (⍎¨∆)*⍴∆: her bir karakteri değerlendir ve onu güce yükselt⍴∆
  • ∆≡⍕+/: girişin, bunların toplamının dizgi gösterimi ile aynı olup olmadığını görmek

9
az önce ne okudum
Jbwilliams1

4
@LagWagon Tanrı'nın dili
14'de

21

GolfScript, 16 karakter

~.`:s{48-s,?-}/!

STDIN'de giriş yapılmalıdır, narsisistik olmayan / narsisistik sayıyı gösteren 0 ya da 1'dir.

Kodun açıklaması:

~              # Evaluate the input to get a number
.              # Accumulator (initially the number itself)
`:s            # Convert number to string and assign to variable s
{              # Loop over characters of the string
  48-          # Reduce character value by 48
  s,           # Push length of input number
  ?            # Power
  -            # Subtract result from accumulator
}/
!              # Not! (i.e. iff accumulator was zero it was a narcissistic number)

İki katına çıktım, “~”, ancak gelişmesi imkansız görünüyor. Güzel.
Peter Taylor

15

Mathematica, 43 karakter

Tr[#^Length@#&@IntegerDigits@#]==#&@Input[]

14

Perl, 38 karakter

perl -lpe '$@=y///c;$s+=$_**$@for/./g;$_=$_==$s'

Oldukça basit bir uygulama.

İşte 35 karaktere uyan biraz farklı bir sürüm:

perl -lpe '$@=y///c;$s+=$_**$@for/./g;$_-=$s'

Giriş narsisistik ise bu sürüm yanlış bir değer, aksi halde (Perl tarafından kabul edilmiş) bir gerçek değer verir. Biri, bu geriye dönük versiyonun, meydan okuma tanımının sınırları içinde kaldığını iddia edebilir, ancak yansıma üzerine karar vermemeye karar verdim. Puanımı artırmak için o kadar çaresiz değilim. Hala.


“Metin dizeleri veya diğer geçersiz girişler için hata denetimi gerekli değil.” - Öyleyse neden giriş satırının satır sonunu izlemeden geçerli bir sayı olacağını düşünmüyorsunuz? echo -n 153 | perl -pe '…'olmadan çalışacak -l.
Manatwork

Doğru ve yanlış çıktılarınızı tanımladığınız sürece, yasal olmalı
Cruncher

Açıkça konuşursak, meydan okuma metninin ifadesi Doğru / Yanlış veya 0 / 1'in ne anlama geldiği konusunda biraz belirsizlik bırakıyor, bu yüzden bunun geçmesine izin vereceğim. Narsisistik değerler için doğru olan farklı uzunluktaki farklı bir senaryo, bunun avantajına sahip olacaktır.
Iszi

Aynı fikir ancak daha kısa:perl -pe'map$s+=$_**@y,@y=/./g;$_=$_==$s'
msh210 7

13

J, 23 karakter

(".=+/@("."0^#))(1!:1)1

(1!:1)1 klavye girişidir (bir dize döndürür).

".girişi sayıya dönüştürür; "0diğer bir deyişle, her karakteri alarak ve bir sayıya dönüştürmek için 0 derecesini (boyut) belirtir.

^güç işlevidir ve #uzunluk işlevidir, bu nedenle her basamağı dizenin uzunluğunun gücüne (eşdeğer olarak, basamak sayısı) alır.

+/sadece toplamdır ve =toplamı ve sayıyı karşılaştırmaktadır.


2
"Kodunuz kullanıcıdan giriş almalı ve verilen numaranın Narsisistik Sayı olmasına bağlı olarak Doğru veya Yanlış olarak yazılmalıdır." (vurgu madeni)
John Dvorak

@JanDvorak Kötü eklenmiş klavye girişi.
rasyonel,

12

Ruby, 34 + 5 = 39

Komut satırı bayrakları ile

ruby -nlaF|

Çalıştırmak

p eval [$F,0]*"**#{~/$/}+"+"==#$_"

Çıktılar doğru veya yanlış.


3
Bu meşru bir kod
golfünde

11

R, 71 69 66 56 48

@Giuseppe sayesinde 8 byte düşürüldü ! Fikir, modulo işleminden önce tamsayı bölümünü gerçekleştirmekti.

i=nchar(a<-scan()):0;a==sum((a%/%10^i%%10)^i[1])

(3 yıllık) eski versiyonun ilgili açıklaması:

i=nchar(a<-scan()):1;a==sum(((a%%10^i)%/%10^(i-1))^i[1])

a<-scan()giriş olarak bir sayı (tamsayı, gerçek, ...) alır ( 153örneğin, söyler ).
i3 ila 1 (vektör aolmanın karakter sayısı) içeren bir vektör haline gelir .
%%vektörleştirildiği için modulo 1000, 100 ve 10 a%%10^ianlamına gelir a: bu nedenle verir 153, 53, 3.
(a%%10^i)%/%10^(i-1)bu vektörün tamsayı, 100, 10, 1 ile bölünmesidir: bu nedenle 1, 5, 3,.
Bunu, ilk elemanı ile ikarakter sayısı (burada rakamlar) ayani yükselttiğimiz , yani kendimizle karşılaştığımız 3bir vektör vererek yükseltiriz .1, 125, 27suma


Tamsayılı bölüm her zaman aşağı yuvarlanıyor mu? Aksi halde, 370 (narsisistik bir sayı) ile 4,7,0 (yanlış değere dönüşür) veya 270 (narsistik olmayan) 3,7,0 (doğru değer döndürme) dönüşmesiyle ilgili sorunlara rastlayabilirsiniz.
Iszi

Tamsayı bölümü yuvarlak değil ... 370x100 tamsayı bölümü 70 ile 3.70 değil, 3'tür.
plannapus

1
48 bayt ... biri bunu ana sayfaya çarptı!
Giuseppe

9

Python 3, 56 bayt

Çok karışık değil, basit bir çözüm.

s = input()
print(int(s)==sum(int(c)**len(s)for c in s))

1
[Ve ]gereksiz vardır ve önünde boşluk bırakın forböylece de:sum(int(c)**len(s)for c in s)
mannus

Bu harika! Bahşiş için teşekkürler.
danmcardle

1
İçindeki boşlukları s = input()ve diğerini boşluk bırakarak iki karakterden tasarruf edebilirsiniz print.
Ben

İyi nokta, düzenlendi.
danmcardle

Bence parantez eklemenin print(dolayısıyla bir karakter daha fazla) bunu geçerli bir Python 2.x ve Python 3.x çözümü yapacağına dikkat etmeniz gerekir .
Martin Thoma

8

PHP, 80 74 66 karakter

Çok basit PHP çözümü:

<?for(;$i<$l=strlen($a=$argv[1]);)$s+=pow($a[$i++],$l);echo$s==$a;

Bu varsayar error_reportingaksi epeyce ilave karakterler başlatmak için gerekli olacak, bildirimleri içermez $s=0;ve $i=0.

Thx @manatwork birçok karakter kısaltmak için.


Ayrı ifadelerde $ a ve $ l atamayın. <?for($i=0;$i<$l=strlen($a=$argv[1]);$i++){$s+=pow($a[$i],$l);}echo$s==$a;daha kısa.
Manatwork

Zaten bir bildirim oluşturan bir ifadeye sahip olduğunuzdan, sadece bir tane daha ekleyin: döngü kontrol değişkeni başlangıcını kaldırın. Döngü kontrol değişkenini artırmak da bağımsız bir ifade olmak zorunda değildir. Ve parantez kesinlikle gerekli değildir: <?for(;$i<$l=strlen($a=$argv[1]);)$s+=pow($a[$i++],$l);echo$s==$a;.
Manatwork

@manatwork: Codegolf'a sıcak bir karşılama için teşekkür ederiz :)
Vlad Preda

Bu golf olabilirfor(;$i<$l=strlen($a=$argn);)$s+=$a[$i++]**$l;echo$s==$a;
Jörg Hülsermann

8

Dc: 48 karakter

[1pq]Sr?d0rdZSz[d10/r10%lz^rSh+Lhd0!=c]dScx+=r0p

Örnek çalışma:

bash-4.1$ dc -e '[1pq]Sr?d0rdZSz[d10/r10%lz^rSh+Lhd0!=c]dScx+=r0p' <<< '153'
1

bash-4.1$ dc -e '[1pq]Sr?d0rdZSz[d10/r10%lz^rSh+Lhd0!=c]dScx+=r0p' <<< '1634'
1

bash-4.1$ dc -e '[1pq]Sr?d0rdZSz[d10/r10%lz^rSh+Lhd0!=c]dScx+=r0p' <<< '2013'
0

Aslında hiç kullanılmamış dc, yazma girişiminde çılgınca yazım hataları için tasarruf edincd
Stan Strum

8

K, 24 23

{x=+/xexp["I"$'a]@#a:$x}

Yeniden sıralanan 1 char traş

{x=+/{x xexp#x}"I"$'$x}

8

R, 53 bayt

sum(scan(t=gsub("(.)","\\1 ",x<-scan()))^nchar(x))==x

gsubBöylece normal ifade, karakterler arası boşluk ekler scanfonksiyon basamaklı bir vektöre sayısını okumak mümkün olur.


+1 Bunu yapmayı asla düşünmezdim, mükemmel.
plannapus,


6

Powershell, 75 63 62 60 58

Düzenleme: @ Iszi'nin yorumuna göre güncellendi (not: bu $xmevcut değildir)

Düzenleme: @ Danko'nun değişikliklerine eklendi.

[char[]]($x=$n=read-host)|%{$x-="$_*"*$n.length+1|iex};!$x

58 56 karakter

Giriş 10 basamakla sınırlıysa (tüm int32’yi içerir)

($x=$n=read-host)[0..9]|%{$x-="$_*"*$n.length+1|iex};!$x

Benden önce birinin PowerShell'i yapıp yapmayacağını merak ediyordum.
Iszi

Başka bir değişken ekleyerek $xve +=toplama işleminizi measure -sumtest yerine yapmak için kullanarak 12 karakter kaydedin $x-eq$n.
Iszi

1
61 karakter:($x=$n=read-host)-split''|%{$x-=[math]::pow($_,$n.length)};!$x
Danko Durbić 15:03

1
@ DankoDurbić, Güzel! Zorlama türü genellikle PoSh kodlu golf oynamak için kullanışlıdır. '($x=$n=read-host)-split""|%{$x-=[math]::pow($_,$n.length)};!$x'.length
Çalıştığım

1
@Rynant İyi nokta. PowerShell'deki uzunluk kontrolünü yaptım ve 62 ile de geldim. Gerçek betiğe benzer şekilde bir uzunluk kontrolü çalıştırdığınızda , sayı 61 olur. Bu muhtemelen PowerShell ''ile değiştirdiğiniz öğeyi nasıl ele aldığından kaynaklanmaktadır ''. Orijinal senaryoyu kontrol etmek için Excel'e =LEN("($x=$n=read-host)-split''|%{$x-=[math]::pow($_,$n.length)};!$x")aldım ve 62 tane aldım. Tabii ki, her zaman manuel olarak sayabiliriz - ama bunu gerçekten kim yapıyor?
Iszi

5

Python 2.x - 51

Crazedgremlin'in Python 3.x için çözümü ile aynı konsept:

s=input();print s==sum(int(c)**len(`s`)for c in`s`)

4

C - 97 93 karakter

a,b;main(c){scanf("%d",&c);b=c;for(;c;c/=10)a+=pow(c%10,(int)log10(b)+1);printf("%d",a==b);}

Girintili:

a,b;
main(c) { 
  scanf("%d",&c);
  b=c;
  for(;c;c/=10)
    a+=pow(c%10,(int)log10(b)+1);
  printf("%d",a==b);
}

2
Genel intdeğişkenler için tanımlamanız gerekmez .
Konrad Borowski

Woah. Girişi içine okuyorsun argc.
SIGSTACKFAULT

Ayrıca -lmderleme zamanı +1 baytta yapmak zorunda kalmamalı mıydı ?
SIGSTACKFAULT

@Blacksilver -lmC89 derleyiciler için bayrak gerekli değildir.
Josh

Aha. Her gün yeni bir şey öğrenin.
SIGSTACKFAULT

4

Delphi - 166

uses System.SysUtils,math;var i,r,l:integer;s:string;begin r:=0;readln(s);l:=length(s);for I:=1to l do r:=round(r+power(strtoint(s[i]),l));writeln(inttostr(r)=s);end.

Girintili

uses System.SysUtils,math;
var
  i,r,l:integer;
  s:string;
begin
  r:=0;
  readln(s);
  l:=length(s);
  for I:=1to l do
    r:=round(r+power(strtoint(s[i]),l));
  writeln(inttostr(r)=s);
end.


3

Haskell 2010 - 76 karakter

main=do x<-getLine;print$(==x)$show$sum$map((^length x).(+(-48)).fromEnum)x

1
Kodu çalıştırmak için ms sayısını göndermemelisiniz, fakat kullandığınız karakter sayısını. ;)
kullanıcı bilinmeyen

3

Awk: 40 39 karakter

{for(;i<NF;)s+=$(i+++1)**NF;$0=$0==s}1

Örnek çalışma:

bash-4.1$ awk -F '' '{for(;i<NF;)s+=$(i+++1)**NF;$0=$0==s}1' <<< '153'
1

bash-4.1$ awk -F '' '{for(;i<NF;)s+=$(i+++1)**NF;$0=$0==s}1' <<< '1634'
1

bash-4.1$ awk -F '' '{for(;i<NF;)s+=$(i+++1)**NF;$0=$0==s}1' <<< '2013'
0

3

Bash, 64 karakter

for((a=$1;a>0;s+=(a%10)**${#1},a/=10));do :; done;echo $[s==$1]

a = $ 1; p = $ {# a}; (((; a> 0; a / = 10)); s = $ ((s + (% 10) ** p)); (s == $ 1))


1
P değişkenini tek bir yerde kullanıyorsunuz, yani gerek yok. Sen içine değişken a başlatma taşıyabilirsiniz foronun ayrı yedek ;: for((a=$1;a>0;a/=10));do s=$[s+(a%10)**${#1}];done;echo $[s==$1].
Manatwork

1
İçine değerlendirmeyi hareket ettirerek forbir daha karakterli kısaltılabilir: for((a=$1;a>0;s+=(a%10)**${#1},a/=10));do :; done;echo $[s==$1].
Manatwork

Ah, meraklı! Böyle bir şey denedim ama işe yaramadı. Neyin yanlış gittiğini merak ediyorum.
kullanıcı bilinmeyen

3

Lua (101 karakter)

Lua özlü olduğu bilinmemektedir, ancak yine de denemek eğlenceliydi.

for n in io.lines()do l,s=n:len(),0 for i=1,l do d=n:byte(i)s=s+(d-48)^l end print(s==tonumber(n))end

İyileştirmeler hoş geldiniz.


Programınızın bir numara listesini işlemesi ve işlemesi gerekmediğinden, bu işlevi uygulamak için bayt kullanmazdım. Döngü değiştirilmesi for n in io.lines()do [...]endile n=io.read()bazı bayt (kazandırır TIO ).
Jonathan Frech

3

JavaScript - 70 58 karakter

for(i in a=b=prompt())b-=Math.pow(a[i],a.length)
alert(!b)

Not:

Bunu Stack Exchange'deki dev konsolunuzda test ediyorsanız, String.prototypebu çözümü bozacak standart dışı bazı özellikler olduğunu unutmayın String.prototype.formatUnicorn. Lütfen açık ortamlar gibi açık bir ortamda test ettiğinizden emin olun about:blank.


Orada 70 karakter sayarım.
Manatwork

@manatwork, birlikler, yeni çizgiyi saymayı unuttu.
zzzzBov

Bu aldatmaca büyük hile!
Manatwork

2
truegirdiden bağımsız olarak her zaman benim için döner
koko

@koko, neden yanlış sonuçlar aldığınızı açıklamak için bir not ekledim.
zzzzBov

3

Java - 84 bayt

(a,l)->{int s=0;for(byte c:a.getBytes())s+=Math.pow(c-48,l);return a.equals(""+s);};

Lambda olmayan versiyon: 101 bayt:

boolean n(String a,int l){int s=0;for(byte c:a.getBytes())s+=Math.pow(c-48,l);return a.equals(""+s);}

Böyle denir:

interface X {
    boolean n(String a, int l);
}

static X x = (a,l)->{int s=0;for(byte c:a.getBytes())s+=Math.pow(c-48,l);return a.equals(""+s);};

public static void main(String[] args) {
    System.out.println(n("153",3));
    System.out.println(n("1634",4));
    System.out.println(n("123",3));
    System.out.println(n("654",3));
}

İade:

true
true
false
false

Lambda argümanlarının etrafındaki parantezi kaldırabilirsiniz, a,l->tam olarak aynı şekilde çalışır.
FlipTack

Ben neredeyse bir yıl önce bu cevap biliyorum ama golf iki bayt olabilir: (a,l)->olabilir a->l->ve byteolabilir int:a->l->{int s=0;for(int c:a.getBytes())s+=Math.pow(c-48,l);return a.equals(""+s);}
Kevin Cruijssen

3

Japt , 14 9 7 bayt

¶ì_xpZÊ

Çevrimiçi deneyin


açıklama

Tamsayının örtük girişi U.

ì_

Dönüştürme Ubasamağı dizisi için ( ì), bir işlev içinde geçirilmekte ve sonra bir tam geri dönüştürmek.

xpZÊ

xHer bir öğeyi işlemdeki dizinin puzunluğunun ( Ê) gücüne ( ) yükselterek ilave ederek ( ) azaltın .

Sonucu kesinlikle eşit olup olmadığını kontrol edin U.


Sanırım ¥U¬®n pUlÃx11 byte çalışacak;)
Oliver

2

F # - 92 karakter

let n=stdin.ReadLine()
n|>Seq.map(fun x->pown(int x-48)n.Length)|>Seq.sum=int n|>printf"%b"

2

Common Lisp - 116 102 karakter

(defun f(m)(labels((l(n)(if(> n 0)(+(expt(mod n 10)(ceiling(log m 10)))(l(floor n 10)))0)))(= m(l m))))

biçimlendirilmiş:

(defun f(m)
  (labels((l(n)
            (if(> n 0)
               (+(expt(mod n 10)(ceiling(log m 10)))
                 (l(floor n 10)))
               0)))
    (=(l m)m)))

2

Küçük konuşma - 102 99 karakter

[:n|a:=n asString collect:[:e|e digitValue]as:Array.^n=(a collect:[:each|each raisedTo:a size])sum]

Çalışma Alanında, value:numarayı gönderin ve Yazdırın.


2

C #, 117

using System.Linq;class A{int Main(string[] a){return a[0].Select(c=>c-'0'^a[0].Length).Sum()==int.Parse(a[0])?1:0;}}

2

Haskell, 68 66 bayt

d 0=[]
d n=mod n 10:d(div n 10)
sum.(\a->map(^length a)a).d>>=(==)

Kullanımı:

*Main> sum.(\a->map(^length a)a).d>>=(==) $ 1634
True
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.