Зміна-доповнення паліндром
Процес відміни-додавання - це число, яке додається до зворотного, поки створене число не стане паліндром. Наприклад, якщо ми почнемо з 68, процес буде таким:
68 + 86 => 154 + 451 => 605 + 506 => 1111
Як бачите, для отримання паліндромного числа знадобилося 3 доповнення. Якби ми почали з цього 89
, нам знадобиться 24 кроки (які ви можете побачити тут ).
Світовий рекорд для більшості кроків, досягнутих до досягнення паліндрому, становить 261, що виникає для числа 1186060307891929990
, що дає число, що перевищує 10 118 . Однак було досить багато номерів, які ми не змогли отримати паліндром. Вони називаються числами Ліхреля .
Оскільки ми працюємо в базі 10, ми дійсно можемо називати їх лише кандидатами, оскільки не існує доказів того, що ці цифри ніколи не досягають паліндром. Наприклад, найменший кандидат-ліхрель-10 - це 196, і він пройшов понад мільярд ітерацій. Якщо паліндром існує, він значно більший за 10 10 8,77 . Для порівняння: якби стільки 1с було вписано на атоми, нам знадобиться 2,26772 × 10 588843575 всесвітів, варті атомів, щоб виписати його, припускаючи, що він існує.
Ваше завдання
Створіть програму або функцію, яка займає цілим числом і повертає або роздруковує кількість кроків, необхідних для досягнення паліндром. Від вас не буде потрібно мати справу з кандидатами в Ліхрел (тобто, ваша програма, коли дається кандидату Ліхрелу, дозволена або кинути помилку, або запуститись назавжди).
Випробування:
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
?