본인 번호입니까?


31

자기 번호 (또한 콜롬비아 또는 Devlali 번호라고 함)은 자연수 인 x, 방정식 여기서 n + <digit sum of n> = x임의의 자연수에 대한 해결책이 없다 n. 예를 들어 21 은 n = 15결과 로 표시 되는 자체 번호가 아닙니다 15 + 1 + 5 = 21. 한편, 20 은n 그러한 평등을 만족하는 것을 찾을 수 없기 때문에 자기 번호 입니다.

이 정의는 숫자 합을 참조하므로 기본에 따라 다릅니다. 이 도전의 목적을 위해, 우리는 OEIS의 시퀀스 A003052 인 기본 10 자릿수 만 고려할 것 입니다. 이진 ( A010061 ) 및 기본 100 ( A283002 ) 자체 번호도 계산되었습니다.

도전

x입력 으로 양의 정수가 주어지면 x10 진수의 자릿수이면 참 값을, 그렇지 않으면 거짓 값을 출력하십시오. 진실과 거짓 값에 대한 설명은 주제에 대한이 메타 게시물을 참조하십시오 .

전체 프로그램 또는 기능을 작성할 수 있으며 일반적인 채널에서 입력 및 출력을 제공 할 수 있습니다. 물론 표준 허점 은 금지되어 있습니다.

이것은 이므로 답이 짧을수록 (바이트) 더 좋습니다!

테스트 사례

진실한 :

1
3
5
7
9
20
31
86
154
525

팔시 :

2
4
6
8
10
15
21
50
100
500

샌드 박스 링크

리더 보드

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

# Ruby, <s>104</s> <s>101</s> 96 bytes

헤더에 여러 숫자를 포함하려는 경우 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

# Perl, 43 + 2 (-p flag) = 45 bytes

언어 이름을 링크로 만들어 리더 보드 스 니펫에 표시 될 수도 있습니다.

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


유효한 결과물에 대한 토론 / 의견 불일치가있는 것 같아서, 내가 의도 한 바에 대해 명확하지 않은 것으로 생각합니다. 나는 이 메타 게시물을 참조하여 희망적으로 정리 해야하는 문장을 추가했습니다 . 내가 이것에 대해 혼란을 줬다면 죄송합니다!
— Sok

더 많은 혼란을 야기하지는 않지만 이 토론 은 왜 혼란이 있었는지에 관련 이 있다고 생각 합니다 . 이전 합의를 사용하는 경우 if / else 구문이없는 언어로 게시하기 어려울 수 있으므로 향후 과제를 수행 할 때이 점을 고려하십시오.
— FryAmTheEggman

@FryAmTheEggman 나는 합의가 바뀌 었다는 것을 깨닫지 못했고, 지금은 유쾌한 느낌이 듭니다. 내가 게시하는 다음 도전에 대해 명심할 것이다. 감사
— Sok

2
나는 어떤 종류의 숫자도 아닙니다! 나는 자유로운 사람입니다!
— David Richerby

1
@DavidRicherby * 당신 후 흰 공을 보냅니다 *
— Sok

답변:



7

자바 (JDK 10) , 84 바이트

i->{for(int n=i;i-->1;)i|=((""+i).chars().map(x->x-48).sum()+i^n)-1>>-1;return~i<0;}

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

설명

i->{                                    // IntPredicate
  for(int n=i;i-->1;)                   //  for each number below n
    i|=(                                //   keep the sign of
      (""+i).chars().map(x->x-48).sum() //    sum of digits
      +i                                //    plus the number
      ^n                                //    xor n (hoping for a zero)
     )-1>>-1;                           //    changing that into a negative number if equals to zero
  return~i<0;                           //  return i>=0
}

크레딧


1
-1 바이트 :n->{int i=n,r=0;for(;i-->0;)r=(""+i).chars().map(x->x-48).sum()+i==n?1:r;return r<1;}
— Kevin Cruijssen

2
84 바이트 :i->{for(int n=i;i-->1;)i|=((""+i).chars().map(x->x-48).sum()+i^n)-1>>-1;return~i<0;}
— Nevay


5

Brachylog , 12 바이트

¬{⟦∋Iẹ+;I+?}

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

설명

¬{         }    Fails if succeeds, suceeds if fails:
  ⟦∋I             I ∈ [0, ..., Input]
    Iẹ+           The sum of the elements (i.e. digits) of I...
       ;I+?       ... with I itself results in the Input

1
인가 false.하는 방식으로 객관적인 방법에 의해 truthy 값 true.아니다는? 나는 그렇게 생각하지 않으며, 그것은 메타 합의에
— Sok

1
@Sok 나는 당신의 우려를 해결하기 위해 3 개의 흥미없는 바이트를 추가했습니다.
— Fatalize


4

옥타브 , 49 47 44 바이트

@(x)arrayfun(@(k)k+sum(num2str(k)-48)-x,1:x)

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

설명:

num2str입력 숫자보다 많은 경우 공백을 구분 기호로 포함하는 문자열을 반환 하므로 범위에서 작업을 수행하는 것은 번거롭고 길다 . 따라서 48을 빼면 다음과 같이 1 -16 -16 2 -16 -16 3 -16 -16 4입력 범위가 1 ... 4 입니다. 모든 -16바이트를 제거하려면 많은 바이트가 필요합니다.

따라서 우리는 이것을 사용하여 루프로 이것을 할 것 arrayfun입니다. 번호의 각각에 대해 K = 1 ... X , x는 입력이고, 우리는 추가 k하고 그 자리 합 뺀다 x. 이것은 k의 각 숫자에 대한 연산 결과와 함께 배열을 반환합니다 . 배열의 숫자 중 하나가 0이면 숫자는 자체 숫자가 아닙니다.

입력 20및 21의 경우 출력은 다음과 같습니다.

20:  -18, -16, -14, -12, -10, -8, -6, -4, -2, -9, -7, -5, -3, -1, 1, 3, 5, 7, 9, 2
21:  -19, -17, -15, -13, -11, -9, -7, -5, -3, -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 1, 3

input의 20경우 0이 아닌 요소와 input의 경우 0이 아닌 요소가 하나 이상 21있습니다. 그것은 그것이 20자기 번호이며, 21그렇지 않다는 것을 의미합니다 .

옥타브는 TIO- 링크에서 볼 수 있듯이 하나 이상의 0을 가진 배열을 false로 취급합니다.


4

MATL , 11 바이트

t:tFYA!Xs+-

출력은 비어 있지 않은 배열이며, 모든 항목이 0이 아닌 경우에는 진실이며 하나 이상의 0이 포함 된 경우에는 거짓입니다.

온라인으로 사용해보십시오! 또는 진실 / 거짓 테스트를 포함한 모든 테스트 사례를 확인하십시오 .

설명

n = 10예를 들어 입력 을 고려하십시오 .

t       % Implicit input, n. Duplicate
        % STACK: 10, 10
:       % Range
        % STACK: 10, [1 2 3 4 5 6 7 8 9 10]
t       % Duplicate
        % STACK: 10, [1 2 3 4 5 6 7 8 9 10], [1 2 3 4 5 6 7 8 9 10]
FYA!    % Convert to base 10 digits and transpose
        % STACK: 10, [1 2 3 4 5 6 7 8 9 10], [0 0 0 0 0 0 0 0 0 1
                                              1 2 3 4 5 6 7 8 9 0]
Xs      % Sum of each column
        % STACK: 10, [1 2 3 4 5 6 7 8 9 10], [1 2 3 4 5 6 7 8 9 1]
+       % Add, element-wise
        % STACK: 10, [2 4 6 8 10 12 14 16 18 11]
-       % Subtract, element-wise
        % STACK: [8 6 4 2 0 -2 -4 -6 -8 -1]
        % Implicit display


3

젤리 , 6 바이트

ḟDS+Ɗ€

입력 n의 경우 n 이 자체 번호 인 경우 [n]을 반환 하고 그렇지 않은 경우 []를 반환합니다.

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

작동 원리

ḟDS+Ɗ€  Main link. Argument: n

     €  Call the link to the left for each k in [1, ..., n].
    Ɗ     Drei; combine the three links to the left into a monadic chain.
 D          Decimal; map k to the array of its digits in base 10.
  S         Take the sum.
   +        Add k to the sum of the k's digits.
ḟ       Filterfalse; promote n to [n], then remove all elements that appear in the
        array to the right.
        This returns [n] if the array doesn't contain n, [] if it does.

이 6 개의 문자를 6 바이트로 압축하는 인코딩은 무엇입니까?
— WGroleau




3

J , 28, 24, 22 21 바이트

Conor O'Brien 덕분에 -1 바이트

ngn 덕분에 -2 바이트

$@-.(+1#.,.&.":)"+@i.

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

설명:

i. 목록 0 .. n-1

( )"+ 목록의 각 항목에 대해

.,.&.": 자릿수 목록으로 변환하고

1# 그들의 합계를 찾으십시오

+ 항목에 추가

$@-. 인수에서 목록을 제외하고 모양을 찾으십시오.


1
나는 이것이 오래된 게시물이라는 것을 알고 있지만 (-1 바이트) 일 "0 i.수 있습니다 "+i..
— 코너 오브라이언

1
@ ConorO'Brien 감사합니다! 당시 나는 이런 종류의 골프를 몰랐다. 지금 나는 그것을 사용한다 (기억할 때 :))
— Galen Ivanov

1
-.@e.->$@-.
— ngn

@ngn 정말 감사합니다!
— Galen Ivanov

1
@GalenIvanov도 [:( )"+i.->( )"+@i.
— ngn

2

파이썬 2, 70 66 바이트

lambda x:[i for i in range(x)if i+sum([int(j)for j in`i`])==x]==[]

편집 : @ user56656 덕분에 -4


1
python2에서는 4 바이트를 저장 하는 `i`대신 사용할 수 있습니다 str(i).
— 밀 마법사

@ user56656 감사합니다, 나는 그것에 대해 몰랐어요
— sonrad10

1
당신은을 놓을 수 [및 ]내부sum
— 씨 Xcoder

lambda x:[i for i in range(x)if i+sum(map(int,`i`))==x]==[]
— B. Eckles

lambda x:all(i+sum(map(int,`i`))-x for i in range(x))
— B. Eckles

2

피스 , 8 바이트

!/m+sjdT

테스트 스위트.

진실 / 거짓 값의 교환이 허용되는 경우 ! 7 바이트를 제거하고 대신 얻을 . Sok 의 제안 중 하나가 2 바이트 골프를하는 데 도움이되었습니다.

설명

! / m + sjdT – 전체 프로그램. STDIN에서 입력 Q를 가져와 True 또는 False를 출력합니다.
  m – 변수 d를 사용하여 [0 ... Q) 범위에 걸쳐 매핑합니다.
     jdT – d를 밑 10으로 변환합니다.
    s – 합계
   + – 그리고 d를 그 자체에 더합니다.
 / – 결과에서 Q의 발생 횟수를 계산합니다.
! – Negate. 암시 적으로 결과를 출력합니다.

나는 알지 .AmnQ+dsjdT못했다 /. 나는 Pyth를 오랫동안 제대로 사용하지 않은 것 같습니다! +1
— Sok

@Sok은 /기본적으로 목록에서 요소의 발생 횟수를 계산합니다. }객체를 목록에 표시할지 테스트하는을 사용할 수도 있지만 동일한 바이트 수라고 생각합니다.
— Mr. Xcoder

필자 S는 필요하지 않다고 생각합니다. 입력은 양의 정수이므로 0매핑 목록에있는 것이 문제가되지 않습니까? 적어도 주어진 테스트 사례에서 작동하는 것 같습니다.
— Sok

@Sok Great, 당신이 맞아요! 이 덕분에 한 바이트 더 면도했습니다.
— Mr. Xcoder

어떻게 +sjdT추가 sjdT로 d? 나는 그런 것을 본 적이 없습니다
— RK.

2

펄 6 , 39 33 바이트

{!grep $_,map {$_+[+] .comb},^$_}

사용해보십시오!

암시 적 단일 매개 변수가있는 베어 블록

say {!grep $_,map {$_+[+] .comb},^$_}(500);
> False
say {!grep $_,map {$_+[+] .comb},^$_}(525);
> True

이후 n + digits(n) >= n쿼리 값까지 모든 숫자에 대한 콜롬비아 숫자를 계산하고 일치하는지 확인할 수 있습니다. 따라서 주어진 입력에 대한 콜롬비아 수를 계산합니다.

{$_ + [+] .comb}

목표까지 모든 값에 적용됩니다.

(^$_).map({$_+[+] .comb})

그러나 @nwellenhof가 지적한 것처럼 그 값이 무엇인지가 아니라 일치하는지 여부 만 신경 쓰므로 grep 할 수 있습니다.

grep $_, map {$_+[+] .comb}, ^$_

나머지는 단지 블록에 싸서 부풀 리도록 강요됩니다.

39 바이트

{!((^$_).map({$_+[+] .comb}).any==$_)}

@Emigna에서 제공하는 TIO 테스트 링크

@nwellenhof는 grep을 사용하면 6 바이트를 절약 할 수 있다고 지적했습니다!


1
멋진 솔루션! 테스트 목적으로 TIO 링크 를 추가 할 수 있습니다 .
— Emigna




2

Japt -d! , 6 바이트

N¥U+ìx

시도 해봐


원본, 8 바이트

진실 또는 거짓에 대한 입력 번호를 반환합니다 0. JavaScript에서 빈 배열 만 잘못된 경우 7 바이트 일 수 있습니다.

ÂNkUÇ+ìx

시도 해봐


설명

             :Implicit input of integer U
   UÇ        :Generate the range [0,U) and pass each Z through a function
      ì      :  Digits of Z
       x     :  Reduce by addition
     +       :  Add to Z
  k          :Remove the elements in that array
 N           :From the array of inputs
            :Bitwise NOT NOT (~~), casts an empty array to 0 or a single element array to an integer 

대안

Ç+ìxÃe¦U

시도 해봐

             :Implicit input of integer U
Ç            :Generate the range [0,U) and pass each Z through a function
  ì          :  Digits of Z
   x         :  Reduce by addition
 +           :  Add to Z
    Ã        :End function
     e       :Every
      ¦U     :  Does not equal U

1

망막 , 55 바이트

.+
*
Lv`_+
_+
$&$.&
^_+
$&¶$&
\d
*
Cms`^(_+)\b.*¶\1\b
0

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 설명:

.+
*

입력 x을 단항으로 변환합니다 .

Lv`_+

x아래 에서 까지 범위를 만듭니다 1.

_+
$&$.&

각각의 10 진수 값을 n단항으로 접미사 로 붙입니다.

^_+
$&¶$&

의 사본을 만드십시오 x.

\d
*

의 각 10 진수 n를 단항으로 변환 하여의 기존 사본에 숫자를 추가하십시오 n.

Cms`^(_+)\b.*¶\1\b

x결과에 나타나는지 확인하십시오 .

0

결과를 반전시킵니다.






1

레티 나 , 24 바이트

.+
*

$.`¶$`
\d
*
D`
.\z

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

단항으로 입력 된 18 바이트 일 수 있지만 다른 Retina 답변은 십진수도 사용하므로 십진수를 사용하면 공정한 비교를 할 수 있다고 생각했습니다.

설명

.+
*

_단항 숫자로 입력을 단항으로 변환합니다 .


$.`¶$`

문자열의 각 위치 (예 : 시작, 종료 및 모든 문자 쌍 사이)에 $.`접두사 길이 (또는 일치하는 0 색인 위치), 줄 바꿈, $`접두사 자체 (예 : 0 인덱스 위치의 단항 표현). 예를 들어 입력이 3있고 단항 표현 이 있다면 ___결과는 다음과 같습니다.

0
_1
__2
___3
___

다시 말해, 우리는 0에서 입력 (포함)까지 각 숫자에 대해 한 줄을 얻습니다. 여기에는 해당 숫자의 단항 및 소수 표현이 모두 포함됩니다.

\d
*

각 자릿수를 단항으로 변환하면 각 행의 자릿수 합계를 효과적으로 계산하여 숫자 자체에 모두 단항으로 추가합니다.

D`

중복 된 줄. 이것은 실제로 중복 행을 삭제하지 않고 빈 행으로 지 웁니다. 따라서 0에서 입력까지의 숫자에 숫자 합을 더한 값이 입력과 같으면 마지막 행이 지워집니다. 그렇지 않으면 마지막 줄이 그대로 유지됩니다.

.\z

마지막 줄에 문자가 있는지 확인하십시오. 우리는 $후행 줄 바꿈 (정확히보고 싶지 않은 곳) 앞에 일치하기 때문에 사용할 수 없습니다 .


1

Bash + GNU Coreutils, 91 바이트

진실하거나 거짓을 반환합니다.

e=1;for((i=1;i<=$1;i++));{ [ $(bc<<<`grep -o . <<<$i|tr '\n' +`$i) -eq $1 ]&&e=0; };exit $e

1

코 틀린 , 48 바이트

x->(1..x).all{v->"$v".sumBy{it.toInt()-48}+v!=x}

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

설명:

(1..x)      // Range of numbers from 1 to x
.all{v->    // Function expression that checks if ALL values evaluate to tru
"$v"        // Convert the value into a string
.sumBy{it.toInt()-48} // For each character, get the ASCII char value, subtract 48 in order to get it back to the numerical value, and then sum it up
+v          // Add the original number
!=x}        // Ensure that it does not equal the input

1

추가 ++ , 27 바이트

D,g,@,BDB+A+BK=
L,RbUABkºg!

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

작동 원리

D,g,@,		; Create a monadic function 'g'
		; Example argument:		[15]
	BD	; Digits;		STACK = [[1 5]]
	B+	; Sum;			STACK = [6]
	A+	; Add argument;		STACK = [21]
	BK=	; Equals input;		STACK = [1]

L,		; Create a lambda function
		; Example argument:		[21]
	RbUABk	; Push range;		STACK = [1 2 3 ... 19 20 21]
	ºg	; Any true from 'g';	STACK = [1]
	!	; Logical NOT;		STACK = [0]


1

Stax , 8 바이트

Å8avj╒Éπ

실행 및 디버깅

설명

ASCII 상응 :

{cE+|+x=f!
{       f     Filter [1..input] with block
 cE           Decimal digits of current value
   +|+        Sum of digits and the current value
      x=      Equals input
         !    Logical not, maps empty array to 1 and non-empty array to 0

fcE+|+x=Stax 프로그램은 자릿수 자체가 입력과 동일한 모든 숫자를 출력합니다. 예를 들어 위해 101출력 될 91과 100각각 별도의 라인.

실행 및 디버깅


1

Pyt , 7 바이트

ĐřĐŚ+∈¬

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

참 / 거짓 값을 바꾸는 것이 허용되면 ¬끝에는 6 바이트 동안 삭제 될 수 있습니다.

설명:

        Implicit input
Đ       Duplicate input
ř       Get [1,2,...,input]
Đ       Duplicate the top of the stack
Ś       Get the sum of the digits of each element in the array
+       Add the top two items on the stack element-wise
∈       Is the input in the list?
¬       Negate the top of the stack
        Implicit print

1

J , 20 바이트

#@-.i.+1#.10#.inv i.

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

                  i.     Range [0,n-1]
          10#.inv        To base 10
       1#.               Sum the digits
    i.+                  Plus the corresponding number
  -.                     Remove from the input, leaves an empty list if it was a self number.
#@                       An empty list is truthy, so return the length instead.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.