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


40

입력:

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 입니다.


2
분명히 나는 행렬을 좋아 하기 때문에 대신 기본 변환 도전을 할 것이라고 생각 했습니다.
Stewie Griffin

34
"최고의 기초는 10입니다"... "10"은 어느 기초에 쓰여 있습니까?
Olivier Grégoire

5
@ OlivierGrégoire 그것은 영리한 일입니다 ... 우리가 어떤 기초를 가지고 있든, 여전히 유효한 진술이 될 것입니다!
Stewie Griffin

@StewieGriffin 그러나 어떻게 읽습니까? "10"은 각 밑에서 이름이 다릅니다.
user11153

10
글쎄, 그베이스에 따라 달라집니다 ... 또는 메건이 말을하는 것처럼 "그것은 '그 기본에 대해 그럴 때 모든 사용자들은 기본, 문제 없음" ;-)
스튜이 그리핀

답변:


20

매스 매 티카, 56 바이트

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

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

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

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

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

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

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

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


4
@StewieGriffin은 왼쪽에 있어야합니다. 10의 거듭 제곱의 배수로 이어지는 숫자에는을 포함하기 때문에 작은 틈이 있습니다. 9따라서 이미 10에 있습니다. 그러나 30k 및 60k의 경우 8 또는 7의 숫자는 그 9 대신에 항상 최대 한 단계 후에 10이됩니다.
Martin Ender 2016 년

@StewieGriffin 정확하게 말하면, [28051, 28888] 범위의 모든 숫자는 밑이 9이고 19xxx 형식의 숫자로 변환되므로이 간격이 거의 두 배가됩니다.
cmaster

아, 알았어 ... :) 기록 : 나는 10의 거듭 제곱의 왼쪽에 틈이있는 이유를 알았습니다 ... 이상한 두 배 크기의 틈 만이었습니다 (왜 30/60이 아니라 20 / 40/50). 28xxx-> 19xxx 범위의 숫자이지만 29xxx가 아닌 38xxx-> 26xxx 범위의 숫자를 볼 수 있습니다.
Stewie Griffin

10

자바 (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

1
침착하게 약속 하시겠습니까? : p Ok ... 가자 : s->{for(Integer b=0;b<10&s.length()>1;)s=""+b.valueOf(s,b=s.chars().max().getAsInt()-47);return s;}. 또한 나는 현재 전혀 관련이 없으므로 대부분의 의견을 삭제했습니다 ( b기본, 귀하의 a; 및 s우리가 작업중 인 숫자입니다).
Olivier Grégoire

1
나는 이것을 Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:c(""+b.valueOf(s,b));(88)으로 일부 바이트를 줄이려고 재귀 적으로 시도했지만 코드 골프에 익숙하지 않습니다. 이것은 스 니펫입니다. 추가 할 필요없이 이것을 메소드로 선언하는 방법이 public String c(String s)있습니까?
Lord Farquaad

1
당신은 필요하지 않습니다 @LordFarquaad public,하지만 난 당신이 참으로 사용해야 될 것 같아요 String c(String s){}당신이 사용하는 람다 만들 때, 심지어 자바 (8)에, 재귀 호출을 java.util.function.Function<String, String> c=s->{Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:c‌.apply​(""+b.valueOf(s,b));}사용하거나 인터페이스를 interface N{String c(String s);}N n = s->{Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:n.c‌​(""+b.valueOf(s,b));};그것이 "줄 것이다 초기화에서 자기 참조 두 경우 모두 " 오류 입니다. 그럼에도 불구하고 아주 좋은 접근법!
Kevin Cruijssen

아, 그때 나는 몇 바이트를 풀 었다고 생각합니다. 그러나 도움을 주셔서 감사합니다! 나는 이것을 계속 명심할 것이다.
Lord Farquaad

8

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

하나의 변수로 끝나는 두 변수 람다를 사용하는 방법이 조금 이상합니다 ... 그리고 오류가 발생하지 않았습니다. 아, 두 변수는 다음 QQ나는 그것을 얻을.
아웃 골퍼 에릭

@EriktheOutgolfer 정확하지 않습니다. u세 번째 입력이 없으면 반복 될 때까지 적용되는 반면 세 번째 입력은 고정 된 횟수만큼 적용됩니다. ulambda에는 GH이 있지만 사용할 필요는 없습니다 H.
isaacg 2016 년

실제로 교체 GH같은 결과가겠습니까의 한했다 ... BTW 암시 적 변수는 G?
Outgolfer Erik

@EriktheOutgolfer 암시 적 변수는 G입니다. H반복 할 때마다 0부터 계산되므로 완전히 다릅니다. 당신이 무슨 말을하는지 잘 모르겠습니다. : 여기에 무슨 일이 일어나고 있는지를 보여주는 예제 프로그램이다 pyth.herokuapp.com/...
isaacg

6

자바 스크립트 (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"))


나를 이길. +a>9||b<93 바이트를 사용 하여 3 바이트를 되돌릴 수 있습니다.
얽히고 설킨

1
@Shaggy 편집 : 나는 바보입니다
Tom

1
너 자신을 너무 힘들게하지 마라 Tom! 멍청하지는 않지만, @Shaggy만큼 똑똑하지는 않습니다!
Stewie Griffin

1
55 바이트 대체f=n=>n>9&&(k=Math.max(...n+"")+1)<10?f(parseInt(n,k)):n
Dom Hastings

@DomHastings 개선에 감사드립니다! :)
Tom

5

파이썬 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

5

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)

또한, 당신은 단지 사용할 수 тFZ>ö§있습니까? 반복 횟수 ( 여기에서 볼 수 있듯이 )가 정체 된 것처럼 보입니까? 는 기술 얻고 싶은 경우에, 당신은 단지 같은 것을 사용할 수 있도록 반복이 상승하는 속도는 ... 아마 로그입니다 : DFZ>ö§와 국가가 큰 위해 실행되지 않습니다 n. 또는 아마도 짝수 : T.n>FZ>ö§반복 횟수를로 직접 계산하십시오 log_10(n).
Magic Octopus Urn

@MagicOctopusUrn : 예, 이제는 시퀀스가 ​​선형보다 느리게 느껴지므로 F§Z>ö트릭을 수행해야합니다.
Emigna 2016 년

을 제거 할 수 있다고 생각합니다 §.
아웃 골퍼 에릭

@EriktheOutgolfer : 불행히도 아니요. 우리가를 제거하는 경우 §, Z스택 대신 스택의 상단에있는 숫자에서 가장 높은 자리에 가장 높은 숫자를 취할 것입니다.
Emigna


3

APL (Dyalog) , 20 16 바이트

문자열을 가져와 반환

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

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

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

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

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

  1+ 하나 추가

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

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

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



3

매스 매 티카, 52 바이트

FromDigits[s=IntegerDigits@#,Max@s+1]&~FixedPoint~#&

음수가 아닌 정수를 입력으로 사용하고 음이 아닌 정수를 반환하는 순수 함수. Jenny_mathy의 답변FromDigits[s=IntegerDigits@#,Max@s+1] 과 동일한 핵심 메커니즘 을 사용 하지만 반복을 위해 악용 합니다.FixedPoint


3

펄 6 , 49 바이트

{($_,{.Str.parse-base(1+.comb.max)}...*==*).tail}

그것을 테스트

넓히는:

{
  (

    $_,                 # seed the sequence with the input

    {
      .Str
      .parse-base(      # parse in base:
        1 + .comb.max   # largest digit + 1
      )
    }

    ...                 # keep generating values until

    * == *              # two of them match (should only be in base 10)

  ).tail                # get the last value from the sequence
}


2

, 17 바이트

Wa>9>YMXaaFB:1+ya

입력을 명령 행 인수로 사용합니다. 온라인으로 사용해보십시오!

설명

재미있었습니다. 체인 비교 연산자를 꺼내야했습니다.

숫자가 한 자릿수이거나 9를 포함 할 때까지 반복하려고합니다. 마찬가지로 숫자가 여러 자릿수이고 9를 포함하지 않는 동안 반복하려고합니다. 마찬가지로 숫자가 9보다 크고 최대 숫자는 다음과 같습니다. 9 : 미만 a>9>MXa.

Wa>9>YMXaaFB:1+ya
                   a is 1st cmdline arg (implicit)
     YMXa          Yank a's maximum digit into the y variable
Wa>9>              While a is greater than 9 and 9 is greater than a's max digit:
         aFB:1+y    Convert a from base 1+y to decimal and assign back to a
                a  At the end of the program, print a

2

파이썬 2 , 60 59 56 53 바이트

Felipe Nardi Batista 덕분에 4 바이트 절약 ovs
덕분에 3 바이트 절약

f=lambda x,y=0:x*(x==y)or f(`int(x,int(max(x))+1)`,x)

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

재귀 람다를 사용하여 기본 변환 결과를 이전 반복과 비교합니다.


왜 사용하지 x==y and x or ...뿐만 x없을 것 0(기본 1). 또는 심지어(x==y)*x or ...
Felipe Nardi Batista

@FelipeNardiBatista : 감사합니다! 나는 x and x==y or ...작동하지 않는 것을 시도했지만 , 나는이 트릭에 너무 능숙하지 않아서 그것을 되돌릴 수 있다는 것을 몰랐습니다 :)
Emigna

@ovs : 맞습니다. 감사!
Emigna 2016 년

@FelipeNardiBatista "입력 : 0-9 범위의 숫자로 구성된 양의 정수 n." 0은 여전히 ​​유효한 입력이며 코드는이를 거부합니다.
마스트

@Mast : 다행히도 0 은 양의 정수가 아니기 때문에 입력으로 주어지지 않습니다.
Emigna 2016 년

2

C #을 257 244 243 244 233 222 바이트

using System.Linq;z=m=>{int b=int.Parse(m.OrderBy(s=>int.Parse(s+"")).Last()+""),n=0,p=0;if(b<9&m.Length>1){for(int i=m.Length-1;i>=0;i--)n+=int.Parse(m[i]+"")*(int)System.Math.Pow(b+1,p++);return z(n+"");}else return m;};

글쎄, C #은 항상 많은 바이트를 필요로하지만 이것은 우스운 일입니다. 내장 기능 중 어느 것도 임의의 밑을 처리 할 수 ​​없으므로 변환을 직접 계산해야했습니다. 언 골프 드 :

using System.Linq;
z = m => {
int b = int.Parse(m.OrderBy(s => int.Parse(s + "")).Last()+""), n = 0, p = 0; //Get the max digit in the string
if (b < 9 & m.Length > 1) //if conditions not satisfied, process and recurse
{
    for (int i = m.Length - 1; i >= 0; i--)
        n += int.Parse(m[i] + "") * (int)System.Math.Pow(b+1, p++); //convert each base-b+1 representation to base-10
    return z(n + ""); //recurse
}
else return m; };

1

수학, 92 바이트

f[x_]:=FromDigits[s=IntegerDigits@x,d=Max@s+1];(z=f@#;While[d!=10&&Length@s>1,h=f@z;z=h];z)&

1

화살표 기능이 0 인 Javascript (ES6), 74 바이트

function f(a){a>9&&b=Math.max(...a)<9&&f(parseInt(a,b+1));alert(a)}f('11')

3
PPCG에 오신 것을 환영합니다! :) 이것은 아마도 좋은 답변 일지 모르지만 설명없이 말할 수는 없습니다. 나는 (그리고 아마도 다른 사람들은) 설명이 포함되지 않은 답변을지지하지 않습니다.
Stewie Griffin

1
f('11')함수 를 호출 한 이유는 무엇 입니까? 실제로 제출의 일부가 아닌 사용법으로 보이는 것을 빠뜨리지 않는 한. 그렇다면 코드 섹션에서 꺼내서 설명에 추가하고 (추가 할 때) 바이트 수를 67로 업데이트해야합니다.
PunPun1000

1

K4 , 19 바이트

해결책:

{(1+|/x)/:x:10\:x}/

예 :

q)\
  {(1+|/x)/:x:10\:x}/413574
83911
  {(1+|/x)/:x:10\:x}/13552
159
  {(1+|/x)/:x:10\:x}/17
3
  {(1+|/x)/:x:10\:x}/41253
29    

설명:

/:내장을 사용 하여베이스를 변환합니다.

{(1+|/x)/:x:10\:x}/ / the solution
{                }/ / converge lambda, repeat until same result returned
            10\:x   / convert input x to base 10 (.:'$x would do the same)
          x:        / store in variable x
 (     )/:          / convert to base given by the result of the brackets
    |/x             / max (|) over (/) input, ie return largest
  1+                / add 1 to this

1

코 틀린 , 97 바이트

fun String.f():String=if(length==1||contains("9"))this else "${toInt(map{it-'0'}.max()!!+1)}".f()

미화

fun String.f(): String = if (length == 1 || contains("9")) this else "${toInt(map { it - '0' }.max()!! + 1)}".f()

테스트

fun String.f():String=if(length==1||contains("9"))this else "${toInt(map{it-'0'}.max()!!+1)}".f()
val tests = listOf(
        5 to 5,
        17 to 3,
        999 to 999,
        87654321 to 9041998,
        41253 to 29
)

fun main(args: Array<String>) {
    tests.forEach { (input, output) ->
        val answer = input.toString().f()
        if (answer != output.toString()) {
            throw AssertionError()
        }
    }
}

TIO

TryItOnline




0

C, 159157 바이트

#include <stdlib.h>
char b[99];i=0;m=-1;c(n){do{m=-1;sprintf(b,"%d",n);i=0;while(b[i]){m=max(b[i]-48,m);i++;}n=strtol(b,0,++m);}while(b[1]&&m<10);return n;}

0

스칼라 , 119 바이트

if(x.max==57|x.length==1)x else{val l=x.length-1
f((0 to l).map(k=>(((x(k)-48)*math.pow(x.max-47,l-k))) toInt).sum+"")}

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

스칼라 , 119 바이트

if(x.max==57|x.length==1)x else f((0 to x.length-1).map(k=>(((x(k)-48)*math.pow(x.max-47,x.length-1-k))) toInt).sum+"")

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

두 방법 모두 같은 방식으로 작동하지만 첫 번째 방법에서는 x.length-1변수를 입력하고 두 번째 방법에서는 그렇지 않습니다.

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