태그 보관물: recursion

recursion

가장 좋은 기초는 10입니다… 도달하자! 가장 높은 자릿수는 9

입력:

0-9 범위의 숫자로 구성된 양의 정수 n .

도전:

d 가 정수에서 가장 높은 숫자 이면 숫자의 밑이 d + 1 이라고 가정합니다 . 정수는 예 경우 1256 당신은 그것에서의 가정해야 기본-7 이 있다면, 10110를 누른 다음 그것의 가정하여야한다 기초 2 (바이너리)를하고 있다면 159 다음의 진수.

이제 1 이 10의 정수에 도달 하거나 2가 한 자리 정수에 도달 할 때까지 다음을 수행하십시오 .

  1. 정수 를 밑- (d + 1) 에서 밑 -10으로 변환
  2. 이 새로운 정수의 밑을 찾으십시오 (다시 말하면, base- (d + 1) 여기서 d 는 새로운 숫자에서 가장 높은 숫자입니다)
  3. 1 단계로 이동하십시오 .

예 :

입력 값이 n = 413574라고 가정합니다 . 가장 높은 자릿수 d = 7 이므로 이것은 base-8 (8 진수)입니다. 이것을 십진수로 변환하고 137084를습니다 . 가장 높은 자릿수 d = 8 이므로 이것은 base-9 입니다. 이것을 십진수로 변환하고 83911을습니다 . 가장 높은 자릿수는 9 이므로 10 진수이며 우리는 멈 춥니 다. 출력은 83911 입니다.

입력 값이 n = 13552라고 가정합니다 . 가장 높은 자릿수는 d = 5 이므로 base-6 입니다. 이것을 십진수로 변환하고 2156을 얻습니다 . 가장 높은 자릿수 d = 6 이므로 이것은 base-7 입니다. 이것을 십진수로 변환하고 776을 얻습니다 . 가장 높은 숫자는 d = 7 이므로 base-8 입니다. 이것을 십진수로 변환하고 510을 얻습니다 . 가장 높은 자릿수는 d = 5 이므로 base-6 입니다. 이것을 십진수로 변환하고 186을 얻습니다 . 최상위 디지트가 8 이므로이다 베이스 -9- . 이것을 십진수로 변환하고 159를 얻습니다.. 가장 높은 자릿수는 9 이므로 이것은 10 진수이며 우리는 멈 춥니 다. 출력은 159가 되어야한다 .

입력 값이 n = 17 이라고 가정합니다 . 이것은 우리에게 15 , 11 , 3 을 줄 것입니다. 그것은 한 자리수이므로 출력 할 것입니다.


테스트 사례 :

5
5

17
3

999
999

87654321  (base-9 -> 42374116 in decimal -> base-7 -> 90419978 in decimal)
9041998

41253  (5505 -> 1265 -> 488 -> 404 -> 104 -> 29)
29

노트:

  • I / O, 허점 등에 관한 표준 규칙. 입력을 문자열로 취할 수 있습니다
  • 설명이 권장됩니다
  • 기본 변환 명령을 사용할 수 있습니다
    • 내장 함수를 사용하는 명백한 방법보다 훨씬 길어도 언어의 기본 변환 함수 (있는 경우)를 사용하지 않는 솔루션은 환영합니다.

분명히 이것은 OEIS A091047 입니다.



답변

매스 매 티카, 56 바이트

#//.x_/;(b=Max[d=IntegerDigits@x]+1)<11:>d~FromDigits~b&

온라인으로 사용해보십시오! (수학 사용)

시퀀스가 어떻게 보이는지 확인하려고 생각했습니다.

여기에 이미지 설명을 입력하십시오

다음은 결과를 찾는 데 걸리는 단계 수의 도표입니다.

여기에 이미지 설명을 입력하십시오

(더 큰 버전을 보려면 클릭하십시오. 최대 n = 1000 플롯 만 보려면 개정 내역을 참조하십시오 .)

대규모 구조와 미세한 혼란이 혼합 된 매우 흥미로운 것 같습니다. 나는 약 30,000과 60,000 사이의 더 큰 격차가 어떻게되는지 궁금합니다.


답변

자바 (8) 172 166 163 152 151 140 138 116 114 99 바이트

s->{for(Integer b=0;b<10&s.length()>1;s=""+b.valueOf(s,b=s.chars().max().getAsInt()-47));return s;}

입력을로 사용합니다 String.

@ OlivierGrégoire 덕분에 -64 바이트 . 그리고 여기에 내 초기 172가 나쁘지 않다고 생각했습니다 ..;)

여기에서 시도하십시오.

설명:

s->{                    // Method with String as parameter and return-type
  for(Integer b=0;b<10  //  Loop as long as the largest digit + 1 is not 10
      &s.length()>1;    //  and as long as `s` contains more than 1 digit
    s=""+               //   Replace `s` with the String representation of:
         b.valueOf(s,   //    `s` as a Base-`b` integer
          b=s.chars().max().getAsInt()-47)
                        //     where `b` is the largest digit in the String + 1
  );                    //  End of loop
  return s;             //  Return result-String
}                       // End of method


답변

Pyth, 9 바이트

ui`GhseS`

테스트 스위트

설명:

ui`GhseS`
ui`GhseS`GQ    Implicit variable introduction
u         Q    Repeatedly apply the following function until the value repeats,
               starting with Q, the input.
        `G     Convert the working value to a string.
      eS       Take its maximum.
     s         Convert to an integer.
    h          Add one.
 i`G           Convert the working value to that base


답변

자바 스크립트 (ES6), 63 57 54 53 바이트

f=a=>a>9&(b=Math.max(...a+""))<9?f(parseInt(a,b+1)):a

Shaggy 및 Dom Hastings 덕분에 8 바이트 절약

f=a=>a>9&(b=Math.max(...a+""))<9?f(parseInt(a,b+1)):a;

console.log(f("413574"))


답변

파이썬 3 , 91 78 76 75 73 바이트

@Emigna는 5 바이트를 줄였습니다. @FelipeNardiBatista가 1 바이트를 저장했습니다. @ RomanGräf는 2 바이트를 저장했습니다

i=input()
while'9'>max(i)and~-len(i):i=str(int(i,int(max(i))+1))
print(i)

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


설명

i=input()                                  - takes input and assigns it to a variable i
while '9'>max(i)and~-len(i):               - repeatedly checks if the number is still base-9 or lower and has a length greater than 1
    i=str(...)                             - assigns i to the string representation of ...
          int(i,int(max(i))+1)             - converts the current number to the real base 10 and loops back again
print(i)                                   - prints the mutated i


답변

05AB1E , 10 5 바이트

Magic Octopus Urn 덕분에 5 바이트 절약

F§Z>ö

큰 입력의 경우 이것이 매우 느리게 증가함에 따라 테스트를 위해 훨씬 빠른 이전 버전을 여기에 남겨 둡니다. 알고리즘은 동일하며 반복 횟수 만 다릅니다.

[©Z>öD®Q#§

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

설명

[             # start a loop
 ©            # store a copy of the current value in the register
  Z>          # get the maximum (digit) and increment
    ö         # convert the current value to base-10 from this base
     D        # duplicate
      ®Q#     # break loop if the new value is the same as the stored value
         §    # convert to string (to prevent Z from taking the maximum int on the stack)


답변

APL (Dyalog) , 20 16 바이트

문자열을 가져와 반환

((⍕⊢⊥⍨1+⌈/)⍎¨)⍣≡

()⍣≡ 두 개의 연속 항이 동일 할 때까지 다음 기능을 적용하십시오.

⍎¨ 각 문자를 실행합니다 (문자열을 숫자 목록으로 바꿉니다)

() 그것에 다음의 암묵적 기능을 적용하십시오 :

  ⌈/ 인수의 최대 값을 찾으십시오

  1+ 하나 추가

  ⊢⊥⍨ 그 기초에서 논증을 평가하다

   형식 (외부 함수의 다른 응용 프로그램을 준비하기 위해 문자열 화)

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