Tìm số palindromic gần nhất


22

Cho một số N , đầu ra / trả về X sao cho N + X là một bảng màu, trong đó | X | phải càng nhỏ càng tốt.

Palindrome: Một số là một palindrom, nếu chuỗi các chữ số của nó giống nhau khi đọc chúng từ trái sang phải như khi đọc từ phải sang trái.
953596548456là đối xứng, 1232424không. Các số có các số 0 đứng đầu như 020không phải là một bảng màu.

Đầu vào là một số nguyên dương nhỏ hơn 10 15 . Đọc nó từ stdin, như một tham số phương thức, bất cứ điều gì.

Đầu ra phải là một số nguyên (dương hoặc âm) và phải là 0 nếu đầu vào đã là một palindrom. Bạn có thể viết đầu ra của mình vào thiết bị xuất chuẩn, trả lại từ một hàm hoặc bất cứ thứ gì bạn thích. Nếu có 2 số (ví dụ 2-2) thỏa mãn các yêu cầu, chỉ xuất một trong số chúng.

Ví dụ:

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

Có lẽ nếu một số nằm ở giữa hai palindromes gần nhất, thì đó có phải là một đầu ra chấp nhận được không? Ví dụ cho N=10đầu ra có thể X=-1hay X=1?
Peter Taylor

@PeterTaylor Vâng, nó chỉ cần nhỏ nhất có thể.
CommonGuy

Câu trả lời:


9

Bình thường , 26 20

Lnb_bWP`+QZ=Z-g0ZZ)Z

Cập nhật để đáp ứng các quy tắc mới.

Chương trình chạy trong một vòng lặp vô hạn để kiểm tra mọi mức tăng có thể, theo thứ tự 0, -1, 1, -2, -2 ...

Giải trình:

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)

Chạy ví dụ:

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

Điều này mất 23 giây.


Giải pháp thưởng, cùng số lượng nhân vật:

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

Chỉ cần cho bạn biết, các quy tắc đã thay đổi thành tìm bảng màu gần nhất (theo một trong hai hướng). Nhưng tôi đoán vì bạn đã đăng trước khi thay đổi quy tắc đó nên bạn không có nghĩa vụ phải sửa nó.
Martin Ender

Nó có thể lưu ký tự để lặp Z qua [0, 1, -1, 2, -2, ...]một bản cập nhật Z=-Z+(Z<0)không?
xnor

Đúng - tôi nghĩ về điều đó một cách độc lập.
isaacg

@xnor Đã thêm. Phụ.
isaacg

Ok, tuyệt Bạn cũng đã xem xét việc đưa ra sự phủ định của điều kiện trong một thời gian? Và có thể lưu một repr bằng cách áp dụng nó vào đầu vào cho 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]}

Lấy số làm đối số dòng lệnh duy nhất của nó.


Làm thế nào về trang web này ?
CommonGuy

@Manu Cảm ơn bạn đã không biết điều đó! Trình của tôi hoạt động như xa như tôi có thể nói.
Martin Ender

6

CJam, 34 29 25 byte

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

Hãy thử trực tuyến.

Ví dụ

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

Làm thế nào nó hoạt động

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

Lưu nó vào một tệp có tên golf.hsvà sau đó kiểm tra nó với 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> 

Viết như thế nào x<-[0..]>>=(\v->[n+v,n-v])? Nó ngắn hơn và làm cho nó trở thành một lớp lót
tự hào

@proudhaskeller Cảm ơn! Thủ thuật rất thanh lịch với danh sách đơn nguyên.
Ray

4

Trăn 2.7, 98 , 81

Tạo một palindrom từ số đầu vào, sau đó trừ nó từ đầu vào để tìm 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

sử dụng:

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

không chú ý và chú thích:

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

Điều này không cung cấp cho đồng bằng nhỏ nhất. f(19) = -8(palindrom 11), nơi cần được +3thực hiện 22.
Geobits

@Geobits Có, 10-100 giá trị sẽ gây cho tôi một vấn đề với cách tiếp cận này
Moop

Đó không chỉ là những thứ đó. Tương tự, 199999 cho -8 thay vì 3, 9911 cho 88 thay vì -22. Chỉ cần đảo ngược các chữ số đầu tiên không hoạt động để có được delta nhỏ nhất trong nhiều trường hợp.
Geobits

tôi sẽ không nói nhiều trường hợp, tôi đặt cược 99,9% trường hợp nó hoạt động. Nhưng vâng, nó cần phải hoạt động cho 100% các trường hợp
Moop

@Geobits. Chắc chắn, tỷ lệ lỗi 27% đó. Nhưng khi bạn đạt đến 100000000s, tỷ lệ lỗi giảm đáng kể. Sẽ rất thú vị khi tính tỷ lệ lỗi thực tế.
Moop

4

Perl 5, 93 89 88 87 75 63 44

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

Ung dung:

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

Nhờ các đề xuất của Dennis, đã giảm xuống còn 43 + -p = 44


1
1. -$angắn hơn $a*-1. 2. Nếu bạn sử dụng ($a<1), không cần ? :$a++. 3. Nếu bạn sử dụng công -ptắc $_=<>print$_ẩn, vì vậy bạn có thể bỏ câu lệnh đầu tiên và thay đổi câu lệnh cuối cùng $_=$a+0.
Dennis

@Dennis Nice tìm thấy. Đây chỉ là nỗ lực thứ hai của tôi tại môn đánh gôn, vì vậy hãy đánh giá cao lời khuyên!
user0721090601

Theo thông lệ, việc đếm công -ptắc là một byte bổ sung, nhưng bạn có thể lấy lại bằng cách sử dụng ($a<1)-$athay vì -$a+($a<1).
Dennis

@Dennis Tôi mặc dù về việc sử dụng phương pháp đó dựa trên câu trả lời của bạn ở trên, nhưng mức tăng bị mất vì nó yêu cầu một khoảng while
trắng

Nếu bạn sử dụng $/thay vì $a, nó sẽ hoạt động.
Dennis


3

Java: 127 109

Lặp lại cơ bản, kiểm tra cả tiêu cực và tích cực trước khi chuyển sang ứng cử viên tiếp theo.

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

Đối với đầu vào 123456789012345, nó trả về -1358024, để palindrom bằng nhau 123456787654321.

Ngắt dòng:

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+""hoạt động và lưu dấu ngoặc không? Tôi nghĩ rằng ưu tiên phải chính xác.
Peter Taylor

@PeterTaylor Yep, và có một vài người khác từ toString(). Cảm ơn :)
Geobits

1
Tôi có thể ăn cắp ngọt ngào i=i<1?-i+1:-i? Tôi sẽ gọi nó là "thiếu quyết đoán".
Jacob

@Jacob Đi cho nó;)
Geobits

3

Clojure, 92

Lấy cái đầu tiên từ một chuỗi lười biếng hoạt động từ 0 ra và chỉ bao gồm các giá trị tạo ra palindromes:

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

Phiên 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

Nói thẳng ra. ptrả về true nếu một số đã cho là palindrom, ftìm kiếm gần nhất.

EDIT: Tôi cũng đã đánh gôn thêm một chút nhờ vào thủ thuật "thiếu quyết đoán" ngọt ngào của Geobits trong câu trả lời Java ở đây.

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}

Sử dụng:

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

104 trong 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
Tôi cá là vậy. functionreturnlà những từ dành riêng quá dài ...
Jacob

1
Xin lỗi vì sự chậm trễ 3 năm, nhưng đã chơi golf tới 68 trong ES6 : s=>{for(i=0;[...s+i+""].reverse().join``!=s+i;i=i<0?-i:~i);r‌​eturn i}. Tràn ngăn xếp chồng lên nhau 61 : f=(s,i=0)=>[...s+i+""].reverse().join``==s+i?i:f(s,i<0?-i:~i‌​);)
Shieru Asakoto

2

J - 49 char

Một số nguyên ánh xạ hàm cho số nguyên.

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

Đây là cách bạn có thể xây dựng cho kết quả này, trong ba phần. Đây là màn hình hiển thị của J REPL: các dòng thụt vào là đầu vào của người dùng và các dòng lỗi thời là đầu ra REPL. Và vâng, J đánh vần dấu âm với dấu gạch dưới _.

   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

Ví dụ:

   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

Bạn cũng có thể làm cho golf thích giải pháp tích cực hơn tiêu cực khi chúng bằng nhau, bằng cách thay đổi _1 1thành 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}

Đây là thử thách codegolf đầu tiên của tôi. Hy vọng giải pháp này được chấp nhận.

ungolfed: n => { s = (n + '').split(''); for (i = 0, j = s.length - 1; i < j; i++,j--) s[j] = s[i]; return s.join('') - n } Giải thích:
Chuyển đổi đầu vào n thành Chuỗi và tách.
Lặp lại trên cả hai mặt của mảng kết quả và sao chép chữ số trên s [i] thành s [j] cho đến khi tôi <j. Điều này sẽ dẫn đến kết quả mong muốn của chúng tôi.
Nối mảng lại với nhau và trừ n để có x


Chào mừng đến với PPCG! Câu trả lời này có cấu trúc đúng (chức năng đệ trình thường hoạt động tốt nhất trong JavaScript) và dường như cũng đưa ra câu trả lời đúng. Bài viết của bạn có thể được cải thiện thông qua giải thích lý do tại sao thuật toán này hoạt động (đối với tôi tại sao nó không rõ ràng), nhưng hiện tại nó vẫn ổn.

Cảm ơn, ive đã thêm một lời giải thích nhỏ và một phiên bản vô văn hóa
Beldraith

bạn có thể thay đổi s=(n+'').split('')để s=[...(n+'')]. để loại bỏ 5 byte
Brian H.

Tôi cũng nghĩ giống như vậy, nhưng 19 dường như là ví dụ đầu tiên: f(19)=3bởi vì 22 là palindromic gần nhất, nhưng hàm trả về -8 để chuyển 19 thành 11. btw [...n+'']cũng sẽ hoạt động thêm -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)

Thử thách chơi gôn đầu tiên của tôi! Tôi biết giải pháp ngắn gọn và thanh lịch hơn đã được đăng bởi @Brian H., nhưng đây là một cách tiếp cận khác.

Mã kiểm tra


1
Chào mừng đến với PPCG!
Steadybox

2

Brachylog , 8 byte

;.≜+A↔A∧

Hãy thử trực tuyến!

Vị từ nhãn rất quan trọng ở đây, bởi vì bằng cách sử dụng nó trên đầu ra trước khi bất kỳ điều gì khác xảy ra (mặc dù nó thực sự được gọi trong danh sách chứa đầu vào và đầu ra), giá trị tuyệt đối của nó được giảm thiểu, vì thay vì làm bất cứ điều gì thông minh hơn dựa trên các ràng buộc chương trình đoán mọi số nguyên bắt đầu từ 0 cho đến khi nó có thể tìm thấy một số nguyên hoạt động. Nếu bị bỏ qua, nó sẽ nhận ra chương trình 0 là một bảng màu rất đẹp và nó sẽ luôn xuất ra âm của đầu vào.

            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 ký tự

Chơi gôn

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

mẫu chạy:

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

Ung dung:

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

Con trăn 2 - 76

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

Lấy số đầu vào và tạo một danh sách các khác biệt giữa đầu vào và mọi số giữa 02*ichỉ khi số đó là palindromic.

Sau đó, nó sắp xếp danh sách theo giá trị tuyệt đối và in phần tử đầu tiên.


Tôi không nghĩ rằng phạm vi (2 * i) sẽ hoạt động cho các đầu vào lớn.
Moop

Bạn có thể sử dụng minvới một đối số từ khóa hơn là sắp xếp.
xnor

Để sử dụng các phạm vi dài, bạn cần chuyển sang xrange, đó là một trình tạo và min, ngắn mạch, để tránh làm quá tải bộ nhớ của bạn.
isaacg

1

C ++ 289

Hàm P kiểm tra palindromes bằng <algorithm>phương pháp.

Ung dung:

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

Nó sẽ ngắn hơn để đặt mọi thứ trên một dòng.
mèo

1

Toán học 75

Có lẽ có thể chơi golf nhiều hơn ..

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

Không gian không được tính và không cần thiết.


1

Cà phê: 73

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

Giải thích: Điều này lợi dụng thực tế là nếu chúng ta có một số độ dài lẻ (giả sử 1234567), x.slice(0, y)sẽ không bao gồm chữ số ở giữa nhưng x.slice(0, -y)sẽ. JavaScript slicecó lẽ không nên hoạt động theo cách này, nhưng nó có.

Tôi đã mong đợi CoffeeScript / JavaScript có cách tốt hơn để đảo ngược chuỗi, nhưng phương thức split / Reverse / jo dường như là tất cả.


1

PHP, 56 byte

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

lấy đầu vào từ đối số dòng lệnh; chạy với -nr.


1

javascript 68 byte

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

Mặc dù vậy, đạo cụ HUGE cho @Beldraith cho thuật toán, tôi đang đăng bài này dưới dạng câu trả lời, bởi vì tôi đã mất khá nhiều thời gian để làm cho nó hoạt động trong một tuyên bố duy nhất.

Mọi lời khuyên đều được chào đón;)

vô dụng

(
    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 hy vọng bạn không phiền tôi chuyển câu trả lời của bạn cho một hàm câu lệnh duy nhất, tôi đã có một vụ nổ làm như vậy: D
Brian H.

Golfable tới 63 : (n,s=[...n+''],j=s.length)=>s.map((v,i)=>i>--j?s[j]:v).join``-n, nhưng cũng tồn tại một ví dụ không rõ ràng (19);)
Shieru Asakoto

ouch, không chỉ 19, nó là bất kỳ số nào kết thúc bằng số 9 và sẽ có kết quả khả quan
Brian H.

0

Con trăn, 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)

điều này gây ra lỗi khi chạy (vượt quá độ sâu đệ quy tối đa)
Moop

Đó không phải là một lỗi trong mã của tôi. Nó sẽ vượt quá độ sâu đệ quy tối đa trên một số lượng lớn, nhưng nó hoạt động trên các số có kích thước vừa phải. Vì không có trường hợp thử nghiệm tối đa trong thông số kỹ thuật, đây vẫn nên được coi là một giải pháp hợp lệ.
RageCage

1
Con số 123456789khiến nó thất bại, thấp hơn giới hạn 10 ^ 15 được đăng trong câu hỏi.
Mùi

1
Bạn có thể dễ dàng biến đệ quy thành một vòng lặp và tránh vấn đề này hoàn toàn
Moop

1
Chạy cái này trong triển khai Stackless Python sẽ tránh được vấn đề độ sâu đệ quy.
xnor

0

QBIC , 38 byte, nc

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

Giải trình:

Mã này đọc một đầu vào, và sau đó áp dụng một sửa đổi. Sau đó, nó kiểm tra xem số + bộ sửa đổi có phải là một bảng màu hay không. Sau đó, nó thở dài trên công cụ sửa đổi, áp dụng lại và kiểm tra lại.

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

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

Đầu vào đi đến đối số dòng lệnh 1:

foo.sh 123456789

0

Tiên đề, 720 594 412 byte

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)

Số byte được tính một lần nữa, nhưng thuật toán này sẽ là O (log (n)) bởi vì nó sẽ chỉ nhúng từ chiều dài chữ số của đầu vào của nó (và log10 (n) sẽ ở gần chiều dài của các chữ số thập phân của n ). vô dụng và kết quả

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

Những người đã nói lại (hoặc để loại bỏ hoàn toàn) việc sử dụng goto cho ngôn ngữ máy tính, vì triển vọng lập trình viên sở thích khiêm tốn của tôi: Không đủ năng lực trong tin học !!!!
RosLuP

0

Husk , 16 12 9 byte

ḟoS=↔+⁰İZ

Cảm ơn @ H.PWiz cho -4 byte!

Hãy thử trực tuyến!

Giải trình

ḟ(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 ký tự

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

tìm kiếm ở trên nhưng algo không thể nhanh và đúng như g bên dưới ...

Điều này

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

là một lối thoát vòng lặp đơn giản chỉ khi nó tìm thấy b≡⌽b vì vậy b là một chuỗi palindrom

  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 byte

nȥsw}cU

Thử nó

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.