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)
fonte
*0.6
bônus está em cima dos outros? Ou é só isso?10 + 01 = 11
ou10 + 1 = 11
depende de nós?262
?Respostas:
Pitão, 12 bytes
Experimente on-line: demonstração ou equipamento de teste
Isso usa um recurso bastante novo (apenas 17 horas).
Explicação
editar:
Alterou o código um pouco. A versão antiga era
Contagem de bytes iguais, mas a nova é bem mais legal.
fonte
Python, 51
Para o Python 2, os backticks não podem ser substituídos
str()
por causa dosL
anexos aoslong
literais.Aqui está uma versão alternativa com pontuação 64 * 0.85 = 54.4 :
E uma versão alternativa para Python 3 com pontuação 88 * 0.6 = 52.8 :
fonte
CJam,
232220,4 bytesO código tem 24 bytes e imprime -1 para os candidatos a Lychrel.
Experimente online.
Como funciona
Se
{}#
for bem-sucedido, o índice também é o número de etapas. Se, por outro lado, a matriz não contém um palíndromo,{}#
pressionará -1 .fonte
Java, 200 * 0,6 = 120
Este é um loop simples que faz exatamente o que diz na caixa, mas com um pouco de golfe adicionado. Retorna
1000
para os candidatos Lychrel para obter o bônus de detecção. Acontece que eu era capaz de imprimir para não demasiado muitos caracteres (para Java pelo menos) e snag esse bônus também. O melhor que pude fazer sem o código de bônus foi 156, por isso valeu a pena.Com algumas quebras de linha:
Resposta antiga: 171 * 0.85 = 145.35 bytes
fonte
s++<999
Ruby, (80 + 2) * 0,6 = ~ 49,2
Com bandeiras
-nl
, corraSaída parece
Se fornecido, ele imprime as 261 primeiras etapas de adição e depois
nil
.Nada muito complicado aqui. Verificamos se
$_
(que é inicializado na entrada) contém seu reverso, o que só é possível se forem iguais, pois são do mesmo tamanho. Se for, imprimimos o número da etapa e saímos; caso contrário, exibimos e executamos a etapa de adição, armazenando o novo valor$_
(infelizmente não consigo apenaseval
a string que estou exibindo porque interpreta um número invertido com um 0). como um literal octal).puts
retorna um valor falsey para que o loop continue.fonte
" + #{b} = "
salva um byte.-l
se colocarmos o número em um arquivo sem uma nova linha à direita e inseri-lo?Pitão - 19 bytes
Usa o loop while e um contador. Provavelmente existe um algoritmo menor que esse, mas isso é bastante curto.
Experimente online aqui .
fonte
K, 25 bytes
Não é muito elegante. A forma geral (
{monad 1}{monad 2}\x
) é o equivalente de K a um loop geral "while", em que a primeira mônada é a condição de parada e a segunda é uma função aplicada iterativamente ao argumentox
. A primeira mônada ({~x~|x}
) é a negação da frase clássica "is xa palindrome". A segunda mônada concatena uma string representando x mais o reverso de x, avalia-a e depois converte o resultado em uma string com$
.Uma amostra de execução mostrando resultados intermediários:
Fazer a saída formatada conforme solicitado para o bônus seria muito desajeitado e adicionaria uma quantidade significativa de código.
fonte
CJam, 23 bytes
Ainda faltam apenas alguns dias para o CJam, então estou bastante feliz por estar pelo menos na mesma faixa de alguns profissionais. :) Eu usei o truque de comparação de cordas de Martin, que ele também postou nas dicas do CJam. Também espiei a solução de Dennis para descobrir como reverter uma string.
Explicação:
Teste on-line
fonte
Julia,
129120 bytes * 0,6 = 72Isso cria uma função sem nome que recebe um número inteiro como entrada e retorna um número inteiro, enquanto isso imprime cada etapa. Os candidatos a Lychrel têm um valor de retorno de 262. Para chamar isso, dê um nome, por exemplo
f=i->...
.Observe que, omitindo código relacionado apenas aos bônus, essa solução seria de 84 bytes.
Ungolfed + explicação:
Exemplos:
Economizou 2 bytes graças ao Geobits!
fonte
CJam, 24 bytes
Teste aqui.
Explicação
Para obter mais informações sobre por que
#
pode ser usado para verificar a desigualdade de string, consulte esta dica .fonte
#
.Haskell,
6653 bytesExemplo de uso:
fonte
r=reverse x
? Isso mudaria sua segunda linha paraf x|x==r=0|1<2=1+f(show$read x+read(r))
e salvaria 2 bytes.x
não estaria no escopo. No entanto,f x|x==r=0 .... read(r)) where r=reverse x
funcionaria, mas é mais longo.Clojure, 94 bytes
Esta é a minha primeira tentativa de codificar golfe, por isso me diga se estou fazendo algo errado.
Com alguns espaços:
Recursão simples da função interna. São necessários dois argumentos, o número inteiro
%1
e um índice%2
. E se%1
for um palíndromo, o índice será retornado. Caso contrário, a função se chamará com a soma e o índice incrementado. A função externa inicializa o índice com zero.Uma amostra:
fonte
Boost.Build, 304 bytes
Não é realmente uma língua. Ainda legal.
Bem simples, além do hack elaborado baseado em regex que eu usei para reverter a string.
fonte
Ruby, 44
Precisa do Ruby 1.9 ou superior para a
->
sintaxe lambda.fonte