최하부 회문


16

숫자가 주어지면 n기초 에 회문 b ≥ 2과 같은 가장 작은 염기를 찾는 함수를 작성하십시오 . 예를 들어 28의 3 진 표현이 1001이므로 입력은 밑을 반환해야 합니다. 밑이 2와 밑 5 모두에 회문이 있지만 출력은 2 <5 이후 여야합니다 .nb283932

입력

양의 정수 n < 2^31.

산출

b ≥ 2기본 b표현이 n회문이 되도록 가장 작은 기본을 반환합니다 . 선행 0을 가정하지 마십시오.

샘플 (입력 => 출력) :

11 => 10

32 => 7

59 => 4

111 => 6

규칙

가장 짧은 코드가 승리합니다.


1
베이스가 제한되어야한다고 생각합니다.
— 스낵

3
@ 스낵 : 높은 기지의 문제는 무엇입니까? 기호 선택과는 별도로 기본 1000 숫자는 회문이거나 아닐 수 있습니다.
— Dennis

3
흥미로운 일화 : 기본 n-1의 n은 n> = 2 인 경우 항상 11이므로 회문이 항상 가능합니다.
— Cruncher

1
@Cruncher : n1이 될 수 있고 2는 기본 1 회문이 아닙니다. 그러나 모든 긍정적 인 n것은 기본 n + 1회문입니다.
— Dennis

1
@Dennis 2는 어떻게 기본 1 회문이 아닌가? 11 또는 II, 또는 사용하는 기호 중 2입니다. 실제로 모든 기본 1 숫자는 회문입니다. 그리고 나는 지구베이스 0이 무엇인지 모르기 때문에 n> = 2라고 말했습니다.
— Cruncher

답변:


4

CJam , 19 바이트 / GolfScript, 23 바이트

q~:N;1{)_N\b_W%=!}g

또는

~:N;1{).N\base.-1%=!}do

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

예

$ cjam base.cjam <<< 11; echo
10
$ cjam base.cjam <<< 111; echo
6
$ golfscript base.gs <<< 11
10
$ golfscript base.gs <<< 111
6

작동 원리

q~:N;   # Read the entire input, interpret it and save the result in “N”.
1       # Push 1 (“b”).
{       #
  )     # Increment “b”.
  _N\   # Duplicate “b”, push “N” and swap.
  b     # Push the array of digits of “N” in base “b”.
  _W%   # Duplicate the array and reverse it.
  =!    # Compare the arrays.
}g      # If they're not equal, repeat the loop.

GolfScript의 경우 q~is ~, _is ., bis base, Wis -1and gis do입니다.


6

GolfScript, 20 자

~:x,2>{x\base.-1%=}?

Dennis 이외의 GolfScript와 다른 접근 방식 . 찾기 연산자 를 위해 값 비싼 명시 적 루프를 피합니다 . 온라인으로 시도하십시오 .

~:x        # interpret and save input to variable x
,2>        # make a candidate list 2 ... x-1 (note x-1 is the maximum possible base)
{          # {}? find the item on which the code block yields true
  x\       # push x under the item under investigation
  base     # perform a base conversion
  .-1%     # make a copy and reverse it
  =        # compare reversed copy and original array
}?         

1
영리한! 그러나이 경우 x = 1또는 작동하지 않습니다 x = 2. 둘 다 한 자릿수의 기본 x + 1회문이므로 x))수정해야합니다.
— Dennis

4

Mathematica, 67 66 바이트

g[n_]:=For[i=1,1>0,If[(d=n~IntegerDigits~++i)==Reverse@d,Break@i]]

코드 크기 측면에서 실제로 GolfScript와 경쟁 할 수는 없지만 2 32 의 결과 는 기본적으로 즉시 반환됩니다.


좋은. 함수의 이름을 지정할 필요는 없습니까? 명명되지 않은 함수 만 사용할 수 있습니까?
— numbermaniac

(또한 PalindromeQ역 검사 에 사용할 수 있습니까?)
— numbermaniac

4

Japt , 12 9 바이트

트릭을 놓친 경우가 아니면 (늦습니다!) 적어도를 포함하여 모든 숫자에서 작동합니다 2**53-1.

내 (필수적으로 제한적이고 완전히 무작위 인) 테스트에서 지금까지 기본 (!)까지 결과를 얻었습니다 . 자바 스크립트는 기본적으로 기반을 지원 고려할 때 너무 누추한 에 .11601 310,515236

@ìX êê}a2

시도 해봐

  • 3 바이트를 절약하고 효율성을 크게 향상시킨 새로운 것을 지적한 ETH 에게 감사드립니다 .

설명

정수의 묵시적 입력 U.

@     }a2

로 시작 2하여 다음 함수를 통과 할 때 true를 반환하는 첫 번째 숫자를 X현재 숫자로 반환합니다.

ìX

U기본 X자릿수로 변환 합니다 .

êê

해당 배열이 회문인지 테스트합니다.


1) 예. 그 공에 대한 맥주를 비난! : D 2) 멋지다; N.ì(n)보다 큰 기지를 다룰 수 있다는 것을 결코 알지 못했습니다 36. 고마워
— Shaggy

그래, 기본 36 알파벳은 N.ì(n)우리가 원시 정수를 사용 하기 때문에 중요하지 않습니다 ;-)
— ETHproductions

2

파이썬 2 (83)

def f(n,b=2):
 l=[];m=n
 while m:l+=[m%b];m//=b
 return l==l[::-1]and b or f(n,b+1)

질문이 원하는 입력 / 출력 형식을 잘 모르겠습니다. 함수를 작성했습니다. 이 코드는 선택적 입력 b을 사용하여 테스트중인 현재베이스를 추적합니다. 는 while자료의 숫자의 목록으로 변환에게 수를 루프b .

마지막 줄은 회문 (palindrome) 인 b경우 반환 l하고 b그렇지 않으면 다음을 재귀 적으로 시도합니다 . 부울에 관계없이 두 옵션을 모두 평가하고 재귀가 바닥에 나오지 않기 때문에 인덱스 별 트릭은 작동하지 않습니다.


1
그래서 이것은 임의로 높은 기지에서 작동하지 않을까요? 숫자에 회문이있는 가장 낮은 밑면이 10000과 같으면 스택 오버플로가 발생합니까?
— Cruncher

@Cruncher 그것은 파이썬의 구현에 달려 있습니다. CPython으로 실행할 때 오버플로가 발생하지만 Stackless Python 에서는 꼬리 호출 최적화를 수행하므로 재귀 제한이 없습니다 (실제로는 테스트하지는 않았지만).
— xnor

2

자바 스크립트, 88 바이트

f=function(n){for(a=b='+1';a^a.split('').reverse().join('');a=n.toString(++b));return+b}

언 골프 드 :

f = function(n) {
    for(a = b = '+1'; // This is not palindrome, but equals 1 so we have at least one iteration
        a ^ a.split('').reverse().join(''); // test a is palindrome
        a = n.toString(++b));
    return+b
}

1

자바 스크립트, 105 바이트

function f(n){for(var b=2,c,d;d=[];++b){for(c=n;c;c=c/b^0)d.push(c%b);if(d.join()==d.reverse())return b}}

JSFiddle : http://jsfiddle.net/wR4Wf/1/

이 구현은 큰베이스에서도 올바르게 작동합니다. 예를 들어, f(10014)1668을 리턴합니다 (10014는 1668에서 66입니다).


이거 좋다. s/var b=2,c,d/b=d=2/6 바이트를 더 얻을 수도 있습니다 .;)
— core1024

1

배쉬 + coreutils, 100 바이트

for((b=1;b++<=$1;)){
p=`dc<<<${b}o$1p`
c=tac
((b<17))&&c=rev
[ "$p" = "`$c<<<$p`" ]&&echo $b&&exit
}

dc기본 서식을 사용 합니다. 까다로운 것은dc 의 형식이 n> 16과 다르다는 .

테스트 케이스 :

$ ./lowestbasepalindrome.sh 11
10
$ ./lowestbasepalindrome.sh 32
7
$ ./lowestbasepalindrome.sh 59
4
$ ./lowestbasepalindrome.sh 111
6
$ 

1

J-28 자

#.inv~(-.@-:|.@)(1+]^:)^:_&2

설명 :

  • #.inv~ -오른쪽 인수에서 왼쪽 인수를 밑으로 펼치십시오.

  • (-.@-:|.@) -확장이 회 문형이면 0을, 그렇지 않으면 1을 반환합니다.

  • (1+]^:) -1을 반환하면 올바른 인수를 하나씩 증가시킵니다. 그렇지 않으면 조치를 취하지 않습니다.

  • ^:_ -아무런 조치를 취하지 않을 때까지 위의 증분을 반복하십시오.

  • &2 -올바른 인수를 2로 준비하여 한 인수의 함수로 만듭니다.

예 :

   #.inv~(-.@-:|.@)(1+]^:)^:_&2 (28)
3
   #.inv~(-.@-:|.@)(1+]^:)^:_&2 every 93 11 32 59 111  NB. perform on every item
2 10 7 4 6
   #.inv~(-.@-:|.@)(1+]^:)^:_&2 every 1234 2345 3456 4567 5678 6789
22 16 11 21 31 92

2+1 i.~[#.inv"*(-:|.@)~2+i.27 바이트 (별도로 게시하고 싶지 않습니다. 여기에 그대로 두겠습니다.)
— randomra

@randomra 기차가 인라인으로 사용 되려면 Parens가 필요하기 때문에 29로 계산합니다. mine은 최상위 레벨에서 연결을 통해 캐릭터를 저장합니다.
— algorithmshark

나는 점수에 대한 대다수의 입장은 항상 이것에 대해 논쟁이 있지만 명명되지 않은 함수를 사용한 무분별 계산이라고 생각합니다. 어쨌든, 나는 여기에두고 모든 사람들이 점수를 매기는 방법을 선택할 수 있습니다. :)
— randomra

1

R, 122 95 바이트

function(n)(2:n)[sapply(2:n,function(x){r={};while(n){r=c(n%%x,r);n=n%/%x};all(r==rev(r))})][1]

122 바이트의 3 년 된 솔루션 :

f=function(n)(2:n)[sapply(sapply(2:n,function(x){r=NULL;while(n){r=c(n%%x,r);n=n%/%x};r}),function(x)all(x==rev(x)))][1]

몇 가지 설명과 함께 :

f=function(n)(2:n)[sapply(
                    sapply(2:n,function(x){ #Return the decomposition of n in bases 2 to n
                                 r=NULL
                                 while(n){
                                     r=c(n%%x,r)
                                     n=n%/%x}
                                     r
                                     }
                           ),
                    function(x)all(x==rev(x))) #Check if palindrome
                   ][1] #Return the first (i. e. smallest) for which it is



0

스칼라, 83 바이트

def s(n:Int)=(for(b<-2 to n;x=Integer.toString(n,b);if(x==x.reverse))yield(b)).min



0

자바 스크립트 72 바이트

F=(n,b=2)=>eval(`for(t=n,a=c="";t;t=t/b|0)a=t%b+a,c+=t%b`)^a?F(n,b+1):b

console.log(F(11) == 10)

console.log(F(32) == 7)

console.log(F(59) == 4)

console.log(F(111) == 6)


0

Mathematica 42 바이트

Martin Ender 항목의 변형입니다. 차종은의 사용 IntegerReverse으로 분배하는 (버전 10.3에서 제공) IntegerDigits.

(i=2;While[#~IntegerReverse~i !=#,i++];i)&

0

자바 8, 103 바이트

n->{int b=1,l;for(String s;!(s=n.toString(n,++b)).equals(new StringBuffer(s).reverse()+""););return b;}

설명:

여기에서 시도하십시오.

n->{                          // Method with integer as both parameter and return-type
  int b=1,                    //  Base-integer, starting at 1
      l;                      //  Length temp integer
  for(String s;               //  Temp String
      !(s=n.toString(n,++b))  //   Set the String to `n` in base `b+1`
                              //   (by first increase `b` by 1 using `++b`)
       .equals(new StringBuffer(s).reverse()+"");
                              //   And continue looping as long as it's not a palindrome
  );                          //  End of loop
  return b;                   //  Return the resulting base integer
}                             // End of method
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.