Знайдіть найближче паліндромне число


22

Дано число N , вихід / повернення X так, що N + X є паліндром, де | X | повинно бути якомога менше.

Паліндром: Число - це паліндром, якщо його послідовність цифр однакова при читанні зліва направо, як при читанні справа наліво.
95359і 6548456симетричні, 123і 2424ні. Числа з провідними нулями, такими як 020не є паліндром.

Вхідне ціле додатне число, менше 10 15 . Прочитайте його з stdin, як метод-параметр, як би там не було.

Вихід повинен бути цілим числом (позитивним чи негативним) і повинен бути 0, якщо вхід вже є паліндром. Ви можете записати свій вихід у stdout, повернути його з функції або будь-чого, що вам подобається. Якщо є 2 числа (наприклад, 2та -2), які відповідають вимогам, виведіть лише одне з них.

Приклади:

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

Імовірно, якщо число знаходиться на півдорозі між двома найближчими паліндрами, чи це прийнятний вихід? Наприклад, N=10вихід може бути X=-1або X=1?
Пітер Тейлор

@PeterTaylor Так, це просто повинно бути якомога менше.
CommonGuy

Відповіді:


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

Щоб повідомити вас, правила змінилися на пошук найближчого паліндрому (в будь-якому напрямку). Але я здогадуюсь, оскільки ви опублікували перед зміною цього правила, ви не маєте зобов'язань виправляти це.
Мартін Ендер

Чи може це зберегти символи для циклу Z [0, 1, -1, 2, -2, ...]за допомогою оновлення Z=-Z+(Z<0)?
xnor

Так - я думав про це самостійно.
isaacg

@xnor Додано Наповнювач.
isaacg

ОК здорово. Ви також розглядали питання про заперечення умови? І, можливо, зберегти репр, застосувавши його до вводу на P?
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

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])? Він коротший, і це робить його
однолінійним

@proudhaskeller Дякую! Дуже елегантний трюк зі списком монади.
Рей

4

Пітон 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.
Геобіць

@Geobits Так, значення 10-100 дадуть мені проблему з таким підходом
Moop

Це не лише ті. Аналогічно, 199999 дає -8 замість 3, 9911 дає 88 замість -22. Просто повернення перших цифр не допомагає отримати найменшу дельту у багатьох випадках.
Геобіт

добре, я б не сказав багато випадків, я ставлю ставку на 99,9% випадків, для яких це працює. Але так, це потрібно працювати в 100% випадків
Moop

@Geobits. Звичайно, тому 27% помилок там. Але коли ви дістаєтесь до 100000000, рівень помилок значно знижується. Було б цікаво порахувати фактичну частоту помилок.
Moop

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.
Денніс

@Денніс Ніцца знаходить. Це лише моя друга спроба кодового гольфу, тому оцініть поради!
користувач0721090601

-pПеремикач прийнято вважати одним додатковим байтом, але ви можете отримати його назад, використовуючи ($a<1)-$aзамість -$a+($a<1).
Денніс

@Dennis Я хоч про використання цього методу, що базується на вашій відповіді вище, але виграш втрачається, оскільки для цього потрібен пробілwhile
user0721090601

Якщо ви використовуєте $/замість $a, це буде працювати.
Денніс

4

05AB1E , 15 14 байт (-1 Спасибі Emigna)

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

Спробуйте в Інтернеті!


Спосіб:

  • Візьміть першу половину числа.
  • Дзеркало воно перетиналося, якщо непарне, не пересічене, якщо парне.
  • Різниця.

Я думаю, ви можете використовувати 2äнзамість цього g;î£.
Емінья

3

Ява: 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? Я назву це «нерішучістю».
Яків

@Jacob Go for it;)
Геобіт

3

Clojure, 92

Знімає перше з ледачої послідовності, яка працює від 0 і включає лише значення, що створюють паліндроми:

(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повертає істину, якщо задане число паліндром, fшукає найближче.

EDIT: Я також трохи більше пограв у гольф завдяки солодкій хитрість "непристойності" від 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}:)
Вільям Барбоса

1
Гадаю, що так і є. functionі returnстрашенно довго зарезервовані слова ...
Яків

1
Вибачте за затримку в 3 роки, але golfed до 68 в ES6: 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 char

Функція, яка відображає цілі числа до цілих чисел.

((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 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 у String та split.
Ітерації над обома сторонами отриманого масиву і копіюйте цифру на s [i] до s [j], поки i <j. Це призведе до бажаного паліндрому.
Об’єднайте масив назад разом і відніміть n, щоб отримати х


Ласкаво просимо до PPCG! Ця відповідь має правильну структуру (подання функцій зазвичай найкраще працює в JavaScript), і, здається, дає і правильні відповіді. Ваша публікація може бути покращена через пояснення того, чому цей алгоритм працює (мені не очевидно, чому він так працює), але на даний момент це добре.

Дякую, Івє додав невелике пояснення та неперевершену версію
Beldraith

ви можете змінити s=(n+'').split('')на s=[...(n+'')]. голити 5 байт
Брайан Х.

Я думав так само, але 19, здається, є першим контрприкладом: f(19)=3тому що 22 є найближчим паліндромним, але функція повертає -8 для перетворення 19 в 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

Брахілог , 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

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

Безголівки:

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

Пітон 2 - 76

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

Отримує номер введення та формує список відмінностей між вхідним та кожним числом між 0та2*i лише у тому випадку, якщо число є паліндромним.

Потім сортується список за абсолютним значенням і друкується перший елемент.


Я не думаю, що діапазон (2 * i) буде працювати для великих входів.
Moop

Можна використовувати minаргумент ключового слова, а не сортувати.
xnor

Щоб використовувати діапазони так довго, вам потрібно переключитися на xrange, який є генератором, і min, який коротке замикання, щоб уникнути перенапруження пам’яті.
isaacg

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

Математика 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 для алгоритму, я публікую це як відповідь, тому що мені знадобилося досить часу, щоб змусити його працювати в одному заяві.

Будь-які поради вітаються;)

неозорий

(
    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
Брайан Х.

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.