Temukan nomor palindrom terdekat


22

Diberi angka N , output / return X sehingga N + X adalah palindrome, di mana | X | harus sekecil mungkin.

Palindrome: Suatu angka adalah palindrom, jika urutan digitnya sama ketika membacanya dari kiri ke kanan seperti ketika membaca dari kanan ke kiri.
95359dan 6548456simetris, 123dan 2424tidak. Angka dengan angka nol di depan seperti 020bukan palindrome.

Input adalah bilangan bulat positif lebih kecil dari 10 15 . Baca dari stdin, sebagai parameter-metode, apa pun.

Output harus berupa bilangan bulat (positif atau negatif) dan harus 0 jika inputnya sudah berupa palindrom. Anda dapat menulis output Anda ke stdout, mengembalikannya dari suatu fungsi atau apa pun yang Anda suka. Jika ada 2 angka (misalnya 2dan -2) yang memenuhi persyaratan, output hanya satu dari mereka.

Contoh:

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

Agaknya jika suatu angka berada di tengah-tengah antara dua palindrom terdekat, apakah ini merupakan keluaran yang dapat diterima? Misalnya untuk N=10output bisa X=-1atau X=1?
Peter Taylor

@PeterTaylor Ya, itu harus sekecil mungkin.
CommonGuy

Jawaban:


9

Pyth , 26 20

Lnb_bWP`+QZ=Z-g0ZZ)Z

Diperbarui untuk memenuhi aturan baru.

Program ini berjalan dalam loop tak terbatas yang menguji setiap kenaikan yang mungkin, dalam urutan 0, -1, 1, -2, -2 ...

Penjelasan:

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)

Contoh dijalankan:

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

Ini membutuhkan waktu 23 detik.


Solusi bonus, jumlah karakter yang sama:

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

Hanya untuk memberi tahu Anda, aturan berubah menjadi menemukan palindrome terdekat (di kedua arah). Tapi saya kira sejak Anda memposting sebelum aturan itu berubah, tidak ada kewajiban bagi Anda untuk memperbaikinya.
Martin Ender

Mungkinkah menyimpan karakter untuk mengulangi Z melalui [0, 1, -1, 2, -2, ...]pembaruan Z=-Z+(Z<0)?
xnor

Yap - Saya memikirkan itu secara mandiri.
isaacg

@xnor Ditambahkan. Pengisi.
isaacg

OK keren. Sudahkah Anda juga mempertimbangkan untuk menempatkan negasi dari kondisi tersebut sementara? Dan mungkin menyimpan repr dengan menerapkannya pada input ke P?
xnor

7

Ruby, 111 84 byte

i=$*[j=-1].to_i
r=->j{s=(i+j).to_s
abort(j.to_s)if s==s.reverse}
loop{r[j+=1]
r[-j]}

Mengambil nomor sebagai satu-satunya argumen baris perintah.


Bagaimana dengan situs web ini ?
CommonGuy

@ Manu Terima kasih tidak tahu yang itu! Kiriman saya berfungsi sejauh yang saya tahu.
Martin Ender

6

CJam, 34 29 25 byte

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

Cobalah online.

Contohnya

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

Bagaimana itu bekerja

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

Haskell - 62

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

Simpan ke file yang bernama golf.hslalu ujilah dengan ghci:

*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> 

bagaimana dengan menulis x<-[0..]>>=(\v->[n+v,n-v])? Ini lebih pendek dan menjadikannya satu-liner
haskeller bangga

@proudhaskeller Terima kasih! Trik yang sangat elegan dengan daftar monad.
Ray

4

Python 2.7, 98 , 81

Buat palindrome dari nomor input, lalu kurangi dari input untuk menemukan delta.

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

pemakaian:

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

ungolfed dan annotated:

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

Ini tidak memberikan delta terkecil. f(19) = -8(Palindrome 11), di mana seharusnya +3dibuat 22.
Geobits

@ Geobits Ya, nilai 10-100 akan memberi saya masalah dengan pendekatan ini
Moop

Bukan hanya itu saja. Demikian pula, 199999 memberi -8 bukan 3, 9911 memberi 88 bukannya -22. Membalikkan digit pertama tidak akan berhasil untuk mendapatkan delta terkecil dalam banyak kasus.
Geobits

baik saya tidak akan mengatakan banyak kasus, saya yakin 99,9% dari kasus itu berhasil. Tapi ya, itu perlu bekerja untuk 100% kasus
Moop

@Gobits. Tentu, jadi tingkat kesalahan 27% di sana. Tetapi ketika Anda sampai ke 100000000 tingkat kesalahan turun jauh. Akan menarik untuk menghitung tingkat kesalahan aktual.
Moop

4

Perl 5, 93 89 88 87 75 63 44

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

Tidak Disatukan:

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

Berkat saran Dennis, turun ke 43 + -p = 44


1
1. -$alebih pendek dari $a*-1. 2. Jika Anda menggunakan ($a<1), tidak perlu ? :$a++. 3. Jika Anda menggunakan -psakelar, $_=<>dan print$_tersirat, maka Anda dapat menjatuhkan pernyataan pertama dan mengubah yang terakhir ke $_=$a+0.
Dennis

@ Dennis Nice menemukan. Ini hanya upaya kedua saya di golf kode, sangat menghargai sarannya!
user0721090601

Merupakan kebiasaan untuk menghitung -psakelar sebagai satu byte tambahan, tetapi Anda bisa mendapatkannya kembali dengan menggunakan ($a<1)-$aalih-alih -$a+($a<1).
Dennis

@ Dennis Saya berpikir tentang menggunakan metode itu berdasarkan jawaban Anda di atas, tetapi mendapatkan hilang karena membutuhkan ruang sebelumwhile
user0721090601

Jika Anda menggunakan $/alih-alih $a, itu akan berhasil.
Dennis

4

05AB1E , 15 14 byte (-1 Terima kasih kepada Emigna)

2äнsgÈi∞ë.∞}s-

Cobalah online!


Metode:

  • Ambil bagian pertama dari angka tersebut.
  • Cermin itu berpotongan jika aneh, tidak berpotongan jika genap.
  • Perbedaan.

Saya pikir Anda dapat menggunakan 2äнbukan g;î£.
Emigna

3

Jawa: 127 109

Iterasi dasar, memeriksa negatif dan positif sebelum pindah ke kandidat berikutnya.

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

Untuk input 123456789012345, ia mengembalikan -1358024, ke palindrome yang sama 123456787654321.

Jeda baris:

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

Apakah n+i+""bekerja dan menyimpan tanda kurung? Saya pikir prioritasnya harus benar.
Peter Taylor

@ PeterTaylor Yap, dan mendapat beberapa lagi dari toString(). Terima kasih :)
Geobits

1
Bisakah saya mencuri itu manis i=i<1?-i+1:-i? Saya akan menyebutnya "tidak senonoh".
Yakub

@ Jacob Go for it;)
Geobits

3

Clojure, 92

Mengambil yang pertama dari malas untuk-urutan yang bekerja dari 0 dan hanya menyertakan nilai yang membuat palindrom:

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

Sesi 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

Mudah. pmengembalikan true jika angka yang diberikan adalah palindrome, fmencari yang terdekat.

EDIT: Saya juga bermain golf sedikit lebih banyak berkat trik "keraguan" manis oleh Geobits di Jawa yang menjawab di sini.

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}

Pemakaian:

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

104 dalam ES6: 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}:)
William Barbosa

1
Aku yakin begitu. functiondan returnkata-kata yang sangat lama dicadangkan ...
Yakub

1
Maaf atas keterlambatan 3 tahun, tapi golfed ke 68 di ES6: s=>{for(i=0;[...s+i+""].reverse().join``!=s+i;i=i<0?-i:~i);r‌​eturn i}. Stack-overflow rawan 61 f=(s,i=0)=>[...s+i+""].reverse().join``==s+i?i:f(s,i<0?-i:~i‌​)
:;

2

J - 49 char

Fungsi pemetaan bilangan bulat ke bilangan bulat.

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

Inilah cara Anda membangun hasil ini, dalam tiga bagian. Ini adalah tampilan dari J REPL: baris indentasi adalah input pengguna dan yang sudah ketinggalan zaman adalah output REPL. Dan ya, J mengeja tanda negatif dengan garis bawah _.

   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

Contoh:

   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

Anda juga dapat membuat golf lebih menyukai solusi positif daripada negatif ketika mereka sama, dengan mengubahnya _1 1menjadi 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}

Ini adalah tantangan codegolf pertama saya. Semoga solusi ini dapat diterima.

ungolfed: n => { s = (n + '').split(''); for (i = 0, j = s.length - 1; i < j; i++,j--) s[j] = s[i]; return s.join('') - n } Penjelasan:
Konversi input n ke String dan split.
Iterasi di kedua sisi array yang dihasilkan dan salin digit pada s [i] ke s [j] hingga i <j. Ini akan menghasilkan palindrome yang kita inginkan.
Gabungkan kembali array bersama-sama dan kurangi n untuk mendapatkan x


Selamat datang di PPCG! Jawaban ini memiliki struktur yang tepat (pengiriman fungsi biasanya berfungsi paling baik dalam JavaScript), dan tampaknya memberikan jawaban yang benar juga. Posting Anda mungkin ditingkatkan melalui penjelasan tentang mengapa algoritma ini bekerja (tidak jelas bagi saya mengapa demikian), tetapi saat ini baik-baik saja.

Terima kasih, ive menambahkan penjelasan kecil dan versi yang tidak
disunting

Anda bisa berubah s=(n+'').split('')menjadi s=[...(n+'')]. untuk memotong 5 byte
Brian H.

Saya berpikir dengan cara yang sama, tetapi 19 tampaknya menjadi contoh tandingan pertama: f(19)=3karena 22 adalah palindromic terdekat, tetapi fungsi mengembalikan -8 untuk mengubah 19 menjadi 11. btw [...n+'']juga akan bekerja untuk ekstra -2 byte
Shieru Asakoto

2

JavaScript (ES6), 84 byte

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)

Tantangan golf pertamaku! Saya tahu solusi yang lebih pendek dan lebih elegan telah diposting oleh @ Brian H., tetapi ini adalah pendekatan lain.

Kode Uji


1
Selamat datang di PPCG!
Steadybox

2

Brachylog , 8 byte

;.≜+A↔A∧

Cobalah online!

Predikat label sangat penting di sini, karena dengan menggunakannya pada output sebelum hal lain terjadi (walaupun itu benar-benar dipanggil pada daftar yang berisi input dan output), nilai absolutnya diminimalkan, karena alih-alih melakukan sesuatu yang lebih pintar berdasarkan pada kendala program menebak setiap bilangan bulat mulai dari 0 hingga dapat menemukan yang bekerja. Jika dihilangkan, ia sadar pada program bahwa 0 adalah palindrome yang sangat bagus, dan itu akan selalu menampilkan negatif dari input.

            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

Groovy - 131 111 107 karakter

Golf:

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--}

sampel berjalan:

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

Tidak Disatukan:

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]

Mendapat nomor input dan menghasilkan daftar perbedaan antara input dan setiap nomor antara 0dan 2*ihanya jika jumlahnya palindromik.

Kemudian mengurutkan daftar dengan nilai absolut dan mencetak elemen pertama.


Saya tidak berpikir range (2 * i) akan bekerja untuk input besar.
Moop

Anda dapat menggunakan minargumen kata kunci alih-alih menyortir.
xnor

To use ranges that long, you need to switch to xrange, which is a generator, and min, which short-circuits, to avoid overrunning your memory.
isaacg

1

C++ 289

Function P checks for palindromes using <algorithm> method.

Ungolfed:

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;
}

It will be shorter to put everything on one line.
cat

1

Mathematica 75

Probably can be golfed more..

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

Spaces not counted and not needed.


1

CoffeeScript: 73

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

Explanation: This takes advantage of the fact that if we have a number of odd length (say 1234567), x.slice(0, y) won't include the middle digit but x.slice(0, -y) will. JavaScript's slice probably shouldn't work this way, but it does.

I was expecting CoffeeScript/JavaScript to have a better way to reverse a string, but the split/reverse/join method seems to be all there is.


1

PHP, 56 bytes

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

takes input from command line argument; run with -nr.


1

javascript 68 bytes

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

HUGE props to @Beldraith for the algorithm, i'm posting this as an answer though, because it took me quite the time to get it to work in a single statement.

Any tips are welcome ;)

ungolfed

(
    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

@Beldraith hope you dont mind me porting your answer to a single statement function, i had a blast doing so :D
Brian H.

Golfable to 63: (n,s=[...n+''],j=s.length)=>s.map((v,i)=>i>--j?s[j]:v).join``-n, but also a non-obvious counterexample (19) exists ;)
Shieru Asakoto

ouch, it's not just 19, it's any number that ends with a 9 and should get a positive result
Brian 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)

this throws an error when running (maximum recursion depth exceeded)
Moop

That's not an error in my code. It will exceed maximum recursion depth on a massive number, but it works on decently sized numbers. As there was no maximum test case in the specs, this should still be considered a valid solution.
RageCage

1
The number 123456789 causes it to fail, well below the 10^15 limit posted in the question.
Moop

1
You could easily turn the recursion into a loop and avoid this issue altogether
Moop

1
Running this in the Stackless Python implementation should avoid the recursion depth issue.
xnor

0

QBIC, 38 bytes, nc

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

Explanation:

The code reads an input, and then applies a modifier. It then tests to see if the number + modifier is a palindrome. Then, it flips the sigh on the modifier, re-applies that and tests again.

:{        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 bytes

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

Input goes to the 1st command line argument:

foo.sh 123456789

0

Axiom, 720 594 412 bytes

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)

The byte count it is again this, but the algo it would be O(log(n)) because it would dipend only from the digit lenght of its input (and log10(n) would be near the lenght of the decimal digits of n). ungolfed and results

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

The ones had spoken again (or for the complete elimination) the use of goto for computer languages, for my humble hobby programmer prospective: Are incompetent in informatics !!!!
RosLuP

0

Husk, 16 12 9 bytes

ḟoS=↔+⁰İZ

Thanks @H.PWiz for -4 bytes!

Try it online!

Explanation

ḟ(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 chars

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

this above search but algo can not be fast and right as the g below...

This

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

is a simple loop exit only when it find b≡⌽b so b is a string palindrome

  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 bytes

nȥsw}cU

Try it

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.