Зміна-доповнення паліндром
Процес відміни-додавання - це число, яке додається до зворотного, поки створене число не стане паліндром. Наприклад, якщо ми почнемо з 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?