最も近い回文数を見つける


22

数値Nを指定するとN + Xが回文構造になるようにXを出力/返します。ここで、| X | できるだけ小さくする必要があります。

パリンドローム:数字は、左から右に読むときと右から左に読むときの数字の順序が同じである場合、回文です。
953596548456対称で123あり、そうで2424はありません。先行ゼロなどの数字020は回文ではありません。

入力は10 15より小さい正の整数です。メソッドパラメータとして、何でもstdinから読み取ります。

出力は整数(正または負)でなければならず、入力がすでに回文である場合は0でなければなりません。出力をstdoutに書き込んで、関数または任意の関数から返すことができます。要件を満たす2つの数値(2-2)がある場合、そのうちの1つだけを出力します。

例:

Input             Output
3                 0
234               -2
1299931           -10
126               5 or -5 (only one of them)

おそらく、数値が最も近い2つの回文の中間にある場合、許容される出力はどちらですか?たとえばN=10、出力の場合は、X=-1またはX=1
ピーターテイラー14

@PeterTaylorはい、できるだけ小さくする必要があります。
CommonGuy 14

回答:


9

ピス26 20

Lnb_bWP`+QZ=Z-g0ZZ)Z

新しいルールに合わせて更新されました。

プログラムは無限ループで実行され、0、-1、1、-2、-2 ...の順序で可能なすべての増分をテストします。

説明:

Q=eval(input())     implicit
Z=0                 implicit
Lnb_b               def P(b): return b != rev(b)
WP`+QZ              while P(repr(Q+Z)):
=Z-g0ZZ             Z=(0>=Z)-Z
)                   <end while>
Z                   print(Z)

実行例:

python3 pyth.py programs/palin.pyth <<< 965376457643450
-2969881

これには23秒かかりました。


ボーナスソリューション、同じ文字数:

Wn`+QZ_`+QZ=Z-g0ZZ)Z

お知らせするために、ルールは(どちらの方向でも)最も近い回文を見つけるように変更されました。しかし、その規則の変更前にあなたが投稿したので、あなたがそれを修正する義務はないと思います。
マーティンエンダー

[0, 1, -1, 2, -2, ...]更新によってZをループするために文字を保存できZ=-Z+(Z<0)ますか?
xnor 14

うん-私はそれを独立して考えました。
isaacg 14

@xnorが追加されました。フィラー。
isaacg 14

うんいいね。また、条件の否定をしばらくの間検討しましたか?そして、それをPへの入力に適用してreprを保存しますか?
XNOR


6

CJam、34 29 25バイト

q~:I!{:R1<R-RI+`_W%=!}g;R

オンラインでお試しください。

$ cjam palfind.cjam <<< 120; echo
1
$ cjam palfind.cjam <<< 121; echo
0
$ cjam palfind.cjam <<< 122; echo
-1

使い方

q~:I    " Read from STDIN, evaluate and save the result in “I”.                           ";
!       " Compute the logical NOT (0 since the integer is positive).                      ";
{       "                                                                                 ";
  :R    " Save the topmost integer in “R”.                                                ";
  1<R-  " Compute (R < 1) - R. This produces the sequence 0 → 1 → -1 → 2 → -2 → … .       ";
  RI+   " Push I + R.                                                                     ";
  `_    " Cast to string and push a copy.                                                 ";
  W%=!  " Check if the reversed copy matches the original.                                ";
}g      " If it doesn't, repeat the loop.                                                 ";
;R      " Discard the integer on the stack and push “R”.                                  ";

5

ハスケル-62

f n=[x-n|x<-[0..]>>= \v->[n+v,n-v],show x==(reverse.show)x]!!0

という名前のファイルに保存し、golf.hsghciでテストします。

*Main> :l golf
[1 of 1] Compiling Main             ( golf.hs, interpreted )
Ok, modules loaded: Main.
*Main> map f [1000..1050]
[-1,0,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,-23,-24,-25,-26,-27,-28,-29,-30,-31,-32,-33,-34,-35,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-48,-49]
*Main> 

書いてみx<-[0..]>>=(\v->[n+v,n-v])ませんか?それは短く、ワンライナーになります
誇りに思ってhaskeller 14

@proudhaskellerありがとう!リストモナドによる非常にエレガントなトリック。
レイ14

4

Pythonの2.7、98、81

入力番号から回文を作成し、それを入力から減算してデルタを見つけます。

def f(n):
    m=map(int,str(n));l=len(m)/2;m[-l:]=m[l-1::-1];return int(`m`[1::3])-n

使用法:

print f(3)          # 0
print f(234)        # -2
print f(2342)       # -10
print f(129931)     # -10
print f(100000)     # 1

制限なしおよび注釈付き:

def f(n):                      # take a integer n
    m=map(int,str(n));         # convert n into array of ints
    l=len(m)/2;                # get half the length of the array of ints
    m[-l:]=m[l-1::-1];         # replace the last elements with the first elements reversed
    return int(`m`[1::3])-n    # convert array of ints backinto single int and subtract the original number to find the delta

これは最小のデルタを与えません。f(19) = -8(回文11そうあるべき)、+3作ること22
ジオビット14

はい@Geobits、10〜100個の値は、私にこのアプローチの問題与えるだろう
Moop

それだけではありません。同様に、199999は3の代わりに-8を与え、9911は-22の代わりに88を与えます。多くの場合、最初の数字を逆にするだけでは、最小のデルタを取得することはできません。
ジオビット14

まあ、私は多くのケースを言うことはないだろう、私はそれが動作するケースの99.9%を賭けます。しかし、はい、100%のケースで動作する必要があります
Moop 14

@Geobits。もちろん、エラー率は27%です。しかし、100000000に達すると、エラー率は大幅に低下します。実際のエラー率を計算することは興味深いでしょう。
ムープ14

4

Perl 5、93 89 88 87 75 63 44

$/=($/<1)-$/while$_+$/-reverse$_+$/;$_=$/+0

ゴルフをしていない:

while($input + $adjustment - reverse($input + $adjustment)) {
    $adjustment = ($adjustment < 1) - $adjustment;   
}
$input = $adjustment + 0;  ## gives 0 if $adj is undefined (when $input is a palindrome)
print $input;  ## implicit

デニスの提案のおかげで、43 + -p = 44になりました


1
1. -$aはより小さい$a*-1。2.を使用する場合($a<1)、は必要ありません? :$a++。3.あなたが使用している場合は-pスイッチを、$_=<>そしてprint$_あなたが最初の文を削除し、最後にを変更することができるように、暗黙的です$_=$a+0
デニス14

@Dennis Niceが見つけました。これはコードゴルフでの私の2回目の試みに過ぎないので、アドバイスに感謝します!
user0721090601 14

-pスイッチを1バイト余分にカウントするのが慣例ですが、($a<1)-$aではなくを使用して戻すことができます-$a+($a<1)
デニス14

@Dennis I上記のご回答に基づいて、そのメソッドを使用して、それは前にスペースが必要なため、利得が失われる程度けれどもwhile
user0721090601

$/代わりに使用すると$a、機能します。
デニス14


3

Java:127 109

次の候補に移動する前に、否定と肯定の両方をチェックする基本的な反復。

int p(long n){int i=0;for(;!(n+i+"").equals(new StringBuilder(n+i+"").reverse()+"");i=i<1?-i+1:-i);return i;}

入力の123456789012345場合、-1358024パリンドロームと等しくなるように戻ります123456787654321

改行:

int p(long n){
    int i=0;
    for(;!(n+i+"").equals(new StringBuilder(n+i+"").reverse()+"");i=i<1?-i+1:-i);
    return i;
}   

ないn+i+""ブラケットを仕事と保存?優先順位は正しいと思います。
ピーターテイラー

@PeterTaylorうん、そしてからもう少し得たtoString()。ありがとう:)
Geobits

1
あの甘いものを盗むことはできますi=i<1?-i+1:-iか?これを「減分」と呼びます。
ジェイコブ14

@Jacob Go for it;)
Geobits 14

3

Clojure、92

0から機能し、回文を作成する値のみを含む遅延for-sequenceから最初のものを取得します。

(defn p[x](first(for[i(range)j[1 -1]k[(* i j)]s[(str(+ x k))]:when(=(seq s)(reverse s))]k)))

REPL-LPERセッション:

golf-flog> (p 3)
0
golf-flog> (p 10)
1
golf-flog> (p 234)
-2
golf-flog> (p 1299931)
-10
golf-flog> (p (bigint 1e15))
1

2

JavaScript、175 136 117

簡単です。p指定された数が回文である場合にtrueを返しf、最も近いものを検索します。

編集:私はまた、ここでのJavaの回答のGeobitsによる甘い「減少」トリックのおかげで、もう少しゴルフをしました。

p=function(n){return (s=''+n).split('').reverse().join('')==s}
f=function(n){for(i=0;!p(n+i);i=i<1?-i+1:-i);return i}

使用法:

f(3)
f(234)
f(1299931)

ES6の104:p=n=>[...s=''+n].reverse().join('')==s f=n=>{r=t=0;while(!(p(n+r++)||p(n+t--)));return p(n+r-1)?r-1:t+1}:)
ウィリアムバルボサ14

1
きっと。functionそしてreturnひどく長い単語を予約されてい...
ジェイコブ

1
3年遅れて申し訳ありませんが、ES6で68までゴルフをしました:s=>{for(i=0;[...s+i+""].reverse().join``!=s+i;i=i<0?-i:~i);r‌​eturn i}。スタックオーバーフローが発生しやすい61:f=(s,i=0)=>[...s+i+""].reverse().join``==s+i?i:f(s,i<0?-i:~i‌​);)
浅本しえる

2

J-49文字

整数を整数にマッピングする関数。

((0{g#f)>:@]^:(+:/@g=.(-:|.)@":@+f=._1 1*])^:_&0)

この結果を3つの部分で構築する方法を次に示します。これはJ REPLの表示です。インデントされた行はユーザー入力であり、インデントされた行はREPL出力です。そして、はい、Jはアンダースコアで負符号をつづります_

   236 (_1 1*]) 4                          NB. -ve and +ve of right arg
_4 4
   236 (f=._1 1*]) 4                       NB. name it f
_4 4
   236 (+f=._1 1*]) 4                      NB. add left to each
232 240
   236 (":@+f=._1 1*]) 4                   NB. conv each to string
232
240
   236 ((-:|.)@":@+f=._1 1*]) 4            NB. palindrome? on each
1 0
   236 (g=.(-:|.)@":@+f=._1 1*]) 4         NB. name it g
1 0
   236 (+:/@g=.(-:|.)@":@+f=._1 1*]) 4     NB. logical NOR (result 1 if both=0)
0
   palin =: (+:/@g=.(-:|.)@":@+f=._1 1*])


   236 (>:@]) 0                            NB. increment right
1
   236 (>:@]^:2) 0                         NB. functional power
2
   236 (>:@]^:(236 palin 3)) 3             NB. power 1 if no palindromes
4
   236 (>:@]^:(236 palin 4)) 4             NB. power 0 if has palindrome
4
   236 (>:@]^:palin) 4                     NB. syntactic sugar
4
   236 (>:@]^:palin^:_) 0                  NB. increment until palindrome, start with 0
4
   (>:@]^:(+:/@g=.(-:|.)@":@+f=._1 1*])^:_&0) 236    NB. bind 0
4
   delta =: >:@]^:(+:/@g=.(-:|.)@":@+f=._1 1*])^:_&0


   ((f) delta) 236       NB. f=: -ve and +ve
_4 4
   ((g) delta) 236       NB. g=: which are palindromes
1 0
   ((g#f) delta) 236     NB. select the palindromes
_4
   ((g#f) delta) 126     NB. what if both are equal?
_5 5
   ((0{g#f) delta) 126   NB. take the first element
_5
   ((0{g#f)>:@]^:(+:/@g=.(-:|.)@":@+f=._1 1*])^:_&0) 236   NB. it works!
_4

例:

   pal =: ((0{g#f)>:@]^:(+:/@g=.(-:|.)@":@+f=._1 1*])^:_&0)
   pal 3
0
   pal every 234 1299931 126
_2 _10 _5
   pal 2424
18
   2424 + pal 2424
2442

また、に変更する_1 1ことにより、等しい場合、ゴルフがネガよりもポジティブなソリューションを好むようにすることができます1 _1


2

Javascript 86

n=>{s=(n+'').split('');for(i=0,j=s.length-1;i<j;i++,j--)s[j]=s[i];return s.join('')-n}

これは私の最初のcodegolfチャレンジです。この解決策が受け入れられることを願っています。

ungolfed: n => { s = (n + '').split(''); for (i = 0, j = s.length - 1; i < j; i++,j--) s[j] = s[i]; return s.join('') - n } 説明:
入力nを文字列に変換して分割します。
結果の配列の両側で反復し、i <jになるまでs [i]の数字をs [j]にコピーします。これにより、目的の回文が作成されます。
配列を結合して戻し、nを減算してxを取得


PPCGへようこそ!この回答には正しい構造があり(関数のサブミットは通常JavaScriptで最適に機能します)、正しい回答も提供しているようです。あなたの投稿は、このアルゴリズムが機能する理由の説明によって改善される可能性があります(なぜ機能するのかは私には明らかではありません)が、現時点では問題ありません。

おかげで、小規模な説明とungolfedバージョンを追加アイブ
Beldraith

あなたは変更することができますs=(n+'').split('')s=[...(n+'')]。5バイトを削る
ブライアンH.

私は同じように考えていたが、19は、第1反例と思わ:f(19)=322が最も近いパリンドロームであるので、関数リターン-8ところで11に19を変換するため[...n+'']にも、余分な作業が-2バイトであろう
Shieru Asakoto

2

JavaScript(ES6)、84バイト

n=>[...(''+n)].reduce((p,c,i,s,m=s.length-1)=>i<m/2?p+(c-s[m-i])*Math.pow(10,i):p,0)

私の最初のゴルフチャレンジ!短くてエレガントなソリューションがすでに@Brian H.によって投稿されていることは知っていますが、これは別のアプローチです。

テストコード


1
PPCGへようこそ!
Steadybox

2

Brachylog、8バイト

;.≜+A↔A∧

オンラインでお試しください!

ラベル述語はここで重要です。なぜなら、他の何かが起こる前に出力で使用することにより(実際には入力と出力を含むリストで呼び出されますが)、その絶対値は最小化されます。プログラムは、機能するものが見つかるまで、0から始まるすべての整数を推測します。もし0は非常にいい回文であり、それがすることをプログラム上省略し、それ明けるで常に出力は入力のマイナス。

            The input
;  +        plus
 .          the output
  ≜         which is instantiated immediately
    A       is A
     ↔      which reversed
      A     is still A
       ∧    but isn't necessarily the output.

1

グルービー- 131の 111 107文字

ゴルフ:

n=args[0] as long;a=n;b=n;f={if("$it"=="$it".reverse()){println it-n;System.exit 0}};while(1){f a++;f b--}

サンプル実行:

bash-2.02$ groovy P.groovy  0
0
bash-2.02$ groovy P.groovy  234
-2
bash-2.02$ groovy P.groovy  1299931
-10
bash-2.02$ groovy P.groovy  123456789012345
-1358024

ゴルフをしていない:

n=args[0] as long
a=n
b=n
f={ if("$it"=="$it".reverse()) {
       println it-n
       System.exit 0
    }
}

while(1) {
    f a++
    f b--
}

1

Python 2-76

i=input()
print sorted([r-i for r in range(2*i)if`r`==`r`[::-1]],key=abs)[0]

入力された番号を取得し、入力との間のすべての数との間の相違点のリストを生成0し、2*i唯一の数はパリンドロームであるかを。

次に、絶対値でリストをソートし、最初の要素を出力します。


range(2 * i)が大きな入力に対して機能するとは思わない。
ムープ14

minソートするのではなく、キーワード引数とともに使用できます。
xnor 14

長い範囲を使用するには、ジェネレーターであるxrangeと、短絡するminに切り替えて、メモリーのオーバーランを回避する必要があります。
isaacg 14

1

C ++ 289

関数Pは、<algorithm>メソッドを使用して回文をチェックします。

ゴルフをしていない:

bool P(int32_t i)
{
string a,b;
stringstream ss;
ss<<i;
ss>>a;
b=a;
reverse_copy(b.begin(),b.end(),b.begin());
int k=a.compare(b);
return (k==0);
}
int main()
{
int32_t n; cin>>n;
int32_t x=0,y=n,z=n,ans=x;
while(1)
{
if(P(y)){ans=x; break;}
if(P(z)){ans=-1*x; break;}
x++;
y+=x;
z-=x;
}
cout<<ans<<endl;
return 0;
}

すべてを1行に入れると短くなります。

1

Mathematica 75

おそらくもっとゴルフができます。

p = (j=0; b=#; While[a=IntegerDigits[b]; b += ++j(-1)^j; a!=Reverse[a]]; #-b+(-1)^j) &

スペースはカウントされず、必要ありません。


1

CoffeeScript:73

(x)->(x+="")[0...(y=x.length/2)]+x[0...-y].split("").reverse().join("")-x

説明: これは、奇数の長さ(たとえば1234567)x.slice(0, y)がある場合、中央の数字を含めないという事実を利用しx.slice(0, -y)ます。JavaScriptはsliceおそらくこの方法で動作しないはずですが、動作します。

私はCoffeeScript / JavaScriptが文字列を反転するより良い方法を持っていると期待していましたが、split / reverse / joinメソッドがすべてあるようです。


1

PHP、56バイト

for(;strrev($i+$n=$argv[1])-$n-$i;$i=($i<1)-$i);echo+$i;

コマンドライン引数から入力を受け取ります。で実行し-nrます。


1

JavaScript 68バイト

(n,s=[...(''+n)],j=s.length)=>s.map((v,i,)=>i>--j?s[j]:v).join('')-n

アルゴリズムの@Beldraithに巨大な小道具がありますが、これを回答として投稿しています。1つのステートメントで機能させるのにかなり時間がかかったからです。

どんなヒントでも大歓迎です;)

食べない

(
    n, // input
    s=[...(''+n)], // input split to array of chars
    j=s.length, // highest available index in s
)=> 
s.map( // this will return a new array, without modifying s
    (
        v, // value of current iteration
        i, // index of current iteration
    )=> i > --j ? s[j] : v
).join('') - n

D:あなたは、単一の文関数にあなたの答えを移植する私を気にしてはいけない@Beldraith希望は、私はそう爆発だった
ブライアンH.

63までゴルフ可能:(n,s=[...n+''],j=s.length)=>s.map((v,i)=>i>--j?s[j]:v).join``-nしかし、非自明な反例(19)も存在します;)
浅本シエル

痛い、それが9で終わるとすると、ポジティブな結果を得る必要があることを、任意の数だ、ちょうど19ではありません
ブライアン・H.

0

Python、109

def q(x,z):
 r=lambda s:int(str(s)[::-1])
 if x+z==r(x+z):return z
 if x-z==r(x-z):return -z
 return q(x,z+1)

これにより、実行時にエラーがスローされます(最大再帰深度を超えました)
Moop 14

それは私のコードのエラーではありません。大規模な数値では最大再帰深度を超えますが、適切なサイズの数値では機能します。仕様には最大のテストケースがなかったため、これは依然として有効なソリューションと見なされます。
RageCage 14

1
数が123456789原因で失敗し、質問に投稿された10 ^ 15の制限を大幅に下回ります。
ムープ14

1
あなたは簡単にループに再帰をオンにし、完全にこの問題を回避することができ
Moop

1
Stackless Python実装でこれを実行すると、再帰の深さの問題を回避できます。
xnor 14

0

QBIC、38バイト、nc

:{[-1,1,2|A=!a+b*c$~A=_fA||_xb*c]c=c+1

説明:

コードは入力を読み取り、修飾子を適用します。次に、数値+修飾子が回文であるかどうかをテストします。次に、モディファイヤでため息をつき、それを再適用して再度テストします。

:{        Read the input value, start a DO-loop
[-1,1,2|  FOR (b = -1; b <= 1; b+=2 )
A=!a+b*c$ Get a string from the input number, 
            plus modifier c (which is 0 at the start of QBIC)
            times -1 or 1, depending on b's iteration.
~A=_fA|   if that string is equal to it's own reversed version
|_xb*c]   then Quit, printing the modifier * sign
c=c+1     Increment the modifoer and DO-LOOP again.
          The DO-loop is implicitly closed by QBIC at EOF

0

Bash、73バイト

i=$1;x=$i;while((x-10#$(rev<<<$x)));do ((r=(1>r)-r,x=r+i));done;echo $x

入力は、最初のコマンドライン引数に送られます。

foo.sh 123456789

0

公理、720 594 412バイト

R(x)==>return x;p(r,a)==(n:=#(a::String);if r<0 then(a=0=>R a;n=1 or a=10^(n-1)=>R(a-1);a=10^(n-1)+1=>R(a-2));if r>0 then(n=1 and a<9=>R(a+1);a=10^n-1=>R(a+2));r=0 and n=1=>1;v:=a quo 10^(n quo 2);repeat(c:=v;w:=(n rem 2>0=>v quo 10;v);repeat(c:=10*c+w rem 10;w:=w quo 10;w=0=>break);r<0=>(c<a=>R c;v:=v-1);r>0=>(c>a=>R c;v:=v+1);R(c=a=>1;0));c)
D(a:NNI):INT==(p(0,a)=1=>0;w:=p(-1,a);s:=p(1,a);a-w<s-a=>w-a;s-a)

バイトカウントは再びこれですが、入力の桁の長さからのみ減少するため、アルゴリズムはO(log(n))になります(そしてlog10(n)はnの10進数の長さに近くなります) )。ungolfedと結果

-- Ritorna il precedente numero palidrome rispetto ad 'a' NNI, se r<0
--                               ha la particolarita' palpn(-1,0) = 0
-- Ritorna il successivo numero palidrome rispetto ad 'a' NNI, se r>0
-- Se r=0 ritorna 1 se 'a' e' palindrome, 0 se 'a' non e' palindrome
R(x)==>return x
palpn(r,a)==
    n:=#(a::String) -- n la lunghezza in cifre di base 10 di a
    if r<0 then(a=0        =>R a;n=1 or a=10^(n-1)=>R(a-1);a=10^(n-1)+1=>R(a-2))
    if r>0 then(n=1 and a<9=>R(a+1);    a=10^n-1  =>R(a+2))
    r=0  and n=1=>1
    v:=a quo 10^(n quo 2)
    repeat -- because here not there is a goto instruction i have to use repeat
        c:=v;w:=(n rem 2>0=>v quo 10;v)
        repeat
          c:=10*c+w rem 10
          w:=w quo 10
          w=0=>break
        r<0=>(c<a=>R c;v:=v-1)
        r>0=>(c>a=>R c;v:=v+1)
        R(c=a=>1;0) -- for r==0
    c

-- Ritorna la distanza minima tra l'input 'a' e una palindrome:
--        0 se 'a' e' una palindrome
--        r numero con segno negativo se tale palindrome precede 'a'
--        r numero con segno positivo se tale palindrome e' successiva ad 'a'
palDistance(a:NNI):INT==
    palpn(0,a)=1=>0
    p:=palpn(-1,a);s:=palpn(1,a)
    a-p<s-a=>p-a
    s-a

--------------------------------------

(3) -> [[i,D(i)] for i in [3,10,234,1299931,126]]
   (3)  [[3,0],[10,1],[234,- 2],[1299931,- 10],[126,5]]
                                                  Type: List List Integer
(4) -> D 7978986575546463645758676970789089064235234524548028408198401348930489104890184018410
   (4)  - 199223418598327604580355025458434427119613
                                                            Type: Integer
(5) ->  p(0,7978986575546463645758676970789089064235234524548028408198401348930489104890184018410+%)
   (5)  1
                                                    Type: PositiveInteger
(6) -> 7978986575546463645758676970789089064235234524548028408198401348930489104890184018410+%%(-2)
   (6)
       7978986575546463645758676970789089064235234325324609809870796768575463646455756898797
                                                    Type: PositiveInteger

私の謙虚な趣味のプログラマーのために、コンピューター言語にgotoを使用することを(または完全に排除するために)再び話しました:情報学には無能です!!!!
RosLuP

0

16 12 9バイト

ḟoS=↔+⁰İZ

-4バイトをありがとう@ H.PWiz!

オンラインでお試しください!

説明

ḟ(S=↔+⁰)İZ  -- input ⁰ a number, for example: 126
        İZ  -- built-in integers: [0,1,-1,2,-2...]
ḟ(     )    -- first element that satisfies the following (eg. 5):
     +⁰     --   add element to input: 131
  S=        --   is it equal to itself..
    ↔       --   ..reversed: 131 == 131

0

APL NARS 47文字

r←s a;b
r←0
A:b←⍕a+r⋄→0×⍳b≡⌽b⋄r←-r⋄→A×⍳r<0⋄r+←1⋄→A

これは上記の検索ですが、アルゴは以下のgのように速くて正しいことはできません...

この

A:b←⍕a+r⋄→0×⍳b≡⌽b⋄r←-r⋄→A×⍳r<0⋄r+←1⋄→A

b≡⌽bが見つかったときのみbが文字列回文である単純なループ出口

  s¨3,10,234,1299931,126
0 1 ¯2 ¯10 5 

∇r←g w;n;a;y;t;o;h;v
         r←0J1
   →0×⍳0≠⍴⍴w⋄→0×⍳''≡0↑w ⍝ if arg is not scalar int>=0→0J1
   →0×⍳(w<0)∨w≠⌊w
   h←{z←⍕⍺⋄q←⍕⍵⋄⍎(z,⌽q)}⍝ h return as digit ⍺⌽⍵
   n←⍴⍕w⋄r← 0
   →0×⍳n≤1              ⍝ arg one digit return r←0
   a←10*⌊n÷2
B: v←a⋄→C×⍳∼2∣n⋄v←a×10
C: t←⌊w÷v ⋄y←⌊w÷a
   o←y h t⋄r←(y+1)h t+1
   →D×⍳∼(∣r-w)<∣o-w⋄r←r-w⋄→0
D: r←o-w
∇

  g¨3,10,234,1299931,126
0 1 ¯2 ¯10 ¯5 


0

Japt、8バイト

nȥsw}cU

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

nȥsw}cU     :Implicit input of integer U
      cU     :Get the first number in the sequence [U,U-1,U+1,U-2,U+2,...,U-n,U+n]
 È           :That returns true when passed the the following function
  ¥          :  Test for equality with
   s         :  Convert to string
    w        :  Reverse
     }       :End function
n            :Subtract U from the result
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.