Палиндром Реверс-сложение
Процесс 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
?