最低基回文


16

给定一个数字n,写一个函数找出最小的碱基,b ≥ 2例如n碱基回文b。例如,输入的28应该返回基数,3因为28的三进制表示为1001。尽管93在基数2和基数5中都是回文,但输出应该是22 <5。

输入值

一个正整数n < 2^31

输出量

返回最小的碱基b ≥ 2,使得的碱基b表示n是回文。不要假设任何前导零。

样本(输入=>输出):

11 => 10

32 => 7

59 => 4

111 => 6

规则

最短的代码获胜。


1
我认为基础应该是有限的。
零食

3
@Snack:高基数有什么问题?与符号的选择无关,以1000为基数的数字将是回文或不是。
丹尼斯

3
有趣的轶事:n> = 2时,基数n-1中的n始终为11,因此回文总是可能的。
Cruncher

1
@Cruncher:n可以是1或2不是以1为底的回文。但是,每个阳性n都是基础n + 1回文。
丹尼斯

1
@Dennis 2不是以1为基础的回文吗?它是11或II,或2个您使用的任何符号。实际上,所有以1为底的数字都是回文。我说n> = 2,因为我不知道地球的0底会是什么。
Cruncher

Answers:


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 baseWis -1gis 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))应加以修复。
丹尼斯

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

Japt12个 9字节

除非我错过了一个窍门(太晚了!),否则它应该适用于至少包括在内的所有数字2**53-1

在我的(有限的限制,完全是随机的)测试中,到目前为止,我得到的结果都达到了基本(!)。当你考虑的JavaScript只是原生支持基础不是太寒酸来。11601 310,515236

@ìX êê}a2

尝试一下

  • 感谢ETH为我指出了一些新东西,该东西节省了3个字节并大大提高了效率。

说明

整数的隐式输入U

@     }a2

以开始2,返回通过以下函数时返回true的第一个数字,即X当前数字

ìX

转换U为基数数组X

êê

测试该数组是否是回文。


1)是的。责怪啤酒,使球起来!:D 2)不错;从来不知道N.ì(n)能处理的基数大于36。感谢那。
毛茸茸的

是的,N.ì(n)因为我们使用的是原始整数,所以基数为36的字母无关紧要;-)
ETHproductions'Oct2

2

的Python 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

最后一行返回bif l是回文,b否则递归地尝试下一个。按布尔索引的技巧在这里不起作用,因为无论布尔值如何,这都会导致两个选项都被求值,并且递归永远不会触底。


1
因此,这不适用于任意高的基数吧?如果一个数字具有回文的最低底数是10000,那么您会得到堆栈溢出吗?
Cruncher

@Cruncher取决于Python的实现。当使用CPython而不是Stackless Python进行运行时,它将溢出,因为后者进行了尾部调用优化,因此没有递归限制(尽管我尚未进行实际测试)。
xnor

2

JavaScript,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

Javascript,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为基数)。


很好 您甚至可以s/var b=2,c,d/b=d=2/再获得6个字节;)
core1024 2014年

1

Bash + 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,则将正确的参数加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 2015年

@randomra我认为这是29个,因为火车需要Parens才能内联使用;我的角色通过在顶层使用连词来保存角色。
algorithmhark

我认为多数人的评分立场是使用任何未命名函数进行无括号计数,尽管对此始终存在争论。无论如何,我将其留在这里,每个人都可以选择他/她的评分方式。:)
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字节):

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

1

外壳11个 9字节

ḟoS=↔`B⁰2

感谢@Zgarb提供-2!

在线尝试!

说明

ḟ(      )2  -- find least number ≥ 2 that satisfies:
     `B⁰    --   convert input to base (` flips arguments)
  S=↔       --   is palindrome (x == ↔x)


0

Scala,83个字节

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



0

JavaScript 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

Java 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.