가장 작은 제로리스베이스


28

양의 정수가 주어지면 선행 0이없는 기본 표현에 포함되지 않는 n가장 작은 기본을 출력합니다 . 모든 입력에 대해 가정 할 수 있습니다 .b >= 2nb0b <= 256

테스트 사례

1 -> 2 (1)
2 -> 3 (2)
3 -> 2 (11)
4 -> 3 (11)
5 -> 3 (12)
6 -> 4 (12)
7 -> 2 (111)
10 -> 4 (22)
17 -> 3 (122)
20 -> 6 (32)
50 -> 3 (1212)
100 -> 6 (244)
777 -> 6 (3333)
999 -> 4 (33213)
1000 -> 6 (4344)
1179360 -> 23 ([12, 9, 21, 4, 4])
232792560 -> 23 ([15, 12, 2, 20, 3, 13, 1])
2329089562800 -> 31 ([20, 3, 18, 2, 24, 9, 20, 22, 2])
69720375229712477164533808935312303556800 -> 101 ([37, 17, 10, 60, 39, 32, 21, 87, 80, 71, 82, 14, 68, 99, 95, 4, 53, 44, 10, 72, 5])
8337245403447921335829504375888192675135162254454825924977726845769444687965016467695833282339504042669808000 -> 256 ([128, 153, 236, 224, 97, 21, 177, 119, 159, 45, 133, 161, 113, 172, 138, 130, 229, 183, 58, 35, 99, 184, 186, 197, 207, 20, 183, 191, 181, 250, 130, 153, 230, 61, 136, 142, 35, 54, 199, 213, 170, 214, 139, 202, 140, 3])

1
사용중인 상위 염기에서 10, 11 등의 값은 무엇입니까? 그것들은 0을 포함합니까?
Stephen

19
@Stephen 위 숫자에 대해 선택된 값 9은 중요하지 않으므로 중요하지 않습니다 0.
Mego

9
OEIS A106370 입니다.
엔지니어 토스트

1
@Titus 좋은 지적입니다. 기본을 합리적인 것으로 제한하겠습니다.
Mego

1
@Mego : 232792560을 시도해보십시오. 2,3, ..., 20의 lcm이므로 모든 밑값 <= 20에서 최소 유효 자릿수는 0입니다.
Nate Eldredge

답변:


15

Pyth , 6 바이트

f*FjQT

모든 테스트 사례를 확인하십시오.

작동 원리

f * FjQT ~ 전체 프로그램.

f ~ 조건이 진실 인 첫 번째 양의 정수.
   jQT ~ 현재 요소의 밑으로 변환 된 입력.
 * F ~ 제품. 목록에 0이 포함되어 있으면 0입니다. 그렇지 않으면 엄격하게 양수입니다.
          0-> 거짓; > 0-> Truthy.
        ~ 결과를 암시 적으로 출력합니다.

Pyth f1, 2, 3, 4, ...(1에서 시작)에 작동 하지만 Pyth 는 기수 1 (단항)의 숫자를 0으로 처리하므로 기수 1은 무시됩니다.


Pyth의 기본 -1 표현이 모두 0이라는 사실을 남용했습니다.
Outgolfer Erik

@EriktheOutgolfer 감사합니다! 이에 대한 설명을 추가하겠습니다.
Mr. Xcoder

Pyth 누구의 단항 표현 숫자로 제로를 사용하는 유일한 언어가 아닙니다 힌트 P :
Mego

당신은 썼습니다 0 -> Falsy; > 0 -> Truthy. 그는 의도적 인 0둘 다 TruthyFalsy그 상황에?
Brian J

@BrianJ >초 앞에 표시 가 있는데 0, 이는 0보다 높은 모든 것이 진실하다는 것을 의미합니다.
Mr. Xcoder

11

C,  52  50 바이트

i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;return i;}

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

C (gcc),  47  45 바이트

i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;n=i;}

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


@Kevin Cruijssen의 답변에 대한 @Nevay의 제안 덕분에 2 바이트가 절약되었습니다!


2
후자의 버전은 특정 컴파일러를 고집하더라도 무작위 운으로 만 작동합니다. 물론, 어느 버전도 실제로 C가 아닙니다.
AnT

3
@AnT는 C .. 많은 경고를 주지만 컴파일됩니다. 코드에 맞는 컴파일러를 찾으면 괜찮습니다
Felipe Nardi Batista

1
@Blacksilver k%i는 삼항 체크입니다. 더 읽기 쉬운 변형은 다음 k=(k%i?k:n*++i);과 같습니다 if(k%i){k=k;}else{k=n*++i;}.
Kevin Cruijssen

1
또한 2 바이트로 골프를 할 수 있습니다 : i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;return i;}i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;n=i;}. 모든 크레딧은 @ 제안 된 Java 8 답변 에이 제안을 게시 한 @Nevay 에게 전달됩니다 .
Kevin Cruijssen

1
@Felipe Nardi Batista : CodeGolf 규칙에 "컴파일하는 한"등이 있다는 사실을 알고 있습니다. 그러나 그것이 "컴파일"한다는 사실은 그것이 C라는 것을 어떤 식으로도 증명하지 못합니다. 이것은 C가 아닙니다. 고대 버전의 C (K & R) i, k;와 같고 f(n)존재 하지 않는 유형없는 선언은 return그 주위에 둥근 괄호 가 필요한 시대에만 존재합니다. 논의. 와 함께 K & R i,k;을 사용하려면을 (를) 사용해야 return(i);합니다. 위의 내용은 gnuc이지만 C는 아닙니다.
AnT

8

하스켈 , 56 52 48 바이트

b#n=n<1||mod n b>0&&b#div n b
f n=until(#n)(+1)2

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

꽤 기본이지만 단축하는 좋은 방법을 생각할 수 없습니다.

편집 : 4 바이트를 절약 해준 Laikoni에게 감사드립니다! 내가 왜 생각하지 못했는지 모르겠다 !!0. 아마 그 괄호를 제거하려고했습니다해야하지만 사용하려고하면 좀 이상한 오류의 막연한 기억을 가지고 ||&&함께. 어쩌면 나는 평등 연산자와 혼동하고 있습니다.

편집 2 : 다른 4 바이트를 면도 해 주셔서 감사합니다 @ Liny! 내가 until전에 몰랐던 방법을 모른다 .


1
거의 똑같은 솔루션으로 1 분 동안 나를 이겼습니다. :) !!0보다 짧으며 head에 괄호를 넣을 수 있다고 생각합니다 #.
Laikoni

2
범죄자 과소 평가로 until :: (a → Bool) → (a → a) → a → a4 바이트를 절약 할 수 있습니다 :f n=until(#n)(+1)2
Lynn







3

자바 8, 61 56 54 바이트

n->{int b=2,t=n;for(;t>0;)t=t%b++<1?n:t/--b;return b;}

여기에서 시도하십시오.

설명:

n->{            // Method with integer as both parameter and return-type
  int b=2,      //  Base-integer, starting at 2
      t=n;      //  Temp-integer, copy of the input
  for(;t>0;)    //  Loop as long as `t` is not 0
    t=t%b++<1?  //   If `t` is divisible by the base `b`
                //   (and increase the base `b` by 1 afterwards with `b++`)
       n        //    Set `t` to the input `n`
      :         //   Else:
       t/--b;   //    Divide `t` by the `b-1`
                //    (by decreasing the base `b` by 1 first with `--b`)
                //  End of loop (implicit / single-line body)
  return b;     //  Return the resulting base
}               // End of method

나는 산술 접근법을 사용하여 골프를 칠 수 있다고 생각합니다. 실제로 @Steadybox 'C answer 포트로 @Nevay 덕분에 2 바이트로 골프칠 수 있습니다.

이전 ( 61 바이트 ) 답변 :

n->{int b=1;for(;n.toString(n,++b).contains("0"););return b;}

여기에서 시도하십시오.

설명:

n->{         // Method with Integer as both parameter and return-type
  int b=1;   //  Base-integer, starting at 1
  for(;n.toString(n,++b).contains("0"););
             //  Loop as long as the input in base-`b` does contain a 0,
             //  after we've first increased `b` by 1 before every iteration with `++b`
  return b;  //  Return the resulting base
}            // End of method

2
54 바이트 :n->{int b=2,t=n;for(;t>0;)t=t%b++<1?n:t/--b;return b;}
Nevay

2

Japt , 8 바이트

@ìX e}a2

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

설명

@    }a2

X에서 시작하여 함수를 전달할 첫 번째 숫자 ( )를 반환2

ìX

입력 숫자를 기본 X자릿수 배열로 변환하십시오 .

e

모든 숫자가 정확한지 확인하십시오.


배열에 10?가 여러 개 포함되어 있으면 이것이 실패하지 않습니까?
Shaggy

@Shaggy 내 이해는 OPs 의견에 따르면 9 이상의 기지의 자릿수가 0으로 계산되지 않는다는 것입니다.
Justin Mariner

아, 지금 봅니다. 챌린지의 문구에 문제가 있으므로 너무 피곤합니다!
Shaggy

2

자바 스크립트 (ES6), 43 41 37 바이트

n=>(g=x=>x?g(x%b++?x/--b|0:n):b)(b=1)

테스트 사례



2

파이썬 2 , 57 바이트

n=m=input()
b=2
while m:c=m%b<1;b+=c;m=(m/b,n)[c]
print b

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

Felipe Nardi Batista 에게 감사합니다 .
-2 Lynn 에게 감사합니다 (이제 그녀의 해결책이되었습니다 : D).


다음 으로 변경 a,b=a+c,d하여 59 바이트a+=c;b=d
Felipe Nardi Batista

나는 당신 while m>1while m(그리고 우리가 묶여 있다) 대체 할 수 있다고 생각합니다
Lynn

@Lynn 그래서 귀하의 솔루션에 대해 언급 한 이유는 정확히 똑같을 것입니다.
Outgolfer Erik


1
@Lynn 나는 이미 알고 있었다 : p 그렇지 않으면 나는 당신을 삭제하도록 요청했다.
Outgolfer Erik

2

APL (Dyalog) , 20 19 바이트

1+⍣{~0∊⍺⊥⍣¯1n}≢n←⎕

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

평소와 같이 채팅을 도와주고 TIO에서 코드를 작동시키는 @ Adám에게 감사합니다. 또한 1 바이트 절약.

이것은 (tradfn된다 트라 itional F unctio N ) 본체. 이를 사용하려면 이름 (TIO의 헤더 필드에 있음)을 지정하고 이름 앞에 하나 (TIO의 바닥 글 필드에 하나)를 넣고 이름을 사용하여 호출해야합니다. 사용자 입력을 받기 위해 쿼드 ( )를 사용하기 때문에 f \n input평소 대신 호출됩니다.f input

방법?

1+⍣{~0∊⍺⊥⍣¯1n}≢n←⎕   Main function.
                  n←⎕  Assigns the input to the variable n
1+⍣{           }≢      Starting with 1, add 1 until the expression in braces is truthy
    ~0                returns falsy if 0 "is in"
                      convert
            n         the input
         ⍣¯1           to base
                      left argument (which starts at 1 and increments by 1)

그런 다음 함수는 결과 기준을 반환합니다.


1
골프 팁 : n←⎕간단한 숫자 이므로 1나머지 코드에 대한 초기 인수로 필요하므로 로 n교체 1⊣하여 ( 1) 의 요소 수를 계산할 수 있습니다 . 온라인으로 사용해보십시오!
Adám


1

R , 79 71 66 63 65 바이트

function(n){while(!{T=T+1;all(n%/%T^(0:floor(log(n,T)))%%T)})T
T}

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

이 답변은 하나의 단일 루프에서 Giuseppe의 재정렬을 기반으로합니다.

JDL 덕분에 8 바이트를 절약하고 주세페 덕분에 6 바이트를 절약했습니다.


1
당신은 하위 수 bT로 정의 밖으로 시작하는 TRUE == 1필요성을 제거한다 b=1. 마찬가지로 당신은 ( is ) F를 대신 할 수 있습니다kFFALSE
JDL

난 당신이 무슨 짓을했는지 참조. 유용한 정보입니다!
NofP

1
m%/%T대신에 (정수 나누기)를 사용하는 66 바이트(m-m%%T)/T
Giuseppe

65 바이트 . 약간 지저분했지만 중첩 루프를 제거하면 무언가를 절약 할 수 있다고 생각했습니다 . 방금 1 바이트 이상이 될 것이라고 생각했습니다. (
Giuseppe

1

MATL , 13 12 바이트

`G@Q_YAA~}@Q

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

Luis Mendo 덕분에 -1 바이트. 이 프로그램은 flintmax기본 데이터 유형이 doubleMATL 이므로 2 ^ 53 ( 부동 소수점 유형으로 표시 할 수있는 최대 연속 정수) 보다 큰 테스트 케이스는 처리하지 않습니다 . 그러나 해당 숫자 아래에서 임의의 0이없는 기준을 찾을 수 있어야합니다.

`            % Do while
 G           %  Push input
  @ _        %  Outputs the iteration number, negate.
     YA      %  Convert input to base given by the iteration number, the negative number is to instruct MATL we want an arbitrary high base with a integer vector rather than the default character vector we know from hexadecimal
       A~    %  If they're not all ones, repeat
         }   % But if they are equal, we finally
          @  %  Push the last base
   Q       Q %  As base 1 makes no sense, to prevent MATL from errors we always increase the iteration number by one.

@LuisMendo 나는 문서를 더 잘 읽기 시작해야합니다. 감사.
Sanchises

이것은 더 큰 테스트 사례에서는 작동하지 않지만 MATL / Matlab에 대해 정수 제한으로 인한 것인지 아닌지 알 수 없습니다.
Mego

@Mego MATLAB R2017a에서 13 바이트 버전을 테스트했는데 현재 버전은 1e6까지입니다. 어떤 테스트 설정으로 인해 문제가 발생 했습니까?
Sanchises

마지막 2 개의 테스트 사례에서 오류가 발생합니다.
Mego

@ Mego Ah 나는 그 테스트 케이스를 전에 보지 못했습니다. YA내부적 으로 double을 사용하여 MATL 을 구현했기 때문에 double 로 표현할 수있는 최대 연속 정수까지만 입력을 처리 할 수 ​​있습니다 (참조 flintmax). 이것이 답변을 무효화합니까? 원칙적으로 알고리즘은 임의의 기본에 대해 작동하며 기본 36까지만 수행하는 다른 명령을 명시 적으로 해결했습니다.
Sanchises

0

PHP, 59 + 1 바이트

builtins 사용 , 최대 기본 36 :

for($b=1;strpos(_.base_convert($argn,10,++$b),48););echo$b;

내장 없음, 63 60 + 1 바이트 , 모든 기본 :

for($n=$b=1;$n&&++$b;)for($n=$argn;$n%$b;$n=$n/$b|0);echo$b;

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



0

J, 26 바이트

]>:@]^:(0 e.]#.inv[)^:_ 2:

이것이 개선 될 수 있는지 알고 싶습니다.

주 동사는 이단 어입니다.

>:@]^:(0 e.]#.inv[)^:_

이것은 왼쪽의 입력과 오른쪽의 상수 2입니다. 그 주 동사구는 J의 Do.를 사용하지만, 0이 e.기본 y의 원래 인수 의 요소 인 한 올바른 y 인수를 증가시키는 동안 구문을 만듭니다 .

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



0

은하수 , 38 바이트

^^'%{255£2+>:>R&{~^?{_>:<;m_+¡}}^^^}

용법: ./mw base.mwg -i 3


설명

code                                 explanation                    stack layout

^^                                   clear the preinitialized stack []
  '                                  push the input                 [input]
   %{                              } for loop
     255£                             push next value from 0..254   [input, base-2]
         2+                           add 2 to the get the base     [input, base]
           >                          rotate stack right            [base, input]
            :                         duplicate ToS                 [base, input, input]
             >                        rotate stack right            [input, base, input]
              R                       push 1                        [input, base, input, 1]
               &{~             }      while ToS (=remainder) is true ...
                  ^                    pop ToS                      [input, base, number]
                   ?{         }        if ToS (=quotient) ...
                     _>:<;              modify stack                [input, base, number, base]
                           m            divmod                      [input, base, quotient, remainder]
                           _+¡         else: output ToS (0) + SoS and exit
                                ^^^   pop everything but the input.

for 루프 대신 while 루프를 사용하여 이것이 단축 될 수 있다고 확신하지만 작동시키지 못했습니다.



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