Палиндром Реверс-сложение
Процесс Reversal-Addition заключается в том, что число добавляется к обратному, пока созданное число не станет палиндромом. Например, если мы начнем с 68, процесс будет:
68 + 86 => 154 + 451 => 605 + 506 => 1111
Как видите, для получения палиндромного числа потребовалось 3 дополнения. Если бы мы начали с того 89
, что нам понадобилось бы 24 шага (вы можете увидеть разбивку здесь ).
Мировой рекорд по большинству шагов, предпринятых до достижения палиндрома, составляет 261, что соответствует числу 1186060307891929990
, в результате чего число превышает 10 118 . Тем не менее, было довольно много цифр, которые мы не смогли получить палиндром. Они называются числами Лихрела .
Поскольку мы работаем над базой 10, мы действительно можем назвать их только кандидатами, потому что нет никаких доказательств того, что эти числа никогда не достигают палиндрома. Например, самая маленькая база-10 Lychrel кандидат 196, и прошел более миллиарда итераций. Если палиндром существует, он намного больше 10 10 8,77 . Для сравнения, если бы это число 1 было записано на атомах, нам потребовалось бы 2,26772 × 10 588843575 единиц вселенных, чтобы выписать его, предполагая, что оно существует.
Твое задание
Создайте программу или функцию, которая принимает целое данные и возвращает или печатает количество шагов, необходимых для достижения палиндром. От вас не потребуется иметь дело с кандидатами в Lychrel (т. Е. Вашей программе, если выдан кандидат в Lychrel, разрешается либо выдавать ошибку, либо выполняться вечно).
Тестовые случаи:
f(0) => 0
f(11) => 0
f(89) => 24
f(286) => 23
f(196196871) => 45
f(1005499526) => 109
f(1186060307891929990) => 261
правила
Бонусы
- Если вы распечатаете каждый отформатированный шаг добавления,
n + rev(n) = m
вы можете умножить свой счет на 0,75 . Суммы должны быть распечатаны до количества шагов. - Если ваш код может определить, является ли число кандидатом в лихрель, вы можете умножить свой счет на 0,85 . В этом случае достаточно предположить, что все, что занимает более 261 итерации, является кандидатом в Лихрел. Либо ничего не вернуть, либо что-либо, что не является числом, которое может быть ошибочно принято за правильный ответ (и т. Д .: любая строка или число, не находящееся в диапазоне 0-261). Любая ошибка не считается действительным выходным сигналом (например, превышена максимальная глубина рекурсии) и не может использоваться при обнаружении.
- Если вы завершите оба бонуса, умножить на 0,6 .
Это код-гольф , поэтому выигрывает наименьшее количество байтов.
Этот фрагмент кода показывает пример решения в Python 3 с обоими бонусами.
def do(n,c=0,s=''):
m = str(n)
o = m[::-1]
if c > 261:
return "Lychrel candidate"
if m == o:
print(s)
return c
else:
d = int(m)+int(o)
s+="%s + %s = %s"%(m,o,str(d))
return do(d,c+1,s)
источник
*0.6
бонус на вершине других? Или это только так?10 + 01 = 11
или10 + 1 = 11
это зависит от нас?262
?Ответы:
Pyth, 12 байт
Попробуйте онлайн: демонстрация или тестовая привязь
Это использует совершенно новую функцию (всего 17 часов).
объяснение
редактировать:
Немного изменил код. Старая версия была
Тот же счетчик байтов, но новый намного круче.
источник
Python, 51
В Python 2 обратные ссылки не могут быть заменены
str()
из-заL
привязки кlong
литералам.Вот альтернативная версия со счетом 64 * 0,85 = 54,4 :
И альтернативная версия для Python 3 со счетом 88 * 0,6 = 52,8 :
источник
CJam,
232220,4 байтаКод имеет длину 24 байта и печатает -1 для кандидатов в Lychrel.
Попробуйте онлайн.
Как это устроено
Если
{}#
успешно, индекс также число шагов. Если, с другой стороны, массив не содержит палиндрома,{}#
будет выдвигаться -1 .источник
Ява, 200 * 0,6 = 120
Это простая петля, которая выполняет только то, что написано на коробке, но с добавлением некоторого количества гольфа. Возвращает
1000
кандидатов в Лихрел, чтобы получить бонус за обнаружение. Оказывается, я смог напечатать не слишком много символов (по крайней мере, для Java) и получить этот бонус. Лучшее, что я мог сделать без кода бонуса, было 156, так что оно того стоило.С некоторыми переносами строк:
Старый ответ: 171 * 0,85 = 145,35 байт
источник
s++<999
Рубин, (80 + 2) * 0,6 = ~ 49,2
С флагами
-nl
бегиВыход выглядит как
Если дано 196, он печатает первые 261 этапы сложения, а затем
nil
.Здесь нет ничего сложного. Мы проверяем,
$_
содержит ли (который инициализируется для ввода) его реверс, что возможно только в том случае, если они равны, поскольку имеют одинаковый размер. Если это так, мы печатаем номер шага и выходим, в противном случае мы отображаем и выполняем шаг сложения, сохраняя новое значение в$_
(я, к сожалению, не могу простоeval
отобразить строку, потому что она интерпретирует перевернутое число с завершающим 0 как восьмеричное буквальное).puts
возвращает значение Falsey, поэтому цикл продолжается.источник
" + #{b} = "
сохраняет байт.-l
если мы поместим число в файл без завершающего символа новой строки и передадим его по конвейеру?Pyth - 19 байт
Использует цикл while и счетчик. Вероятно, алгоритм меньше, чем этот, но он довольно короткий.
Попробуйте это онлайн здесь .
источник
К, 25 байт
Не очень элегантно Общая форма (
{monad 1}{monad 2}\x
) является эквивалентом K общего цикла while, где первая монада является условием остановки, а вторая - итеративно применяемой функцией аргументаx
. Первая монада ({~x~|x}
) - это отрицание классической фразы «является палиндромом». Вторая монада объединяет строку, представляющую x плюс обратную x, вычисляет ее и затем возвращает результат обратно в строку с$
.Пробный прогон с промежуточными результатами:
Выполнение форматированного вывода в соответствии с запросом бонуса будет очень неуклюжим и добавит значительное количество кода.
источник
CJam, 23 байта
До CJam осталось всего несколько дней, так что я очень рад оказаться в том же диапазоне, что и некоторые профессионалы. :) Я использовал трюк сравнения строк Мартина, который он также опубликовал в подсказках CJam. Я также заглянул в решение Денниса, чтобы выяснить, как перевернуть строку.
Объяснение:
Протестируйте это онлайн
источник
Юлия,
129120 байтов * 0,6 = 72Это создает безымянную функцию, которая принимает целое число в качестве входных данных и возвращает целое число, в то же время печатая каждый шаг. Кандидаты в Lychrel имеют возвращаемое значение 262. Чтобы вызвать это, дайте ему имя, например
f=i->...
.Обратите внимание, что без учета кода, относящегося только к бонусам, это решение будет иметь размер 84 байта.
Ungolfed + объяснение:
Примеры:
Сохранено 2 байта благодаря Geobits!
источник
CJam, 24 байта
Проверьте это здесь.
объяснение
Дополнительную информацию о том, почему
#
можно использовать для проверки неравенства строк, смотрите в этом совете .источник
#
.Haskell,
6653 байтаПример использования:
источник
r=reverse x
? Это изменит вашу вторую строкуf x|x==r=0|1<2=1+f(show$read x+read(r))
и сэкономит 2 байта.x
что не будет в рамках. Тем не менее,f x|x==r=0 .... read(r)) where r=reverse x
будет работать, но это дольше.Clojure, 94 байта
Это моя первая попытка кодировать гольф, поэтому, пожалуйста, скажите мне, если я делаю что-то не так.
С некоторыми пробелами:
Простая рекурсия внутренней функции. Он принимает два аргумента, целое число
%1
и индекс%2
. Если%1
это палиндром, индекс возвращается. В противном случае функция вызывает себя с суммой и увеличенным индексом. Внешняя функция инициализирует индекс с нуля.Образец:
источник
Boost.Build, 304 байта
Не совсем язык. Все еще круто.
Довольно просто, кроме сложного взлома на основе регулярных выражений, который я использовал, чтобы перевернуть строку.
источник
Руби, 44
Требуется Ruby 1,9 или выше для
->
лямбда-синтаксиса.источник