최하부 회문


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.