ค้นหาหมายเลข palindromic ที่ใกล้เคียงที่สุด


22

รับตัวเลขNเอาต์พุต / return Xดังนั้นN + Xคือ palindrome โดยที่| X | จะต้องมีขนาดเล็กที่สุด

Palindrome:ตัวเลขคือ palindrome หากลำดับของตัวเลขเหมือนกันเมื่ออ่านจากซ้ายไปขวาเหมือนกับเมื่ออ่านจากขวาไปซ้าย
95359และ6548456มีความสมมาตร123และ2424ไม่ใช่ ตัวเลขที่มีเลขศูนย์นำหน้าเช่น020palindrome

การป้อนข้อมูลเป็นจำนวนเต็มบวกที่มีขนาดเล็กกว่า 10 15 อ่านจาก stdin เป็น method-parameter อะไรก็ได้

เอาท์พุทจะต้องเป็นจำนวนเต็ม (บวกหรือลบ) และควรเป็น 0 ถ้าอินพุตนั้นเป็นพาลินด์มาแล้ว คุณสามารถเขียนผลลัพธ์ของคุณไปยัง stdout ส่งคืนจากฟังก์ชั่นหรือสิ่งที่คุณต้องการ หากมี 2 ตัวเลข (เช่น2และ-2) ที่ตรงตามข้อกำหนดให้ส่งออกเพียงหนึ่งในนั้น

ตัวอย่าง:

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

สันนิษฐานว่าถ้าตัวเลขอยู่กึ่งกลางระหว่างสอง palindromes ที่ใกล้ที่สุดทั้งเป็นเอาท์พุทที่ยอมรับได้? เช่นสำหรับN=10ผลลัพธ์สามารถเป็นX=-1หรือX=1?
Peter Taylor

@PeterTaylor ใช่มันต้องมีขนาดเล็กที่สุดเท่าที่จะเป็นไปได้
CommonGuy

คำตอบ:


9

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

เพียงแค่แจ้งให้คุณทราบกฎได้เปลี่ยนไปเป็นการค้นหา palindrome ที่ใกล้ที่สุด (ในทิศทางใดทิศทางหนึ่ง) แต่ฉันเดาว่าเนื่องจากคุณโพสต์ก่อนที่การเปลี่ยนแปลงกฎจะไม่มีข้อผูกมัดใด ๆ ให้คุณแก้ไข
Martin Ender

อาจบันทึกตัวอักษรเพื่อวนซ้ำ Z ผ่าน[0, 1, -1, 2, -2, ...]การอัปเดตZ=-Z+(Z<0)หรือไม่
xnor

ใช่ - ฉันคิดอย่างนั้นอย่างอิสระ
isaacg

เพิ่ม @xnor แล้ว พู้ที่ใส่
isaacg

โอเคดี. คุณได้มองไปที่การปฏิเสธเงื่อนไขในขณะที่? และอาจบันทึกการตอบโต้ด้วยการนำไปใช้กับอินพุตไปยัง P
xnor

7

Ruby, 111 84 ไบต์

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

รับจำนวนเป็นอาร์กิวเมนต์บรรทัดคำสั่งเท่านั้น


วิธีการเกี่ยวกับเว็บไซต์นี้ ?
CommonGuy

@Manu ขอบคุณไม่ทราบว่าหนึ่ง! การส่งของฉันทำงานเท่าที่ฉันสามารถบอกได้
Martin Ender

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

Haskell - 62

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

บันทึกลงในไฟล์ชื่อgolf.hsแล้วทดสอบด้วย 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> 

วิธีการเกี่ยวกับการเขียนx<-[0..]>>=(\v->[n+v,n-v])? มันสั้นกว่าและทำให้เป็นหนึ่งซับ
ภูมิใจ haskeller

@proudhaskeller ขอบคุณ! เคล็ดลับที่หรูหรามากกับรายการ Monad
เรย์

4

Python 2.7, 98 , 81

สร้าง palindrome จากหมายเลขอินพุตจากนั้นลบออกจากอินพุตเพื่อค้นหาเดลต้า

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

ungolfed และข้อเขียน:

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
Geobits

@Geobits ใช่ค่า 10-100 จะให้ฉันปัญหาด้วยวิธีนี้
Moop

มันไม่ใช่แค่นั้น ในทำนองเดียวกัน 199999 ให้ -8 แทน 3, 9911 ให้ 88 แทน -22 เพียงแค่ย้อนกลับหลักแรกไม่ได้ผลเพื่อให้ได้เดลต้าที่เล็กที่สุดในหลายกรณี
Geobits

ดีฉันจะไม่พูดหลายกรณีฉันเดิมพัน 99.9% ของคดีมันใช้งานได้ แต่ใช่มันต้องใช้งานได้ 100% ของคดี
Moop

@Geobits แน่นอนว่าอัตราความผิดพลาด 27% อยู่ที่นั่น แต่เมื่อคุณไปถึง 100000000s อัตราความผิดพลาดจะลดลงอย่างมาก มันจะน่าสนใจในการคำนวณอัตราความผิดพลาดจริง
Moop

4

Perl 5, 93 89 88 87 75 63 44

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

Ungolfed:

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*-12. ถ้าคุณใช้ไม่มีความจำเป็นในการ($a<1) ? :$a++3. ถ้าคุณใช้-pสวิทช์$_=<>และเป็นนัยเพื่อให้คุณสามารถวางคำสั่งแรกและเปลี่ยนไปยังหน้าล่าสุดprint$_ $_=$a+0
Dennis

@Dennis Nice พบ นี่เป็นเพียงความพยายามครั้งที่สองของฉันที่การตีกอล์ฟดังนั้นขอขอบคุณคำแนะนำ!
user0721090601

มันเป็นธรรมเนียมที่จะต้องนับ-pสวิทช์เป็นหนึ่งไบต์พิเศษ แต่คุณจะได้รับกลับมาโดยใช้แทน($a<1)-$a -$a+($a<1)
เดนนิส

@Dennis ฉันคิดว่าการใช้วิธีการนั้นขึ้นอยู่กับคำตอบของคุณข้างต้น แต่กำไรหายไปเพราะต้องใช้ช่องว่างก่อนwhile
user0721090601

หากคุณใช้$/แทน$aมันจะทำงาน
เดนนิส

4

05AB1E , 15 14 ไบต์ (-1 ขอบคุณ Emigna)

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

ลองออนไลน์!


วิธี:

  • จดครึ่งแรกของตัวเลข
  • มิร์เรอร์มันตัดกันหากคี่และไม่ตัดกันถ้าเป็นคู่
  • ข้อแตกต่าง

ฉันคิดว่าคุณสามารถใช้แทน2äн g;î£
Emigna

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ไป 123456787654321palindrome

ตัวแบ่งบรรทัด:

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+""ทำงานและประหยัดวงเล็บ? ฉันคิดว่าลำดับความสำคัญควรถูกต้อง
Peter Taylor

@PeterTaylor toString()อ้อและมีไม่กี่อื่นจาก ขอบคุณ :)
Geobits

1
ฉันจะขโมยขนมหวานได้i=i<1?-i+1:-iไหม? ฉันจะเรียกมันว่า "การสร้าง"
จาค็อบ

@Jacob ไปกันเถอะ;)
Geobits

3

Clojure, 92

รับลำดับแรกจากสันหลังยาวสำหรับลำดับที่ทำงานจาก 0 out และรวมเฉพาะค่าที่สร้าง palindromes:

(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ผลตอบแทนจริงถ้าจำนวนที่กำหนดคือ palindrome fค้นหาที่ใกล้ที่สุด

แก้ไข:ฉันยังเล่นกอล์ฟอีกเล็กน้อยขอบคุณเคล็ดลับ "indecrement" อันแสนหวานโดยGeobitsในคำตอบ Javaที่นี่

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)

104 ใน 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
ฉันพนันได้เลยว่า functionและreturnจะชะมัดคำสงวนยาว ...
ยาโคบ

1
ขออภัยสำหรับความล่าช้า 3 ปี แต่ไปถึง 68 ใน ES6: s=>{for(i=0;[...s+i+""].reverse().join``!=s+i;i=i<0?-i:~i);r‌​eturn i}ES6: กองซ้อนล้นได้ง่าย 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)

นี่คือวิธีที่คุณอาจสร้างผลลัพธ์นี้ในสามส่วน นี่คือการแสดงผลของ 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 11 _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}

นี่เป็นความท้าทายครั้งแรกของฉัน หวังว่าวิธีนี้เป็นที่ยอมรับ

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 เป็น String และแยก
วนซ้ำทั้งสองด้านของอาร์เรย์ผลลัพธ์และคัดลอกตัวเลขบน s [i] ไปยัง s [j] จนกระทั่ง i <j สิ่งนี้จะส่งผลให้เป็นที่ต้องการของเรา
เข้าร่วมอาร์เรย์กลับเข้าด้วยกันแล้วลบ n เพื่อรับ x


ยินดีต้อนรับสู่ PPCG! คำตอบนี้มีโครงสร้างที่ถูกต้อง (ปกติการส่งฟังก์ชั่นจะใช้งานได้ดีที่สุดใน JavaScript) และดูเหมือนว่าจะให้คำตอบที่ถูกต้องเช่นกัน โพสต์ของคุณอาจได้รับการปรับปรุงด้วยคำอธิบายว่าทำไมอัลกอริทึมนี้จึงใช้งานได้ (ไม่ชัดเจนสำหรับฉันว่าทำไมถึงเป็นเช่นนั้น) แต่ก็ใช้ได้ในขณะนี้

ขอบคุณ ive เพิ่มคำอธิบายเล็ก ๆ และเวอร์ชันที่ไม่ดี
Beldraith

คุณสามารถเปลี่ยนไปs=(n+'').split('') s=[...(n+'')]จะโกนออก 5 ไบต์
Brian H.

ฉันคิดแบบเดียวกัน แต่ 19 ดูเหมือนจะเป็นตัวอย่างแรก: f(19)=3เพราะ 22 เป็น palindromic ที่ใกล้เคียงที่สุด แต่ฟังก์ชันส่งกลับค่า -8 สำหรับการแปลง 19 เป็น 11 11. btw [...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 เป็น palindrome ที่ดีมากและมันจะแสดงผลลบของอินพุต

            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 ตัวอักษร

แข็งแรงเล่นกอล์ฟ:

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

Ungolfed:

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เฉพาะในกรณีที่ตัวเลขเป็น Palindromic

จากนั้นเรียงลำดับรายการตามค่าสัมบูรณ์และพิมพ์องค์ประกอบแรก


ฉันไม่คิดว่าช่วง (2 * i) จะทำงานสำหรับอินพุตขนาดใหญ่
Moop

คุณสามารถใช้minกับอาร์กิวเมนต์คำหลักแทนการเรียงลำดับ
xnor

ในการใช้ช่วงที่มีความยาวคุณจะต้องเปลี่ยนไปใช้ xrange ซึ่งเป็นตัวกำเนิดและ min ซึ่งเป็นวงจรลัดเพื่อหลีกเลี่ยงการโอเวอร์คล็อกหน่วยความจำของคุณ
isaacg

1

C ++ 289

ฟังก์ชั่น P ตรวจสอบการใช้ palindromes <algorithm>เมธอด

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

มันจะสั้นกว่าที่จะใส่ทุกอย่างในบรรทัดเดียว
แมว

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)จะ sliceอาจจะไม่ควรใช้ JavaScriptทำงานด้วยวิธีนี้ แต่ทำได้

ฉันคาดหวังว่า CoffeeScript / JavaScript จะมีวิธีที่ดีกว่าในการย้อนกลับสตริง แต่วิธีแบ่ง / ย้อนกลับ / เข้าร่วมดูเหมือนว่าจะมีทั้งหมด


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 สำหรับอัลกอริทึมฉันกำลังโพสต์คำตอบนี้เพราะฉันใช้เวลาพอสมควรที่จะทำให้มันทำงานได้ในแถลงการณ์เดียว

ยินดีต้อนรับเคล็ดลับใด ๆ ;)

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 หวังว่าคุณจะไม่รังเกียจฉันตอบคำตอบของคุณไปยังฟังก์ชั่นคำสั่งเดียวฉันมีระเบิดที่ทำเช่นนั้น: D
Brian H.

สามารถเล่นได้ถึง 63: (n,s=[...n+''],j=s.length)=>s.map((v,i)=>i>--j?s[j]:v).join``-nแต่ยังมีตัวอย่างที่ไม่ชัดเจน (19) อยู่ด้วย)
Shieru Asakoto

อุ๊ปส์ไม่ใช่แค่ 19 มันเป็นตัวเลขใด ๆ ที่ลงท้ายด้วย 9 และควรได้รับผลบวก
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)

สิ่งนี้จะโยนข้อผิดพลาดเมื่อทำงาน (ความลึกการเรียกซ้ำสูงสุดเกิน)
Moop

นั่นไม่ใช่ข้อผิดพลาดในรหัสของฉัน มันจะเกินความลึกการเรียกซ้ำสูงสุดในจำนวนมาก แต่จะทำงานกับตัวเลขที่มีขนาดเหมาะสม เนื่องจากไม่มีกรณีทดสอบสูงสุดในรายละเอียดจึงควรพิจารณาวิธีการแก้ปัญหาที่ถูกต้อง
RageCage

1
ตัวเลข123456789ทำให้เกิดความล้มเหลวต่ำกว่าขีด จำกัด 10 ^ 15 ที่โพสต์ในคำถาม
Moop

1
คุณสามารถเปลี่ยนการวนรอบเป็นวงวนได้อย่างง่ายดายและหลีกเลี่ยงปัญหานี้โดยสิ้นเชิง
Moop

1
การรันสิ่งนี้ในการใช้งาน Stackless Python ควรหลีกเลี่ยงปัญหาความลึกในการเรียกซ้ำ
xnor

0

QBIC , 38 ไบต์, nc

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

คำอธิบาย:

รหัสอ่านอินพุตจากนั้นใช้ตัวดัดแปลง จากนั้นจะทำการทดสอบเพื่อดูว่าหมายเลข + ตัวปรับเปลี่ยนเป็น Palindrome หรือไม่ จากนั้นจะทำการถอนหายใจเมื่อโมดิฟายเออร์นำไปใช้อีกครั้งและทดสอบอีกครั้ง

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

อินพุตไปที่อาร์กิวเมนต์บรรทัดคำสั่งที่ 1:

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

Husk , 16 12 9 ไบต์

ḟoS=↔+⁰İZ

ขอบคุณ @ H.PWiz สำหรับ -4 ไบต์!

ลองออนไลน์!

คำอธิบาย

ḟ(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 คือ 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

Japtet , 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.