본인 번호입니까?


31

자기 번호 (또한 콜롬비아 또는 Devlali 번호라고 함)은 자연수 인 x, 방정식 여기서 n + <digit sum of n> = x임의의 자연수에 대한 해결책이 없다 n. 예를 들어 21n = 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이면 숫자는 자체 숫자가 아닙니다.

입력 2021의 경우 출력은 다음과 같습니다.

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추가 sjdTd? 나는 그런 것을 본 적이 없습니다
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출력 될 91100각각 별도의 라인.

실행 및 디버깅


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.