Adição de Reversão Palíndromo
O processo de adição de reversão é onde um número é adicionado ao seu reverso até que o número criado seja um palíndromo. Por exemplo, se começarmos com 68, o processo seria:
68 + 86 => 154 + 451 => 605 + 506 => 1111
Como você pode ver, foram necessárias três adições para chegar a um número palindrômico. Se fôssemos começar 89
, precisaríamos de 24 etapas (que você pode ver aqui ).
O recorde mundial de todas as medidas tomadas antes que um palíndromo seja alcançado é 261, o que ocorre para o número 1186060307891929990
, produzindo um número maior que 10 118 . No entanto, houve alguns números que não conseguimos obter um palíndromo. Estes são chamados números de Lychrel .
Como estamos trabalhando na base 10, podemos realmente chamá-los apenas de candidatos, porque não existe prova de que esses números nunca cheguem a um palíndromo. Por exemplo, o menor candidato Lychrel da base 10 é 196 e já passou por mais de um bilhão de iterações. Se o palíndromo existe, é muito maior que 10 10 8,77 . Como comparação, se esses 1s fossem inscritos em átomos, precisaríamos de 2.26772 × 10 588843575 universos no valor de átomos para escrevê-lo, assumindo que ele exista.
Sua tarefa
Crie um programa ou função que receba uma entrada inteira e retorne ou imprima o número de etapas necessárias para alcançar um palíndromo. Você não será obrigado a lidar com os candidatos à Lychrel (ou seja, seu programa, quando recebe um candidato à Lychrel, poderá gerar um erro ou executar para sempre).
Casos de teste:
f(0) => 0
f(11) => 0
f(89) => 24
f(286) => 23
f(196196871) => 45
f(1005499526) => 109
f(1186060307891929990) => 261
Regras
Bônus
- Se você imprimir cada etapa de adição formatada
n + rev(n) = m
, poderá multiplicar sua pontuação por 0,75 . As somas devem ser impressas antes do número de etapas. - Se seu código puder detectar se um número é um candidato à Lychrel, você poderá multiplicar sua pontuação por 0,85 . Nesse caso, é suficiente assumir que qualquer coisa que exija mais de 261 iterações é um candidato à Lychrel. Não retorne nada, ou qualquer coisa que não seja um número que possa ser confundido com uma resposta correta (etc: qualquer sequência ou número que não esteja no intervalo de 0 a 261). Qualquer erro não conta como saída válida (por exemplo, profundidade máxima de recursão excedida) e não pode ser usado na detecção.
- Se você completar os dois bônus, multiplique por 0,6 .
Isso é código-golfe , portanto, o menor número de bytes vence.
Este trecho de código mostra uma solução de exemplo no Python 3 com os dois bônus.
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
bônus está em cima dos outros? Ou é só isso?
10 + 01 = 11
ou 10 + 1 = 11
depende de nós?
262
?