Palindrome Reversal-Addition
Il processo di Reversal-Addition è dove un numero viene aggiunto al suo rovescio fino a quando il numero creato è un palindromo. Ad esempio, se iniziamo con 68, il processo sarebbe:
68 + 86 => 154 + 451 => 605 + 506 => 1111
Come puoi vedere, ci sono volute 3 aggiunte per arrivare a un numero palindromico. Se dovessimo iniziare 89
, avremmo bisogno di 24 passaggi (che puoi vedere qui la ripartizione ).
Il record mondiale per il maggior numero di passi compiuti prima del raggiungimento di un palindromo è 261, che si verifica per il numero 1186060307891929990
, producendo un numero maggiore di 10 118 . Tuttavia, ci sono stati alcuni numeri che non siamo stati in grado di ottenere un palindromo. Questi sono chiamati numeri Lychrel .
Dato che stiamo lavorando nella base 10, possiamo davvero chiamarli candidati, perché non esiste alcuna prova che questi numeri non raggiungano mai un palindromo. Ad esempio, il candidato Lychrel di base 10 più piccolo ha 196 e ha superato oltre un miliardo di iterazioni. Se il palindromo esiste, è molto più grande di 10 10 8.77 . Per fare un paragone, se quel numero di 1 fosse inscritto su atomi, avremmo bisogno di 2.26772 × 10 588843575 universi di atomi per scriverlo, supponendo che esista.
Il tuo compito
Creare un programma o una funzione che accetta un input intero e restituisce o stampa il numero di passaggi necessari per raggiungere un palindromo. Non ti verrà richiesto di trattare con i candidati Lychrel (ad esempio, il tuo programma, quando assegnato un candidato Lychrel, è autorizzato a lanciare un errore o eseguire per sempre).
Casi test:
f(0) => 0
f(11) => 0
f(89) => 24
f(286) => 23
f(196196871) => 45
f(1005499526) => 109
f(1186060307891929990) => 261
Regole
bonus
- Se stampi ogni passaggio di aggiunta, formattato
n + rev(n) = m
, puoi moltiplicare il tuo punteggio per 0,75 . Le somme devono essere stampate prima del numero di passaggi. - Se il tuo codice è in grado di rilevare se un numero è candidato a Lychrel, puoi moltiplicare il tuo punteggio per 0,85 . In questo caso è sufficiente supporre che tutto ciò che richiede più di 261 iterazioni sia un candidato Lychrel. Non restituire nulla o qualsiasi cosa che non sia un numero che può essere scambiato per una risposta corretta (ecc .: qualsiasi stringa o un numero non compreso nell'intervallo 0-261). Qualsiasi errore non viene considerato come output valido (es. Superata la profondità massima di ricorsione) e non può essere utilizzato nel rilevamento.
- Se completi entrambi i bonus, moltiplica per 0,6 .
Questo è code-golf , quindi vince il numero minimo di byte.
Questo frammento di codice mostra una soluzione di esempio in Python 3 con entrambi i bonus.
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
bonus è in cima agli altri? O è solo quello?
10 + 01 = 11
o 10 + 1 = 11
o è fino a noi?
262
?