Odwrócenie-dodawanie palindromu
Proces dodawania przez odwrócenie ma miejsce, gdy liczba jest dodawana do jej odwrotności, dopóki utworzona liczba nie będzie palindromem. Na przykład, jeśli zaczniemy od 68, proces wyglądałby następująco:
68 + 86 => 154 + 451 => 605 + 506 => 1111
Jak widać, zajęło to 3 uzupełnienia, aby uzyskać liczbę palindromową. Gdybyśmy mieli zacząć 89
, potrzebowalibyśmy 24 kroków (które można zobaczyć tutaj podział ).
Rekord świata w największej liczbie kroków wykonanych przed osiągnięciem palindromu wynosi 261, co występuje dla liczby 1186060307891929990
, dając liczbę większą niż 10 118 . Było jednak sporo liczb, których nie udało nam się uzyskać palindromu. Są to tak zwane liczby Lychrel .
Ponieważ pracujemy w bazie 10, naprawdę możemy nazywać ich kandydatami, ponieważ nie ma dowodów, że liczby te nigdy nie osiągają palindromu. Na przykład najmniejszy kandydat na Lychrela z grupy podstawowej 10 ma 196 lat i przeszedł ponad miliard iteracji. Jeśli palindrom istnieje, jest znacznie większy niż 10 10 8,77 . Dla porównania, jeśli tyle atomów 1 zostało zapisanych na atomach, potrzebowalibyśmy atomów o wartości 2,26772 × 10 588843575 wszechświatów, aby je zapisać, zakładając, że istnieje.
Twoje zadanie
Utwórz program lub funkcję, która przyjmuje liczbę całkowitą i zwraca lub drukuje liczbę kroków wymaganych do osiągnięcia palindromu. Nie będziesz musiał radzić sobie z kandydatami Lychrel (tzn. Twój program, gdy otrzyma kandydata Lychrel, może albo rzucić błąd, albo działać wiecznie).
Przypadki testowe:
f(0) => 0
f(11) => 0
f(89) => 24
f(286) => 23
f(196196871) => 45
f(1005499526) => 109
f(1186060307891929990) => 261
Zasady
Bonusy
- Jeśli wydrukujesz każdy krok dodawania, sformatowany
n + rev(n) = m
, możesz pomnożyć swój wynik przez 0,75 . Sumy powinny zostać wydrukowane przed liczbą kroków. - Jeśli Twój kod może wykryć, czy liczba jest kandydatem Lychrel, możesz pomnożyć swój wynik przez 0,85 . W tym przypadku wystarczy założyć, że wszystko, co wymaga więcej niż 261 iteracji, jest kandydatem Lychrela. Albo nie zwracaj niczego, ani niczego, co nie jest liczbą, którą można pomylić z poprawną odpowiedzią (itp .: dowolny ciąg znaków lub liczba spoza zakresu 0–261). Każdy błąd nie jest liczony jako prawidłowy wynik (np. Przekroczona maksymalna głębokość rekurencji) i nie może być użyty do wykrywania.
- Jeśli ukończysz oba bonusy, pomnóż je przez 0,6 .
To jest golf golfowy , więc wygrywa najmniejsza liczba bajtów.
Ten fragment kodu pokazuje przykładowe rozwiązanie w Pythonie 3 z obydwoma bonusami.
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
premia jest ważniejsza od pozostałych? Czy to po prostu to?
10 + 01 = 11
czy 10 + 1 = 11
też zależy to od nas?
262
?