n으로 끝나고 n으로 나눌 수 있고 숫자의 합이 n 인 가장 작은 양의 정수를 찾으십시오.


33

제목에 모두 있습니다 ...

양의 정수를 입력으로 받아 n>=12제목의 내용을 수행하십시오.

예, OEIS A187924에 있습니다.

일부 테스트 사례

12 -> 912  
13 -> 11713  
14 -> 6314  
15 -> 915  
16 -> 3616  
17 -> 15317  
18 -> 918  
19 -> 17119 
20 -> 9920  
40 -> 1999840   
100-> 99999999999100

이것은 입니다. 바이트 단위의 최단 코드가 승리합니다!


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Martin Ender

채팅으로 옮겨진 부분의 일부를 닫으려면 : OEIS에 대한 나의 편집 내용은 11이 해결책이없는 유일한 번호임을 증명했습니다.
Ørjan Johansen

답변:


19

펀칭, 81 바이트

&>00p0v<!%g0<
v%"d":_>1+:0^
>00g->#^_:0v
0g10g-#^_.@1>
>0p:55+/\:v>
^1+g01%+55_$^

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

적어도 n = 70 까지 처리 할 수 있으며 대부분의 구현에서 일부 값이 스택 셀 크기를 오버플로하기 시작하고 그렇지 않은 경우에는 기다릴 가치가 없습니다.

이러한 제약 조건을 감안할 때, 우리는 심지어의 값을 처리하기 위해 노력하고 귀찮게하지 않습니다 n 개의 하는 수단 (99)보다 더 큰을 우리가 할 수있는 더 쉽게 테스트 경우의 값 종료 n은 단순히으로 값 모듈 (100)을 비교하여과 N .

아래는 코드에 대한 자세한 설명입니다.

Source code with execution paths highlighted

*stdin에서 n 을 읽고 메모리에 저장하십시오.
*테스트 값 v 를 0으로 초기화하고 v 를 앞쪽으로 증가 시키면서 메인 루프를 시작합니다 .
*경우 v%n == 0, 주 루프의 시작으로 돌아 가지 않으면 테스트하십시오 .
*경우 v%100 == n, 주 루프의 시작으로 돌아 가지 않으면 테스트하십시오 .
*숫자의 합계 V를 반복적으로 첨가하여 V의 모듈 (10) 및 분할 V를 (10)에 의해
*합이 동일한 경우 테스트 N , 메인 루프의 처음으로 복귀하지 않는 경우.
*그렇지 않으면 v를 출력 하고 종료하십시오.


12

05AB1E , 14 바이트

[NI«ÐIÖsSOIQ*#

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

설명

접두사가 큰 솔루션은 TIO에서 시간 초과됩니다.

[                # start a loop
 NI«             # append input to current iteration number
    Ð            # triplicate
     IÖ          # is the first copy evenly divisible by input?
       sSOIQ     # is the digit sum of the second copy equal to the input?
            *    # multiply
             #   # if true, break loop
                 # output the third copy

05AB1E가 속임수 인 것처럼 느껴지면 너무 좋기 때문입니다. 마일을 이길 수있는 유일한 방법은 과거 언어를 참조하는 프로그래밍 '압축'언어를 만드는 것입니다. 내가 제출 ANS = DIC [1] 롤
패스 파인더

@Pathfinder : 지속적으로 05AB1E를 능가 할 수있는 몇 가지 언어가 있으므로, 우리는 여전히 더 짧은 것을 볼 수 있습니다 :)
Emigna

12

자바 스크립트 (ES6), 55 54 바이트

f=(s,p=0,a=p+s)=>a%s|eval([...a].join`+`)-s?f(s,p+1):a
<input type=number min=12 oninput=o.textContent=f(this.value)><pre id=o>

입력을 문자열로받습니다. 더 큰 결과를 얻으려면 꼬리 재귀를 지원하는 브라우저가 필요합니다. 편집 : @ Arnauld 덕분에 1 바이트가 절약되었습니다.


eval([s,...a].join`-`)?더 짧지는 않지만 작동 할 것입니다 ...
ETHproductions

@Arnauld 아니요, 나는 그걸로 할 수 있다는 것을 잊었습니다 ||.

8

Brachylog v2, 12 10 바이트

a₁.;A×?≜ẹ+

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

이것은 입력을 통해 .출력을 통해 생성 하는 함수 제출입니다 ?(일반적인 규칙과 반대입니다. 모든 Brachylog 함수에는 정확히 두 개의 인수가 있습니다.이 인수는 입력 또는 출력 인수가 가능하지만 언어는 특정 인수 사용을 강제하지 않습니다). 우리 는 일반적으로 PPCG에서 인수 사용에 관한 규칙을 고려하지 않습니다 .

설명

이 솔루션의 이전 버전에는 Ḋ|단일 숫자에 대해 특별한 경우 ( 즉, "문자 그대로 숫자 반환")가 있었지만 질문은 분명히 확인할 필요가 없습니다 (@DLosc 덕분에 이것을 잡을 수 있기 때문에). 그것. Brachylog는 무한 루프를 방지하기 위해 곱셈에서 1을 알 수없는 가능성으로 간주하지 않으므로 곱셈은 임의 자릿수이므로 작성된 솔루션은 한 자리에서 작동하지 않습니다.

따라서이 답변은 이제 사양을 거의 직접적으로 번역합니다. 시작 ?(출력 / 수는 우리가 찾으려고 노력하고, Brachylog 술어는 항상 암시 적으로 시작 ?) 우리가 사용하는 a₁.이가 주장하는 .접미사로 (입력)를. 그런 다음 결과에 무언가 ( )를 ;A×?곱하여 ( 출력) 산출 할 수 있음을 의미합니다 . 마지막으로 의 자릿수 ( )를 합산 하고 기본적으로 최종 결과가 생성하는 모든 Brachylog 프로그램 끝에 암시 적 주장이 있습니다 . 그래서 다른 말로하면,이 프로그램은 " 의 접미사되고 , 무언가를 곱 , 의 숫자 합×;A?ẹ++?..?.?.?"은 원래 프로그램의 문자 번역과 매우 유사합니다.

숫자의 합이 요구 사항이 적용되어야 할 필요가있다. 나는 뭔가에 대한 가정 (가) 그래서 미지수 좋아하지 않는 프로그램이 아닌 대수의 일부에 대한 무차별 접근 방식을 사용하는 Brachylog을 알려줍니다.


6

하스켈 , 72 바이트

f n=[x|x<-[n,n+lcm n(10^length(show n))..],sum[read[j]|j<-show x]==n]!!0

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

찾은 수에서 n을 뺀 값은 n과 10 ^ length (n)의 배수 여야합니다.

라이 코니와 완전히 인간적인 영감


사이트에 오신 것을 환영합니다!
DJMcMayhem

3
변경 lcm n(10^length(show n))lcm(10^length(show n))n1 바이트
H.PWiz

6

Alice , 35 바이트

/o
\i@/!w?+.?~\ & /-$K..?\ L z $ /K

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

설명

이 프로그램은 Cardinal (정수 처리)과 Ordinal (문자열 처리) 모드 사이에 정말 좋은 혼합과 상호 작용이 있습니다.

카디널 모드에서 주로 작동하는 10 진수 I / O 관련 문제에 대한 일반적인 프레임 워크 :

/o 
\i@/...

그리고 실제 프로그램 :

!     Store the input N on the tape.
      We'll use an implicit zero on top of the stack as our iterator variable X,
      which searches for the first valid result.
w     Store the current IP position on the return address stack. This marks
      the beginning of the main search loop. We can avoid the divisibility
      test by going up in increments of N. To check the other two 
      conditions, we'll use individual conditional loop ends that skip to 
      the next iteration. Only if both checks pass and all loop ends are 
      skipped will the search terminate.

  ?+    Increment the iterator X by N.
  .     Duplicate X.
  ?~    Put a copy of N underneath.
  \     Switch to Ordinal mode.
  &     Implicitly convert X to a string, then fold the next command over its
        characters, i.e. its digits. Here, "fold" means that each character
        is pushed to the stack in turn, followed by one execution of that
        next command.
  /     Switch back to Cardinal mode (this is not a command).
  -     Fold subtraction over the digits. This implicitly converts each 
        digit back to its numerical value and subtracts it from N. If the
        digit sum of X is equal to N, this will result in 0.
  $K    Jump back to the w if the digit sum of X isn't N.
  ..    Duplicate X twice.
  ?     Get a copy of N.
  \     Switch to Ordinal mode.
  L     Shortest common superstring. Implicitly converts X and N to strings
        and gives the shortest string that starts with X and ends with N. 
        This will be equal to X iff X already ends with N. Call this Y.
  z     Drop. If X contains Y, this deletes everything up to and including
        Y from X. This can only happen if they are equal, i.e. if X ended
        with N. Otherwise X remains unchanged.
  $     Skip the next command if the string is empty, i.e. if X ended with N.
  /     Switch back to Cardinal mode.
  K     Jump back to w if X didn't end with N.

5

자바 (오픈 JDK 8) , 136 (110) 103 92 바이트

JollyJoker에게 감사합니다 -26

JollyJoker 덕분에 다시 -7

Oliver Grégoire 덕분에 -11 감사합니다

a->{for(int i=a;!(""+a).endsWith(""+i)|i!=(""+a).chars().map(x->x-48).sum();a+=i);return a;}

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

Java를 좋아해야합니다! 비효율적 인 접근 방식을 사용하고 있지만 내장 체크섬 기능과 문자열로의 이중 변환이 없기 때문에 바이트 수 바이트의 끝을 확인합니다.

언 골프 드 :

  a->{                                                       //input n (as integer)
      for (int i = a;                                        //initiate loop
           !("" + a).endsWith("" + i)                        //check if the calculated number ends with the input
           | i != ("" + a).chars().map(x -> x - 48).sum();   //check if the checksum is equal to the input
           a += i)                                           //for every iteration, increase i by the input to save checking for divisibility
        ;                                                    //empty loop body, as everything is calculated in the header
    return a;                                                //return number
}

1
(""+i).endsWith(""+a)작동해야합니다.
JollyJoker

@JollyJoker 화려한, 바보 같은 느낌을 주셔서 감사합니다 : P
Luca H

1
허. n/=10대신에 n=n/10. 또한 i+=afor 루프에서 분할 검사를 건너 뛸 수 있습니다.
JollyJoker

@JollyJoker 와우, 나는 합계를 위해 그것을했지만 부문을 위해 그것을하지 않았다 ... 감사합니다, 곧 추가하겠습니다
Luca H

1
API를 사용하여 자신을 계산하는 것보다 짧은 92 바이트 또한 세미콜론은 바이트 수의 일부가 아닙니다. 예를 들어 유효한 람다가 메서드 인수로 제공 될 수 있으므로 세미콜론이 필요하지 않습니다.
Olivier Grégoire


3

파이썬 2 , 74 바이트

이 솔루션은을 가정합니다 n <= sys.maxint.

n=x=input()
while sum(map(int,str(x)))-n*str(x).endswith(`n`):x+=n
print x

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


교체 str(x)x6 바이트 (어떻게 내부 백 틱 백 틱 탈출합니까?) 저장 두 번 다시-틱.
Chas Brown

`백틱 내부의 @ChasBrown 백 슬래시 틱.
wvxvw

@ChasBrown 아니오, 긴 정수 L는 알고리즘을 망칠 수 있는 정수를 추가합니다 .
FlipTack

3

C (gcc) 71 69 바이트, 100에서 실패

길고 % 1000으로 시도했지만 시간 초과

steadybox 덕분에 -2 바이트

s,i,j;f(n){for(j=0;s^n|j%100!=n;)for(s=0,i=j+=n;i;i/=10)s+=i%10;j=j;}

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


j * = 1 == return j trick으로 오늘 새로운 트릭을 배웠습니다. 좋은 코드입니다.
Michael Dorgan



@Steadybox 감사합니다, 그렇게 할 것입니다
PrincePolka


2

C # (. NET 코어) , 90 84 83 + 18 = 101 바이트

using System.Linq;
n=>{for(int i=n;!(""+n).EndsWith(""+i)|n%i>0|(""+n).Sum(c=>c-48)!=i;n++);return n;}

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

  • Emigna 덕분에 6 바이트가 절약 (""+n)되었으며 일부 장소와 n.ToString()다른 장소에서 글을 쓸 수 없었 습니다.

n=>{for(int i=n;n%100!=i|n%i>0|(""+n).Sum(c=>c-'0')!=i;n++);return n;}20 바이트를 절약합니다.
Emigna

@Emigna 왜 n%100? 만약에 n>100?
Charlie

예, 그 부분은 무시하십시오. 2 자리 입력으로 테스트 한 것입니다. 모드는 10 ^ len (input)이어야합니다. 아마 가치가 없을 것입니다.
Emigna




1

자바 스크립트 REPL (ES5), 60 59 바이트

for(n=prompt(i=0);eval([].join.call(t=++i+n,'+'))-n|t%n;);t

@totallyhuman 고정
l4m2

콘솔에서 내가 추측 있도록 경고 ()없이 출력
l4m2

0

하스켈 , 75 바이트

f n=[x|x<-[0,n..],sum[read[d]|d<-show x]==n,mod x(10^length(show n))==n]!!0

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

설명:

f n=[x|                                      ]!!0 -- Given input n, take the first x
       x<-[0,n..],                                -- which is a multiple of n,
                  sum[read[d]|d<-show x]==n,      -- has a digital sum of n
                  mod x(10^length(show n))==n     -- and ends in n.

"끝 n"부분을 줄일 수 있는지 궁금합니다 . 나는 또한 시도 show n`elem`scanr(:)""(show x)했지만 더 길다.





0

PowerShell , 84 바이트

for($n=$i=$args[0];$i%$n-or$i-notmatch"$n$"-or([char[]]"$i"-join'+'|iex)-$n){$i++}$i

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

간단한 구성이지만 긴 명령. 에 대한 TIO에서 시간 초과 n=100되지만 명시 적 i으로 닫기로 설정 하면 올바르게 출력됩니다.

이것은 for조건 중 하나에 해당되는 한 계속되는 간단한 루프입니다. 세 가지 조건은 1) $i%$n, 즉 우리에게는 나머지가 있습니다. 2) $i-notmatch"$n$"즉, 마지막 두 자리 숫자와 정규 표현식이 일치하지 않습니다. 3) ([char[]]"$i"-join'+'|iex)-$n즉, 합산 된 숫자가 같지 않습니다 $n(여기서는 0이 아닌 값이 사실이기 때문에 간단한 빼기로 확인). 루프 안에서 간단히 증가하고 $i있습니다.

따라서 나머지가없고 정규식이 일치하고 숫자가 같으면 세 가지 조건이 모두 $false있고 루프를 종료합니다. 결과적으로 $i파이프 라인을 그대로두고 출력이 암시 적입니다.


0

PHP, 73 + 1 바이트

while(array_sum(str_split($i+=$n=$argn))-$n|$i%10**strlen($n)-$n);echo$i;

로 파이프로 실행하십시오 -R.

까지의 $i배수를 반복 하고 거짓입니다. 그런 다음 인쇄합니다 .<input>sum_of_digits-<input>tail_of_i-$ni


0

m4, 210 바이트

define(d,define)d(i,ifelse)d(s,`i($1,,0,`eval(substr($1,0,1)+s(substr($1,1)))')')d(k,`r($1,eval($2+1))')d(r,`i(s($2),$1,i(regexp($2,$1$),-1,`k($1,$2)',i(eval($2%$1),0,$2,`k($1,$2)')),`k($1,$2)')')d(f,`r($1,1)')

f답을 계산 하는 매크로 를 정의합니다 . 사용할 수 없을 정도로 약간 느리지 만 작동한다고 약속합니다.

m4는 기본적으로 정수를 문자열로 취급하기 때문에 좋을 것이라고 생각했지만 이것은 매우 나쁩니다.


0

스칼라, 120 바이트

def a(n:Int)={val b=math.pow(10,math.ceil(math.log10(n))).##;var c=b+n;while(c%n!=0||(0/:c.toString)(_+_-'0')!=n)c+=b;c}

이 때까지 작동 n = 70하며 그 후에 정수가 오버플로됩니다. 하나의 추가 문자의 경우 Int는로 변경하고 Long값을 n > 100계산할 수 있습니다.

다음은 약간 긴 ungolfed 버전입니다.

def golfSourceLong(n: Long): Long = {
  val delta = math.pow(10, math.ceil(math.log10(n))).toInt
  var current = delta + n
  while (current % n != 0 || current.toString.foldLeft(0)(_ + _ - '0') != n) {
    current += delta
  }
  current
}

0

R , 115 바이트

function(n,d=nchar(n):1){while(sum(D<-F%/%10^((k=nchar(F)):1-1)%%10)-n|any(D[k-d+1]-n%/%10^(d-1)%%10)|F%%n)F=F+n
F}

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

끔찍한 R 기능. 으로 증가 F(에서 시작 0)n필요한 속성을 만족하는 값이 발견 될 때까지 이를 반환합니다. anyon double표현식을 사용 하면 루프가 반복 될 때마다 경고가 표시되지만 정확성에는 영향을 미치지 않습니다.

충분히 큰 입력 (n = 55 이상)에 대해 TIO에서 시간 초과되지만 충분한 시간 / 공간이 주어지면 솔루션을 올바르게 계산해야합니다.



0

젤리 , 22 21 바이트

DS=³a³ḍaDṫ³DLC¤Ḍ=³ø1#

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

편집 : 한 줄로 압축

설명

DS=³a³ḍaDṫ³DLC¤Ḍ=³ø1#
                  ø1#  Evaluate the condition before this and increment a counter until it is met then output the counter                     
D                      Digits of incremented variable as a list
 S                     Sum
  =³                   Equals argument of program?
    a                  Logical and
     ³ḍ                Does arg divide incremented variable?
       a               Logical and
        Dṫ     Ḍ       Last n digits of inc. var. where n is number of digits in program input
          ³DLC         1 - (number of digits of program input)
              ¤        Book ends above nilad
                =³     Equals program input?

젤리를 배우기 때문에 글쓰기에 많은 시간이 걸렸습니다. 오랫동안 나는 내가 필요하다는 것을 깨닫지 못했고 ¤그것을 작동시킬 수 없었습니다. [this] [1] 잘 설명 된 코드를 보면 거래를 성사시키는 데 도움이되었습니다. PPCG의 다른 많은 젤리 답변도 저를 인도했습니다.


0

자바 스크립트, 224 바이트 function getNumber(x){if(x<12){return!1};const sumDigits=(x)=>x.toString().split('').map(Number).reduce((a,b)=>a+b,0);for(let i=2;i<9999;i++){if((x*i-x)%(Math.pow(10,x.toString().length))==0&&sumDigits(x*i)==x){return x*i}}} Un-golf :

function getNumber(x){
	if (x<12) {return false};
	const sumDigits = (x) => x.toString().split('').map(Number).reduce((a,b)=>a+b, 0);
	for (let i=2; i<9999; i++){
		if((x*i-x)%(Math.pow(10, x.toString().length))==0 && sumDigits(x*i)==x){
			return x*i;
}
}
}

사용법 : 1. getNumber (12) 2. getNumber (13) 3. ....


Javascript 골프에 대해서는 잘 모르지만 이름을 줄여야합니다 . getNumber또는 sumDigits.
Ørjan Johansen '12

정말 고마워요, 나는 여기서 이기지
않고이

0

J , 37 33 바이트

+^:(((=1#."."0)*:(e.".\.))":)^:_~

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

                                ~    A = N
+^:                          ^:_     while(...)A+=N; return A
   (                      ":)        A to string
   (((    "."0)          )  )        digits of A
   ((( 1#.    )          )  )        sum
   (((=       )          )  )        equals N
   ((            (e.".\.))  )        N is one of the suffixes of A-string
   ((          *:        )  )        not AND

반복 카운터 앞에 붙는 속도는 ~ 5 배 빠르지 만 5 바이트 더 깁니다.

(]+[((=1#.,.&.":)<:|),~&.":)^:_&1,&":]

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

100, 27 바이트 씩 증가 :

(]+100*(=1#.,.&.":)<:|)^:_~

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.