Найти ближайший палиндромный номер

22

Для числа N выведите / верните X так, чтобы N + X было палиндромом, где | X | должно быть как можно меньше.

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

На входе положительное целое число меньше 10 15 . Читайте это из стандартного ввода, как метод-параметр, что угодно.

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

Примеры:

Input             Output
3                 0
234               -2
1299931           -10
126               5 or -5 (only one of them)
CommonGuy
источник
Предположительно, если число находится посередине между двумя ближайшими палиндромами, является ли приемлемый результат? Например, для 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
isaacg
источник
Просто чтобы вы знали, правила изменились на поиск ближайшего палиндрома (в любом направлении). Но я полагаю, что с тех пор, как вы опубликовали до изменения этого правила, вы не обязаны его исправлять.
Мартин Эндер
Может ли это сохранить символы для цикла Z через [0, 1, -1, 2, -2, ...]обновление Z=-Z+(Z<0)?
xnor
Да, я думал об этом самостоятельно.
Исаак
@xnor Добавлено. Наполнитель.
Исаак
Ладно, круто. Вы также задумывались над тем, чтобы отложить отрицание этого состояния на какое-то время? И, возможно, сохранить репр, применив его к входу в P?
xnor
7

Рубин, 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 Спасибо, не знал этого! Мое представление работает, насколько я могу судить.
Мартин Эндер
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 Спасибо! Очень элегантный трюк со списком монад.
Рэй
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
Moop
источник
Это не дает самую маленькую дельту. f(19) = -8(палиндром 11), где это надо +3сделать 22.
Geobits
@Geobits Да, 10-100 значений приведут меня к проблеме с этим подходом
Moop
Это не только те. Точно так же 199999 дает -8 вместо 3, 9911 дает 88 вместо -22. Простое изменение первых цифр не работает, чтобы получить наименьшую дельту во многих случаях.
Geobits
Ну, я бы не сказал, что много случаев, я держал пари, что 99,9% случаев, на которые он работает. Но да, это должно работать в 100% случаев
Moop
@Geobits. Конечно, там 27% ошибок. Но когда вы добираетесь до 100000000, частота ошибок значительно падает. Было бы интересно рассчитать фактическую частоту ошибок.
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

user0721090601
источник
1
1. -$aкороче чем $a*-1. 2. Если вы используете ($a<1), нет необходимости ? :$a++. 3. Если вы используете -pпереключатель $_=<>и print$_неявно, так что вы можете отбросить первый оператор и изменить последний на $_=$a+0.
Денис
@ Денис Ницца находит. Это всего лишь моя вторая попытка кода в гольф, поэтому ценим советы!
user0721090601
Обычно считается, что -pпереключатель является одним дополнительным байтом, но вы можете получить его обратно, используя ($a<1)-$aвместо -$a+($a<1).
Деннис
@Dennis Я хотя и использую этот метод, основываясь на вашем ответе выше, но выигрыш теряется, потому что раньше ему требуется пробелwhile
user0721090601
Если вы используете $/вместо $a, это будет работать.
Деннис
4

05AB1E , 15 14 байт (-1 Спасибо Эмигне)

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

Попробуйте онлайн!


Метод:

  • Возьмите первую половину числа.
  • Зеркало оно пересекалось, если нечетное, не пересекалось, если даже.
  • Разница.
Урна волшебного осьминога
источник
Я думаю, что вы можете использовать 2äнвместо g;î£.
Emigna
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;
}   
Geobits
источник
Работает ли n+i+""и сохраняет скобки? Я думаю, что приоритет должен быть правильным.
Питер Тейлор
@PeterTaylor Да, и получил еще несколько toString(). Спасибо :)
Geobits
1
Могу ли я украсть это сладкое i=i<1?-i+1:-i? Я назову это «неумеренностью».
Джейкоб
@Jacob Перейти на это;)
Geobits
3

Clojure, 92

Принимает первое из ленивой последовательности for, которая работает с 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
YosemiteMark
источник
2

JavaScript, 175 136 117

Непосредственная. pвозвращает true, если заданное число является палиндромом, fищет ближайший.

РЕДАКТИРОВАТЬ: Я также играл в гольф немного больше, благодаря сладкой уловке "неосмотрительности" 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}. 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 1к 1 _1.

algorithmshark
источник
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 в строку и разбить.
Выполните итерации по обеим сторонам полученного массива и копируйте цифры из s [i] в ​​s [j], пока i <j. Это приведет к нашему желаемому палиндрому.
Соедините массив обратно и вычтите n, чтобы получить x

Beldraith
источник
Добро пожаловать в PPCG! Этот ответ имеет правильную структуру (представления функций обычно лучше всего работают в JavaScript) и, похоже, также дает правильные ответы. Ваш пост может быть улучшен с помощью объяснения того, почему этот алгоритм работает (для меня не очевидно, почему он работает), но на данный момент это нормально.
Спасибо, я добавил небольшое объяснение и версию без загадок
Beldraith
Вы можете изменить s=(n+'').split('')на s=[...(n+'')]. сбрить 5 байтов
Брайан Х.
Я думал так же, но 19 кажется первым контрпримером: f(19)=3потому что 22 является ближайшим палиндромом, но функция возвращает -8 для преобразования 19 в 11. Кстати, [...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., но это другой подход.

Тестовый код

yetirs
источник
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 символов

Golfed:

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

Питон 2 - 76

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

Получает входной номер и генерирует список различий между входным и каждым числом между 0и 2*iтолько в том случае, если число является палиндромным.

Затем он сортирует список по абсолютному значению и печатает первый элемент.

BeetDemGuise
источник
Я не думаю, что диапазон (2 * я) будет работать для больших входов.
Moop
Вы можете использовать minс аргументом ключевого слова, а не сортировки.
xnor
Чтобы использовать такие длинные диапазоны, вам нужно переключиться на xrange, который является генератором, и min, который закорачивает, чтобы избежать переполнения вашей памяти.
Исаак
1

С ++ 289

Функция P проверяет палиндромы, используя <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;
}
bacchusbeale
источник
Короче будет все расставить по одной строке.
кот
1

Mathematica 75

Вероятно, можно играть в гольф больше ..

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

Пробелы не учитываются и не нужны.

freddieknets
источник
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.

Titus
источник
1

JavaScript 68 байт

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

HUGE обращается к @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
Брайан Х.
Golfable до 63:, (n,s=[...n+''],j=s.length)=>s.map((v,i)=>i>--j?s[j]:v).join``-nно также существует неочевидный контрпример (19);)
Shieru Asakoto
ой, это не просто 19, это любое число, которое заканчивается 9 и должно получить положительный результат
Брайан Х.
0

Питон, 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)
RageCage
источник
это выдает ошибку при работе (превышена максимальная глубина рекурсии)
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

Объяснение:

Код читает входные данные, а затем применяет модификатор. Затем он проверяет, является ли модификатор number + палиндромом. Затем он переключает вздох на модификатор, повторно применяет его и снова тестирует.

:{        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
steenbergh
источник
0

Баш, 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
iBug
источник
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 ). бездельник и результаты

-- 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
RosLuP
источник
Те снова (или для полного исключения) говорили об использовании goto для компьютерных языков, для моего потенциального программиста, занимающегося хобби: они некомпетентны в информатике !!!!
РосЛюП
0

Шелуха , 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

этот поиск выше, но алгоритм не может быть быстрым и правильным, как г ниже ...

это

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 
RosLuP
источник
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
мохнатый
источник