最下層パリンドローム


16

数を指定してn、base の回文であるb ≥ 2ような最小のベースを見つける関数を記述します。たとえば、28の3進表現が1001であるため、入力は基数を返す必要があります。基数2と基数5の両方で回文ですが、出力は2 <5でなければなりません。nb283932

入力

正の整数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であるため、回文は常に可能です。
ランチャー

1
@Cruncher:n1にすることができ、2はベース1パリンドロームではありません。ただし、すべての陽性nは基本n + 1回文です。
デニス

1
@Dennis 2はベース1パリンドロームではないのですか?11またはII、または使用するシンボルの2です。実際、すべてのベース1の数値は回文です。そして、私はn> = 2と言いました。なぜなら、地球のベース0がどうなるかわからないからです。
ランチャー

回答:


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。どちらも1桁の基本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

それを試してみてください

  • 3バイトを節約し、効率を大幅に向上させた新しい何かを指摘してくれたETHに感謝します。

説明

integerの暗黙的な入力U

@     }a2

で始まり2、次の関数を通過したときにtrueを返す最初の数値を返します。X現在の数値です

ìX

U基本X桁の配列に変換します。

êê

その配列が回文であるかどうかをテストします。


1)はい。そのボールのためにビールを責める!:D 2)ナイス; N.ì(n)を超えるベースを処理できるとは知らなかった36。ありがとう。
シャギー

ええ、N.ì(n)未加工の整数を使用しているため、36

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

最後の行は、回文であるb場合に戻り、それ以外の場合はl再帰的に次を試行しbます。index-by-Booleanトリックはここでは機能しません。ブールに関係なく両方のオプションが評価され、再帰が底を打たないためです。


1
だから、これは任意の高いベースではうまくいきませんか?数字にパリンドロームがある最下位が10000の場合、スタックオーバーフローが発生しますか?
ランチャー

@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で66です)。


これはいいね。さらにs/var b=2,c,d/b=d=2/6バイト増やすこともできます;)
core1024

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として準備し、これを1つの引数の関数にします。

例:

   #.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列車はインラインで使用するために括弧を必要とするので、私はそれを29と数えます。鉱山は、最上位に接続詞を置くことでキャラクターを救います。
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

Mathematica 42バイト

マーティン・エンダーのエントリーのバリエーション。MAKESはの使用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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.