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)
źródło
*0.6
premia jest ważniejsza od pozostałych? Czy to po prostu to?10 + 01 = 11
czy10 + 1 = 11
też zależy to od nas?262
?Odpowiedzi:
Pyth, 12 bajtów
Wypróbuj online: Demonstracja lub Uprząż testowa
Wykorzystuje to całkiem nową funkcję (tylko 17 godzin).
Wyjaśnienie
edytować:
Trochę zmieniłem kod. Stara wersja była
Ta sama liczba bajtów, ale nowy jest znacznie fajniejszy.
źródło
Python, 51
W Pythonie 2 backticks nie mogą zastąpić
str()
ze względu naL
dołączone dolong
literałów.Oto alternatywna wersja z wynikiem 64 * 0,85 = 54,4 :
I alternatywna wersja dla Pythona 3 z wynikiem 88 * 0,6 = 52,8 :
źródło
CJam,
232220,4 bajtówKod ma 24 bajty i drukuje -1 dla kandydatów Lychrel.
Wypróbuj online.
Jak to działa
Jeśli
{}#
się powiedzie, indeks jest również liczbą kroków. Z drugiej strony, jeśli tablica nie zawiera palindromu,{}#
popchnie -1 .źródło
Java, 200 * 0,6 = 120
Jest to prosta pętla, która robi dokładnie to, co jest napisane na pudełku, ale z dodatkiem golfa. Zwraca
1000
kandydatów Lychrel, aby uzyskać premię za wykrywanie. Okazuje się, udało mi się wydrukować na nie zbyt wielu znaków (dla Java co najmniej) i szkopuł, że premia za dobrze. Najlepsze, co mogłem zrobić bez kodu bonusowego, to 156, więc było warto.Z pewnymi podziałami linii:
Stara odpowiedź: 171 * 0,85 = 145,35 bajtów
źródło
s++<999
Rubin, (80 + 2) * 0,6 = ~ 49,2
Z flagami
-nl
biegnijWygląda jak
Jeśli podano 196, drukuje pierwsze 261 kroków dodawania, a następnie
nil
.Nie ma tu nic trudnego. Sprawdzamy, czy
$_
(który jest inicjowany na wejściu) zawiera jego odwrotność, co jest możliwe tylko wtedy, gdy są równe, ponieważ mają ten sam rozmiar. Jeśli tak, drukujemy numer kroku i kończymy, w przeciwnym razie wyświetlamy i wykonujemy krok dodawania, przechowując nową wartość w$_
(niestety nie mogę po prostueval
wyświetlać ciągu, ponieważ interpretuje on liczbę odwróconą z końcową wartością 0 jako literał ósemkowy).puts
zwraca wartość falsey, więc pętla trwa.źródło
" + #{b} = "
zapisuje bajt.-l
jeśli wstawimy liczbę do pliku bez końcowego znaku nowej linii i wprowadzimy go do potoku?Pyth - 19 bajtów
Używa pętli while i licznika. Prawdopodobnie istnieje mniejszy algorytm niż ten, ale jest on dość krótki.
Wypróbuj online tutaj .
źródło
K, 25 bajtów
Niezbyt elegancki. Ogólna forma (
{monad 1}{monad 2}\x
) jest odpowiednikiem K ogólnej pętli „while”, gdzie pierwsza monada jest warunkiem zatrzymania, a druga iteracyjnie zastosowana funkcja do argumentux
. Pierwsza monada ({~x~|x}
) jest zaprzeczeniem klasycznej frazy „is xa palindrome”. Druga monada łączy ze sobą ciąg reprezentujący x plus odwrotność x, ocenia go, a następnie rzutuje wynik z powrotem na ciąg z$
.Przykładowy przebieg pokazujący wyniki pośrednie:
Wykonanie sformatowanych danych wyjściowych zgodnie z żądaniem premii byłoby bardzo nieporadne i wymagałoby znacznej ilości kodu.
źródło
CJam, 23 bajty
Jeszcze tylko kilka dni do CJam, więc jestem całkiem szczęśliwy, że jestem w tym samym zakresie, co niektórzy profesjonaliści. :) Użyłem sztuczki porównywania napisów Martina, którą opublikował również w poradach CJam. Zajrzałem również do rozwiązania Dennisa, aby dowiedzieć się, jak odwrócić ciąg.
Wyjaśnienie:
Przetestuj online
źródło
Julia,
129120 bajtów * 0,6 = 72Tworzy to nienazwaną funkcję, która przyjmuje na wejściu liczbę całkowitą i zwraca liczbę całkowitą, jednocześnie drukując każdy krok. Kandydaci Lychrel mają wartość zwracaną 262. Aby to nazwać, nadaj mu nazwę, np
f=i->...
.Zauważ, że pomijając kod odnoszący się tylko do bonusów, to rozwiązanie miałoby 84 bajty.
Niegolfowane + wyjaśnienie:
Przykłady:
Zaoszczędzono 2 bajty dzięki Geobits!
źródło
CJam, 24 bajty
Sprawdź to tutaj.
Wyjaśnienie
Aby uzyskać więcej informacji o tym, dlaczego
#
można użyć do sprawdzenia nierówności łańcucha, zobacz tę wskazówkę .źródło
#
.Haskell,
6653 bajtówPrzykład użycia:
źródło
r=reverse x
? To zmieniłoby twój drugi wiersz naf x|x==r=0|1<2=1+f(show$read x+read(r))
i zaoszczędziłoby 2 bajty.x
nie wchodzi w zakres. Jednakf x|x==r=0 .... read(r)) where r=reverse x
działałoby, ale jest dłużej.Clojure, 94 bajty
To moja pierwsza próba kodowania golfa, więc powiedz mi, czy robię coś źle.
Z pewnymi spacjami:
Prosta rekurencja funkcji wewnętrznej. Wymaga dwóch argumentów, liczby całkowitej
%1
i indeksu%2
. Jeśli%1
jest palindromem, indeks jest zwracany. W przeciwnym razie funkcja wywołuje się z sumą i indeksem przyrostowym. Funkcja zewnętrzna inicjuje indeks zerem.Próbka:
źródło
Boost.Build, 304 bajty
Niezupełnie język. Nadal fajne.
Całkiem proste, inne niż skomplikowany hack oparty na wyrażeniach regularnych, którego użyłem do odwrócenia łańcucha.
źródło
Ruby, 44
Wymaga Ruby 1.9 lub nowszego dla
->
składni lambda.źródło