공간을 절약하기 위해 정수를 접습니다!


20

미친 수학자는 많은 숫자를 소유하고 있기 때문에 그가 남긴 공간은 상당히 제한적입니다. 일부를 저장하려면 정수를 접어야하지만 불행히도 실제로 게으르다. 당신이 그를 도와주고 싶다면 당신의 임무는 우리의 숫자 미치광이에 주어진 양의 정수를 접는 함수 / 프로그램을 만드는 것입니다.

정수를 접는 방법?

숫자의 합으로 균등하게 나눌 수있는 경우 숫자의 합으로 나눕니다. 해당 요구 사항을 충족하지 않으면 나머지를 숫자의 합계로 나눌 때 가져갑니다. 결과가에 도달 할 때까지 프로세스를 반복하십시오 1. 접힌 정수는 수행해야하는 작업 수입니다. 예를 들어 봅시다 1782:

  1. 자릿수의 합을 구하십시오 1 + 7 + 8 + 2 = 18. 1782로 균등하게 나눌 수 18있으므로 다음 숫자는 1782 / 18 = 99입니다.

  2. 99로 균등하게 나눌 수 없으므로 9 + 9 = 18나머지를 취합니다 99 % 18 = 9.

  3. 9는 분명히 나눌 수 9있으므로 우리는 그것을 나누고 얻습니다 1.

결과 3를 얻으려면 3 개의 작업이 필요했기 때문 1입니다.

규칙 및 사양

  • 일부 정수는 숫자의 합계가 동일 할 수도 있습니다 1같은, 10또는 100. 귀하의 프로그램은 그러한 경우를 처리 할 필요가 없습니다. 즉, 입력으로 주어진 정수의 자릿수가 합과 같지 1않으며, 주어진 정수로 조작하지 않으면 자릿수의 자릿수 1( "제외 1," 목표"). 예를 들어, 수신하지 않습니다 10또는 20입력으로.

  • 입력은보다 큰 양의 정수 1입니다.

  • 기본 허점이 적용됩니다.

  • 표준 수단으로 입력하고 출력 할 수 있습니다 .


테스트 사례

입력-> 출력

2-> 1
5-> 1
9-> 1
18-> 2
72-> 2
152790-> 2
152-> 3
666-> 3
777-> 3
2010-> 3
898786854-> 4

다음은 프로세스를 시각화하고 더 많은 테스트 사례를 시도 할 수 있는 프로그램 입니다.


이것은 이므로 각 언어에서 가장 짧은 코드 (바이트 단위)가 이깁니다!


처음에는 관련이없는 것처럼 보이지만 이 과제 에서 영감을 얻었습니다 .
Mr. Xcoder

3
이것은 스톱 갭 솔루션으로 작동 할 것이지만 장기적으로 수학자는 힐버트 호텔 중 하나를 구매하는 것을 고려해야 합니다. 그 중 하나에서 항상 사용하지 않는 방을 찾을 수 있습니다.
Ray

동안 8987868546유효한 입력, 그것은 테스트 도구를 중단하고, 답변 또한 많은 (전부는 아니지만) ...합니다
미샤

@MischaBehrend 예제가 올바른 입력이 아닙니다. 마지막 테스트 사례를 잘못 복사 한 것 같습니다. 유효한 입력은 898786854아닙니다 8987868546( 6끝에 a 를 추가했습니다 )
Mr. Xcoder

nvm ... 전체 첫 번째 규칙을 읽어야합니다 ... 이곳을 떠나서 왜 그것이 유효하다고 생각했는지 알 수 있습니다 : 실수가 아닙니다 ...이 스크립트를 테스트하기 위해 의도적으로 변경했습니다 ... 그리고 규칙을 읽으십시오. 유효한 입력. 의 모든 자릿수의 합은 8987868546 1이 아니고 ( 규칙 1 충족 ) 89878685461보다 큰 양의 정수 ( 규칙 2 충족 )입니다.
Mischa

답변:


6

05AB1E , 13 12 바이트

[¼DSO‰0Kθ©#®

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

설명

[               # start loop
 ¼              # increment counter
  D             # duplicate current value
   SO           # sum the digits in the copy
     ‰          # divmod the current value by its digit-sum
      0K        # remove 0 from the resulting list
        θ       # pop the last element
         ©      # store a copy in register
          #     # if the current value is 1, break
           ®    # push the copy from register
                # implicitly output counter

6

파이썬 2 , 63 57 바이트

완전히 인간적인 덕분에 -1 감사합니다. Xcoder 덕분에 -1 감사합니다-Reffu
덕분에
-4

def f(n):a=sum(map(int,`n`));return n>1and-~f(n%a or n/a)

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




1
57 bytes 또한 처음에는 이것을 내 자신의 답변으로 만드는 것에 대해 사과드립니다. 코멘트로 더 의미가 있습니다
심판 4

5

하스켈, 85 78 바이트

f 1=0
f n|r<1=1+f(n`div`s)|1<2=1+f r where s=sum(read.pure<$>show n);r=n`rem`s

Bruce Forte 덕분에 7 바이트가 절약되었습니다.

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


사용하여 좀 더 바이트의 저장 divMod과 삭제 where: 온라인으로보십시오!
Laikoni

@ Laikoni 와우, 그것은 꽤 개선되었습니다! 다른 답변으로 게시하십시오. 그것은 내 것과 충분히 다릅니다. BTW : 나는를 제거하기위한 트릭을 찾고있었습니다 where. 나는 이것을 앞으로 사용할 것이다. :)
크리스티안 루파 스쿠

sum[read[d]|d<-show n]바이트를 절약
nimi

5

자바 스크립트 (ES6), 66 58 51 49 바이트

입력을 정수로 취합니다. 반환 false에 대한 0또는 1이 그 자리까지 추가 숫자가 발생했을 때와는 오버플로 오류가 발생합니다 1.

f=n=>n>1&&f(n%(x=eval([...""+n].join`+`))||n/x)+1
  • Justin의 도움으로 8 바이트가 저장되었습니다 .

그것을 테스트

o.innerText=(

f=n=>n>1&&f(n%(x=eval([...""+n].join`+`))||n/x)+1

)(i.value=898786854);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o>


1
eval(array.join`+`)?를 사용하여 숫자를 합산하여 바이트를 절약 할 수 있습니까?
저스틴 마리너

사실 @JustinMariner-당신은 나를 닌자! 감사합니다 :)
Shaggy

4

껍질 , 12 바이트

←€1¡Ṡ§|÷%oΣd

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

설명

←€1¡Ṡ§|÷%oΣd  Implicit input, e.g. n=1782
    Ṡ§|÷%oΣd  This part defines the transformation.
         oΣ   Sum of
           d  digits: s=18
    Ṡ   %     n mod s: 0
     §|       or (take this branch if last result was 0)
       ÷      n divided by s: 99
   ¡          Iterate the transformation: [1782,99,9,1,1,1,...
 €1           Index of 1 (1-based): 4
←             Decrement: 3
              Print implicitly.




2

수학, 73 바이트

(t=#;For[r=0,t>1,r++,If[(s=Mod[t,g=Tr@IntegerDigits@t])<1,t=t/g,t=s]];r)&

? ==0로 교체 가능 <1
Mr. Xcoder

물론 @ Mr.Xcoder! 분류기 버전을 만들었습니다.
J42161217

2

PHP, 68 + 1 바이트

단항 출력 :

for($n=$argn;$n>1;$n=$n%($s=array_sum(str_split($n)))?:$n/$s)echo 1;

십진 출력, 73 + 1 바이트 :

for($n=$argn;$n>1;$i++)$n=$n%($s=array_sum(str_split($n)))?:$n/$s;echo$i;

파이프로 실행 -nR하거나 온라인으로 사용해보십시오 .


Elvis 연산자에는 PHP 5.3 이상이 필요합니다. 오래된 PHP를 들어, 교체 ?:?$n%$s:(5 바이트).







1

펄, 71 바이트, 64 바이트, 63 바이트

-pl

$c=0;while($_>1){$s=0;$s+=$_ for/./g;$_=$_%$s?$_%$s:$_/$s;++$c};$_=$c

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

편집 : Xcali의 의견 덕분에 7 바이트를 절약했습니다.

-p

while($_>1){$s=0;$s+=$_ for/./g;$_=$_%$s?$_%$s:$_/$s;++$c}$_=$c

편집 : 5.14 이후 비파괴 대체 s /// r

-pl

while($_>1){$s=eval s/\B/+/gr;$_=$_%$s?$_%$s:$_/$s;++$c}$_=$c

는 IS -pl위에 대신 명령 줄 플래그 있어야하는데?
Outgolfer Erik

네, 그들은 펄 옵션입니다
Nahuel Fouilleul

이 게시물-pl 에 따라 깃발을 세어야합니다 .
Outgolfer Erik

pl 옵션에 대해 69 바이트 +2를 세었습니다. 맞습니까?
Nahuel Fouilleul

이것을 조금 아래로 내릴 수 있습니다. $c초기화 할 필요가 없습니다. 시작 시간 undef은 0입니다. while 클로저 이후의 세미콜론은 진행될 수 있습니다. 또한 필요하지 않습니다 -l. 한 번에 여러 입력을 할 필요는 없습니다.
Xcali

1

Dyalog APL, 36 바이트

{x←+/⍎¨⍕⍵⋄1=⍵:00=x|⍵:1+∇⍵÷x1+∇x|⍵}

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

방법?

{
   x←+/⍎¨⍕⍵       x = digit sum
   1=⍵:0          if arg = 1: bye
   0=x|⍵:1+∇⍵÷x   if arg divisible by x: recurse with arg/x
   1+∇x|⍵         recurse with arg mod x
}

1

가이아 , 13 바이트

-@{:ΣZ¤∨)‡}°\

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

설명

-              Push -1 (this will be the counter)
 @             Push input (the starting number)
  {:ΣZ¤∨)‡}°   Repeat this block until the results of 2 consecutive runs are the same:
   :            Copy the number
    Σ           Digital sum
     Z          Divmod number by digital sum
      ¤         Swap
       ∨        Logical or: left-most non-zero out of (number mod sum, number div sum)
        )‡      Increment the counter
            \  Delete the final 1, implicitly print the counter

1

Matlab, 150 바이트

function[d]=X(x) 
d=0;while ~strcmp(x,'1')z='sum(str2num(x(:)))';a=eval(['rem(',x,',',z,')']);y=num2str(a*(a>0)+eval([x,'/',z])*(a==0));x=y;d=d+1;end

X ( '152')와 같은 문자열로 함수에 입력해야합니다.

이 기능은 루핑하고 증가시키면서 작동합니다. d. 그만큼x=y;라인은 날 새로운 하나 분명히 읽고 동시에 변수 값을 덮어하려고 matlab에의 오류를 방지하기 위해 필요했다.

언 골프 드 :

function[d]=X(x) 
d=0;
while ~strcmp(x,'1')
    z='sum(str2num(x(:)))';
    a=eval(['rem(',x,',',z,')']);
    y=num2str(a*(a>0)+eval([x,'/',z])*(a==0));
    x=y;
    d=d+1;
end


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