Для числа 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)
источник
N=10
вывода можноX=-1
илиX=1
?Ответы:
Пиф ,
2620Обновлено, чтобы соответствовать новым правилам.
Программа работает в бесконечном цикле, который проверяет все возможные приращения, в порядке 0, -1, 1, -2, -2 ...
Объяснение:
Пример выполнения:
Это заняло 23 секунды.
Бонусное решение с тем же количеством символов:
источник
[0, 1, -1, 2, -2, ...]
обновлениеZ=-Z+(Z<0)
?Рубин,
11184 байтаПринимает число в качестве единственного аргумента командной строки.
источник
CJam,
342925 байтПопробуйте онлайн.
Примеры
Как это работает
источник
Haskell - 62
Сохраните его в файл с именем
golf.hs
и затем протестируйте его с помощью ghci:источник
x<-[0..]>>=(\v->[n+v,n-v])
? Это короче, и это делает его однострочнымPython 2.7,
98, 81Создает палиндром из входного числа, затем вычитает его из входного значения, чтобы найти дельту.
использование:
разглаженный и аннотированный:
источник
f(19) = -8
(палиндром11
), где это надо+3
сделать22
.Perl 5,
93898887756344Ungolfed:
Благодаря предложениям Денниса, он снизился до 43 +
-p
= 44источник
-$a
короче чем$a*-1
. 2. Если вы используете($a<1)
, нет необходимости? :$a++
. 3. Если вы используете-p
переключатель$_=<>
иprint$_
неявно, так что вы можете отбросить первый оператор и изменить последний на$_=$a+0
.-p
переключатель является одним дополнительным байтом, но вы можете получить его обратно, используя($a<1)-$a
вместо-$a+($a<1)
.while
$/
вместо$a
, это будет работать.05AB1E ,
1514 байт (-1 Спасибо Эмигне)Попробуйте онлайн!
Метод:
источник
2äн
вместоg;î£
.Ява:
127109Базовая итерация, проверка как отрицательного, так и положительного перед переходом к следующему кандидату.
Для ввода
123456789012345
возвращается-1358024
значение равное палиндрому123456787654321
.Разрывы строк:
источник
n+i+""
и сохраняет скобки? Я думаю, что приоритет должен быть правильным.toString()
. Спасибо :)i=i<1?-i+1:-i
? Я назову это «неумеренностью».Clojure, 92
Принимает первое из ленивой последовательности for, которая работает с 0 и включает только значения, которые образуют палиндромы:
REPL-LPER сессия:
источник
JavaScript,
175136117Непосредственная.
p
возвращает true, если заданное число является палиндромом,f
ищет ближайший.РЕДАКТИРОВАТЬ: Я также играл в гольф немного больше, благодаря сладкой уловке "неосмотрительности" Geobits в ответе Java здесь.
Использование:
источник
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}
:)function
иreturn
это ужасно длинные зарезервированные слова ...s=>{for(i=0;[...s+i+""].reverse().join``!=s+i;i=i<0?-i:~i);return i}
.f=(s,i=0)=>[...s+i+""].reverse().join``==s+i?i:f(s,i<0?-i:~i)
J - 49 символов
Функция, отображающая целые числа в целые.
Вот как вы можете построить этот результат, в трех частях. Это отображение J REPL: строки с отступом - ввод пользователя, а строки с отступом - вывод REPL. И да, J записывает отрицательный знак с подчеркиванием
_
.Примеры:
Вы также можете сделать гольф предпочитают положительное решение по поводу негатива , когда они равны, изменяя
_1 1
к1 _1
.источник
Javascript 86
Это мой первый вызов 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
источник
s=(n+'').split('')
наs=[...(n+'')]
. сбрить 5 байтовf(19)=3
потому что 22 является ближайшим палиндромом, но функция возвращает -8 для преобразования 19 в 11. Кстати,[...n+'']
это также будет работать для дополнительных -2 байтовJavaScript (ES6), 84 байта
Мой первый вызов в гольф! Я знаю, что более короткое и элегантное решение уже было опубликовано @Brian H., но это другой подход.
Тестовый код
Показать фрагмент кода
источник
Брахилог , 8 байт
Попробуйте онлайн!
Предикат метки
≜
здесь жизненно важен, потому что при использовании его в выходных данных до того, как что-либо еще произойдет (хотя он действительно вызывается в списке, содержащем входные и выходные данные), его абсолютное значение сводится к минимуму, потому что вместо того, чтобы делать что-то более умное на основе Ограничения программа угадывает каждое целое число, начиная с 0, пока не найдет то, которое работает. Если≜
опущено, программа узнает, что 0 - очень хороший палиндром, и всегда будет выводить отрицательный результат ввода.источник
Groovy -
131111107 символовGolfed:
пробные прогоны:
Ungolfed:
источник
Питон 2 - 76
Получает входной номер и генерирует список различий между входным и каждым числом между
0
и2*i
только в том случае, если число является палиндромным.Затем он сортирует список по абсолютному значению и печатает первый элемент.
источник
min
с аргументом ключевого слова, а не сортировки.С ++ 289
Функция P проверяет палиндромы, используя
<algorithm>
метод.Ungolfed:
источник
Mathematica 75
Вероятно, можно играть в гольф больше ..
Пробелы не учитываются и не нужны.
источник
CoffeeScript: 73
Объяснение: Это использует тот факт, что если у нас есть число нечетной длины (скажем, 1234567),
x.slice(0, y)
не будет включать в себя среднюю цифру, ноx.slice(0, -y)
будет. JavaScript,slice
вероятно, не должен работать таким образом, но это работает.Я ожидал, что у CoffeeScript / JavaScript будет лучший способ перевернуть строку, но метод split / reverse / join, кажется, все, что есть.
источник
PHP, 56 байт
принимает входные данные из аргумента командной строки; беги с
-nr
.источник
JavaScript 68 байт
HUGE обращается к @Beldraith за алгоритмом, хотя я публикую это как ответ, потому что мне потребовалось достаточно времени, чтобы заставить его работать в одном выражении.
Любые советы приветствуются;)
ungolfed
источник
(n,s=[...n+''],j=s.length)=>s.map((v,i)=>i>--j?s[j]:v).join``-n
но также существует неочевидный контрпример (19);)Питон, 109
источник
123456789
заставляет его терпеть неудачу, намного ниже 10 ^ 15 предела, отправленного в вопросе.QBIC , 38 байт, nc
Объяснение:
Код читает входные данные, а затем применяет модификатор. Затем он проверяет, является ли модификатор number + палиндромом. Затем он переключает вздох на модификатор, повторно применяет его и снова тестирует.
источник
Баш, 73 байта
Ввод идет в 1-й аргумент командной строки:
источник
Аксиома,
720594412 байтСчетчик байтов это опять-таки это, но, возможно, это будет O (log (n)), потому что он будет зависеть только от длины цифры его ввода (а log10 (n) будет около длины десятичных цифр n ). бездельник и результаты
источник
Шелуха ,
16 129 байтСпасибо @ H.PWiz за -4 байта!
Попробуйте онлайн!
объяснение
источник
APL NARS 47 символов
этот поиск выше, но алгоритм не может быть быстрым и правильным, как г ниже ...
это
является простым выходом из цикла, только когда он находит b≡⌽b, так что b является палиндромом строки
источник
Python 2 ,
5554 байтаПопробуйте онлайн!
источник
Japt , 8 байт
Попытайся
источник