자기애주의 숫자를 테스트


53

자기애 번호는 자신의 자리 숫자의 합 숫자가 각각 자리의 수의 제곱입니다.

예를 들어, 153 (3 자리)을 사용하십시오.

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

1634 :

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

도전 과제 :

코드는 사용자로부터 입력을 받아 주어진 숫자가 자기애 숫자인지에 따라 True 또는 False를 출력해야합니다.

텍스트 문자열 또는 기타 유효하지 않은 입력 확인 오류가 필요하지 않습니다. 출력에 1 또는 0이 허용됩니다. 단순히 자기애 적 번호 목록을 생성하거나 목록에서 사용자 입력을 확인하는 코드는 자격이 없습니다.

OEIS A005188


3
True그런 숫자이면 출력 해도 괜찮지 만 그렇지 않은 경우 (이 경우 숫자 자체) 다른 것이 있습니까?
devRicher

답변:


39

APL (15)

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

1true 및 0false 인 경우 출력 합니다 .

설명:

  • ∆←⍞: 줄을 읽고 (문자로) 저장
  • (⍎¨∆)*⍴∆: 각 캐릭터를 평가 하고 힘을 높이십시오.⍴∆
  • ∆≡⍕+/: 입력 값이이 합계의 문자열 표현과 같은지 확인

9
내가 방금 읽은 것
Jbwilliams1

4
@LagWagon 하나님의 언어
tomsmeding

21

GolfScript, 16 자

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

입력은 STDIN에 제공되어야하며 출력은 0 또는 1입니다 (비 자기 / 숫자 숫자를 나타냄).

코드 설명 :

~              # 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)

나는``~ .``에 두 번 테이크를했지만 개선 할 수없는 것 같습니다. 좋은데
피터 테일러


14

펄, 38 자

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

매우 간단한 구현입니다.

35 자에 맞는 약간 다른 버전이 있습니다.

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

이 버전 은 입력이 자기애 적이면 거짓 값을 출력하고 , 그렇지 않으면 (Perl-accepted) true 값을 출력합니다. 이 역행 버전은 도전 설명의 한계 내에 속한다고 생각할 수도 있지만, 반영하면 나는하지 않기로 결정했습니다. 나는 점수를 향상시키기 위해 필사적이지 않다. 아직.


“텍스트 문자열 또는 기타 유효하지 않은 입력 확인 오류가 필요하지 않습니다.”– 줄 바꿈없이 입력이 유효한 숫자라고 가정하지 않겠습니까? echo -n 153 | perl -pe '…'없이 작동 -l합니다.
manatwork

나는 당신이 당신의 진실하고 거짓된 결과물을 정의하는 한 합법적이어야한다고 생각합니다
Cruncher

엄밀히 말하면, 챌린지 텍스트의 문구는 True / False 또는 0/1의 의미에 대해 약간의 모호함을 남기 므로이 하나를 통과 시키겠습니다. 자기애 적 가치에 대해 true를 반환하는 동일한 길이의 다른 스크립트가 유리합니다.
Iszi

같은 생각이지만 더 짧은 :perl -pe'map$s+=$_**@y,@y=/./g;$_=$_==$s'
msh210

13

J, 23 자

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

(1!:1)1 키보드 입력 (문자열 반환)입니다.

".입력을 숫자로 변환합니다. "0순위 (치수)를 0으로 지정합니다. 즉, 각 문자를 가져와 숫자로 변환합니다.

^는 거듭 제곱 함수이고 #길이 함수이므로 각 숫자를 문자열 길이의 거듭 제곱 (즉, 자릿수)으로 만듭니다.

+/그냥 합계이며 =합계와 숫자를 비교하고 있습니다.


2
"코드는 사용자로부터 입력을 받아서 주어진 숫자가 자기애 숫자인지에 따라 True 또는 False를 출력 해야합니다 ." (강조 광산)
John Dvorak

@JanDvorak My bad-키보드 입력이 추가되었습니다.
rationalis

12

루비, 34 + 5 = 39

명령 행 플래그 사용

ruby -nlaF|

운영

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

true 또는 false를 출력합니다.


3
P : 이것은 내가 합법적 인 코드 골프에서 본 것 중 가장 루비 플래그 될 수있다
문 손잡이

11

R, 71 69 66 56 48

@Giuseppe 덕분에 8 바이트 감소 ! 아이디어는 모듈로 연산 전에 정수 나누기를 수행하는 것이 었습니다.

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

해당 설명이있는 (3 년) 이전 버전 :

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

a<-scan()숫자 (정수, 실수, ...)를 입력으로 사용합니다 ( 153예 : 예).
i3 대 1 (3의 문자 수)을 포함하는 벡터가됩니다 a.
%%는 벡터화되어 모듈로 1000, 100 및 10을 a%%10^i의미 a합니다 153, 53, 3.
(a%%10^i)%/%10^(i-1)는 벡터를 100, 10, 1 :로 나누는 정수입니다. 따라서 1, 5, 3.
우리는 첫 번째 요소가 i의 문자 수 (여기서 자릿수) 인 것으로 a, 즉 우리 와 비교하고 3포함하는 벡터를 제공합니다 .1, 125, 27suma


정수 나누기는 항상 내림합니까? 그렇지 않으면, 370 (자기 숫자)이 4,7,0 (거짓을 반환 할 것)으로 전환되거나 270 (비 마약)이 3,7,0 (참을 반환)으로 바꾸는 등의 문제가 발생할 수 있습니다.
Iszi

정수 나누기는 반올림하지 않습니다. 370 x 100의 정수 나누기는 3이며 나머지는 70이며 3.70이 아닙니다.
plannapus

1
48 바이트 ... 누군가 이걸 홈페이지에 부딪쳤다!
주세페

9

파이썬 3, 56 바이트

난독 한 것이 아니라 간단한 해결책입니다.

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

1
[와는 ]불필요하다, 당신은 앞의 공간을 제거 할 수 for있으므로, 너무 :sum(int(c)**len(s)for c in s)
스 marinus

대단해! 팁 고마워.
danmcardle

1
공백 이 아닌 s = input()다른 문자를 제거하여 두 개의 문자를 저장할 수 있고 다른 하나 는 공백 print이 아닌 2.7로 이동 하여 저장할 수 있습니다 .
Ben

좋은 지적, 편집했습니다.
danmcardle

나는 중괄호를 추가하면 print(따라서 한 문자 이상) 이것이 유효한 Python 2.x 및 Python 3.x 솔루션이 될 것이라고 지적해야한다고 생각합니다 .
Martin Thoma

8

PHP, 80 74 66 자

매우 간단한 PHP 솔루션 :

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

그것은 가정 error_reporting달리 꽤 많은 추가 문자가 초기화에 필요한 것,주의 사항을 포함하지 않습니다 $s=0;$i=0.

많은 문자를 줄이기위한 Thx @manatwork.


별도의 명세서에 $ a와 $ l을 할당하지 마십시오. <?for($i=0;$i<$l=strlen($a=$argv[1]);$i++){$s+=pow($a[$i],$l);}echo$s==$a;더 짧습니다.
manatwork

통지를 생성하는 명령문이 이미 있으므로 다른 것을 추가하십시오. 루프 제어 변수 초기화를 제거하십시오. 루프 제어 변수를 증가시키는 것도 독립형 명령문 일 필요는 없습니다. 그리고 중괄호는 반드시 필요하지 않습니다 <?for(;$i<$l=strlen($a=$argv[1]);)$s+=pow($a[$i++],$l);echo$s==$a;.
manatwork

@manatwork : 따뜻한 환영에 감사 codegolf :
블라드 프레 다

이에 golfed 수 있습니다for(;$i<$l=strlen($a=$argn);)$s+=$a[$i++]**$l;echo$s==$a;
요 르그 Hülsermann에게

8

Dc : 48 자

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

샘플 실행 :

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

실제로 사용하지 마십시오 dc, 쓰기 시도에 열광적 인 오타를 저장cd
Stan Strum

8

K, 24 23

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

순서를 바꾸어 1 문자 면도

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

8

R, 53 바이트

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

gsub있도록 정규 표현식은 문자 사이에 공백을 삽입 scan기능은 숫자의 벡터로 수를 읽을 수 있습니다.


+1 나는 그렇게 생각하지 않았을 것입니다. 훌륭합니다.
plannapus


6

파워 쉘, 75 63 62 60 58

편집 : @ Iszi의 의견에 따라 업데이트되었습니다 (참고 : $x존재하지 않는 것으로 간주 )

편집 : @ Danko의 변경 사항이 추가되었습니다.

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

58 56 자

입력이 10 자리로 제한된 경우 (모든 int32 포함)

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

누군가 전에 PowerShell을 사용하려고하는지 궁금했습니다.
Iszi

다른 변수를 추가 $x하고를 사용 +=하여 합산을 수행하여 measure -sum테스트 하여 12자를 저장하십시오 $x-eq$n.
Iszi

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

1
@ DankoDurbić, 니스! 유형 강제 변환은 종종 PoSh 코드 골프에 유용합니다. 내가 '($x=$n=read-host)-split""|%{$x-=[math]::pow($_,$n.length)};!$x'.length
달리면

1
@Rynant 좋은 지적. PowerShell에서 길이 검사를 실행하고 62도 나타났습니다. 실제 스크립트 와 비슷하게 길이 검사를 실행하면 61이 표시됩니다. 이는 아마도 PowerShell ''이로 대체 한 것을 처리하는 방법 때문일 수 있습니다 ''. 원래 스크립트를 Excel로 가져 와서 다시 확인 =LEN("($x=$n=read-host)-split''|%{$x-=[math]::pow($_,$n.length)};!$x")하고 62도 얻었습니다. 물론, 우리는 항상 수동으로 계산할 수 있지만 누가 실제로 그렇게합니까?
Iszi

5

파이썬 2.x-51

Python 3.x에 대한 crazedgremlin의 솔루션과 동일한 개념 :

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

4

C- 97 93 자

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);}

들여 쓰기

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
int전역 변수 를 정의 할 필요는 없습니다 .
Konrad Borowski

우와 에 입력을 읽고 argc있습니다.
SIGSTACKFAULT

또한 -lm컴파일 타임 +1 바이트에서 수행하지 않아도 됩니까?
SIGSTACKFAULT

@Blacksilver -lmC89 컴파일러 에는 플래그가 필요하지 않습니다.
Josh

아하. 매일 새로운 것을 배우십시오.
SIGSTACKFAULT

4

델파이-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.

들여 쓰기

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 자

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

1
코드를 실행하기 위해 ms 수를 게시하지 말고 사용한 문자 수를 게시해야합니다. ;)
사용자 알 수 없음

3

awk : 40 39 자

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

샘플 실행 :

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

배쉬, 64 자

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

a = $ 1; p = $ {# a}; for ((; a> 0; a / = 10)); do s = $ ((s + (a % 10) ** p)); 완료; 에코 $ ( (s == $ 1))


1
단일 위치에서 변수 p를 사용하므로 필요하지 않습니다. 당신은에 변수 A의 초기화를 이동할 수 for의 분리를 여유 ;: for((a=$1;a>0;a/=10));do s=$[s+(a%10)**${#1}];done;echo $[s==$1].
manatwork

1
평가를 for하나의 문자 로 옮기면 더 많은 문자를 단축 할 수 있습니다 for((a=$1;a>0;s+=(a%10)**${#1},a/=10));do :; done;echo $[s==$1].
manatwork

오 궁금 해요! 나는 그런 것을 시도했지만 작동하지 않았다. 무엇이 잘못되었는지 궁금합니다.
사용자 알 수 없음

3

루아 (101 자)

루아는 간결한 것으로 알려져 있지 않지만 어쨌든 시도하는 것은 재미있었습니다.

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

개선을 환영합니다.


프로그램이 숫자 목록을 처리하고 처리 할 필요는 없으므로 바이트를 사용하여 해당 기능을 구현하지는 않습니다. 루프 for n in io.lines()do [...]end를 교체 n=io.read()하면 일부 바이트 ( TIO ) 가 절약 됩니다.
Jonathan Frech

3

자바 스크립트- 70 58 자

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

노트 :

Stack Exchange의 개발 콘솔에서이를 테스트하는 String.prototype경우이 솔루션을 중단 시키는 여러 비표준 속성이 추가되어 있습니다 (예 :) String.prototype.formatUnicorn. 과 같은 깨끗한 환경에서 테스트하십시오 about:blank.


나는 거기에 70자를 셉니다.
manatwork

@manatwork, 으악, 개행을 계산하는 것을 잊었다.
zzzzBov

그 속임수에 큰 트릭!
manatwork

2
그것은 true입력에 상관없이 항상 나를 위해 돌아옵니다
koko

@koko, 왜 잘못된 결과를 받는지 설명하는 메모를 추가했습니다.
zzzzBov

3

자바-84 바이트

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

비 람다 버전 : 101 바이트 :

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

다음과 같이 호출됩니다.

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));
}

보고:

true
true
false
false

람다 인수 주위의 괄호를 제거 할 수 있으며 a,l->정확히 동일하게 작동합니다.
FlipTack

나는 당신이 거의 일년 전에이 대답했습니다 알아,하지만 당신은 골프 2 바이트 수 있습니다 (a,l)->될 수 있습니다 a->l->byte수 있습니다 int:a->l->{int s=0;for(int c:a.getBytes())s+=Math.pow(c-48,l);return a.equals(""+s);}
케빈 Cruijssen

3

Japt , 14 9 7 바이트

¶ì_xpZÊ

온라인으로 사용해보십시오


설명

정수의 묵시적 입력 U.

ì_

변환 U숫자의 배열 ( ì) 함수를 통해 통과 한 후 다시 정수로 변환한다.

xpZÊ

공정에서 배열 의 길이 ( )의 x거듭 제곱 ( p) 까지 각 요소를 더하여 ( ) Ê더합니다.

결과가과 정확히 같은지 확인하십시오 U.


나는 ¥U¬®n pUlÃx11 바이트에서 작동 한다고 생각 합니다.)
Oliver


2

일반적인 Lisp- 116102

(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))))

형식화 :

(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

스몰 토크 -102 99 자

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

작업 공간 value:에서 번호와 함께 보내고 인쇄하십시오.


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

하스켈, 68 66 바이트

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

용법:

*Main> sum.(\a->map(^length a)a).d>>=(==) $ 1634
True
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.