Alguns números, como , são palíndromos na base 10: se você escrever os dígitos na ordem inversa, obterá o mesmo número.
Alguns números são a soma de 2 palíndromos; por exemplo, ou .
Para outros números, 2 palíndromos não são suficientes; por exemplo, 21 não pode ser escrito como a soma de 2 palíndromos, e o melhor que você pode fazer é 3: .
Escreva uma função ou programa que receba uma entrada inteira n
e emita o n
número th que não pode ser decomposto como a soma de 2 palíndromos. Isso corresponde ao OEIS A035137 .
Dígitos únicos (incluindo 0) são palíndromos.
As regras padrão para sequências se aplicam:
- entrada / saída é flexível
- você pode usar indexação 0 ou 1
- você pode emitir o
n
termo th, ou os primeirosn
termos, ou uma sequência infinita
(Como nota de rodapé: todos os números inteiros podem ser decompostos como a soma de no máximo três palíndromos.)
Casos de teste (indexados 1):
1 -> 21
2 -> 32
10 -> 1031
16 -> 1061
40 -> 1103
Isso é código-golfe, então a resposta mais curta vence.
n
, imprima o n-ésimo membro da sequência OEIS An? Parece promissor ...Respostas:
JavaScript (ES6),
93 83 8079 bytesGuardado 1 byte graças a @tsh
Retorna o º prazo, 1-indexados.n
Experimente online!
Quão?
Dado , testamos se existe tal que e são palíndromos. Se encontrarmos tal , então é a soma de dois palíndromos.n 1 ≤ k ≤ n k n - k k n
O truque aqui é processar e ao mesmo tempo testando uma única string feita da concatenação de , e .k n - k k n - k k
Exemplo:
Para :n = 2380
Comentado
Nota: Esta é uma versão sem
eval()
legibilidade.fonte
i=>eval("for(n=k=1;k=(s=[...k+[n-k]+k])+''!=s.reverse()?k-1||i--&&++n:++n;);n")
79 bytesi=>eval("...")
, o ES6 permite que você usei=>eval`...`
, economizando 2 bytes;n
no final.eval()
porque não coage seu argumento a uma string. A remoção;n
levaria a um erro de sintaxe e a remoçãon
causaria o retorno da funçãoundefined
.Geléia ,
16 109 bytes-1 byte graças a Erik, o Outgolfer . Produz os primeirosn termos.
Experimente online!
Eu tentei ter uma ideia diferente em comparação com a minha abordagem original. Vamos revisar o processo de pensamento:
Inicialmente, o teste funcionou da seguinte forma: gerou as partições inteiras desse número, filtrou aquelas que também continham não-palíndromos e depois contou quantas listas elegíveis com o comprimento 2 existiam. Obviamente, isso não foi muito eficiente em termos de tamanho do código.
A geração das partições inteiras deN e a filtragem tiveram duas principais desvantagens: eficiência de duração e tempo. Para resolver esse problema, pensei em primeiro criar um método para gerar apenas os pares de números inteiros ( x , y) que somam N (nem todas as listas de comprimento arbitrário) com a condição de que ambos os números sejam palíndromos.
Mas, ainda assim, eu não estava satisfeito com a "maneira clássica" de fazer isso. Troquei de abordagem: em vez de gerar pares , vamos focar o programa em palíndromos individuais . Dessa forma, pode-se simplesmente calcular todos os palíndromosx abaixo de N , e se N- x também é palíndromo, então estamos prontos.
Código Explicação
* Qualquer outro dígito diferente de zero funciona, nesse caso.
fonte
Gelatina , 11 bytes
Experimente online!
O programa completo funciona aproximadamente assim:
Você pode suspeitar que a etapa 5 não faz o trabalho que deveria. Realmente não deveríamos decrementar z se todos os pares que somam x são palíndricos. No entanto, podemos provar que isso nunca acontecerá:
Vamos primeiro escolher um número inteirok para que 10 ≤ k ≤ x . Sempre podemos fazer isso, porque, na etapa 2, inicializamos x para ser 10 .
Sek não é um palíndromo, então temos o par ( k , x - k ) , onde k + ( x - k ) = x , portanto, nem todos os pares têm dois palíndromos.
Se, por outro lado,k é um palíndromo, então podemos provar que k -1 não é um palíndromo. Deixe os primeiros e últimos dígitos de k ser DF e Deu respectivamente. Como k é um palíndromo, DF= Deu> 0 . Deixe os primeiros e últimos dígitos de k - 1 seja D′F e D′eu , respectivamente. Como Deu> 0 , D′eu= D′F- 1 ≠ D′F . Portanto,k - 1 não é um palíndromo e temos o par( k - 1 , x - ( k - 1 ) ) , onde( k - 1 ) + ( x - ( k - 1 ) ) = k - 1 + x - k + 1 = x .
Concluímos que, se começarmos com a configuração x para um valor maior ou igual a 10 , nunca poderemos ter todos os pares de números inteiros não negativos que somam x serem pares de palíndromos.
fonte
ŻŒḂ€aṚ$Ṁ¬µ#
Retina ,
135102 bytesExperimente online! Muito lento para
n
10 ou mais. Explicação:Comece tentando 0.
Repita os
n
tempos.Converta o valor de avaliação atual em unário e aumente-o.
Crie todos os pares de números inteiros não negativos que totalizem o novo valor de avaliação.
Repita enquanto existir pelo menos um par contendo dois números inteiros palindrômicos.
Incremente e expanda o valor da avaliação novamente.
Extraia o valor final.
fonte
Haskell,
686763 bytesRetorna uma sequência infinita.
Colete tudo
n
ondea
oun-a
não é um palíndromo para todosa <- [0..n]
.Experimente online!
fonte
Perl 5
-MList::Util=any -p
,5955 bytes-3 bytes graças a @NahuelFouilleul
Experimente online!
Nota:
any
poderia ser substituído porgrep
e evitar a-M
opção de linha de comando, mas sob as regras de pontuação atuais, isso custaria mais um byte.fonte
+
depois dowhile
.R ,
115111 bytes-4 graças a Giuseppe
Experimente online!
A maior parte do trabalho é compactada nos argumentos da função para remover a
{}
chamada de função de várias instruções e reduzir os colchetes necessários na definição do objetor
A estratégia básica é encontrar todos os palíndromos até um determinado limite (incluindo 0), encontrar todas as somas aos pares e pegar o n-ésimo número que não estiver nessa saída.
O limite de
n*1000
foi escolhido puramente a partir de um palpite, portanto encorajo qualquer pessoa a provar / refutar como uma opção válida.r=0:(n*1e3)
provavelmente pode ser melhorado com um limite mais eficiente.Map(paste,Map(rev,strsplit(a,"")),collapse="")
é arrancado da resposta de Mark aqui e é incrivelmente inteligente para mim.r[!r%in%outer(p,p,'+')][n]
lê um pouco ineficiente para mim.fonte
C # (compilador interativo do Visual C #) , 124 bytes
Experimente online!
fonte
J , 57/60 bytes
Experimente online!
A versão vinculada adiciona 3 bytes para um total de 60 para salvar como uma função que o rodapé pode chamar.
No REPL, isso é evitado chamando diretamente:
Explicação
A estrutura geral é a dessa técnica, a partir de uma resposta de Miles :
Isso economizou alguns bytes em relação à minha técnica de loop original, mas como a função principal é minha primeira tentativa de escrever J, provavelmente ainda há muito que pode ser aprimorado.
fonte
1&(_:1&((e.((*&(-:|.)&":"0>:)&i.-))+])+)*
05AB1E ,
1512 bytes-3 bytes graças a @Grimy .
Indexado a 0.
Muito lento, então o tempo limite para a maioria dos casos de teste.
Experimente online ou verifique os primeiros casos removendo o
Iè
.Versão anterior muito mais rápida de 15 bytes:
1 indexado.
Explicação:
fonte
°LDʒÂQ}ãOKIè
(provavelmente existe um limite superior melhor que 10 ^ x para velocidade). Eu acho que∞DʒÂQ}ãOK
é tecnicamente um 9, mas atinge o tempo limite antes da primeira saída.Iè
) é assim:[1,21,32,43,54,65,76,87,98,111,131,141,151,...]
mas deve ser assim[*,21,32,43,54,65,76,87,98,201,1031,1041,1051,1052,...]
(o primeiro1
/*
pode ser ignorado, pois usamos a entrada indexada em 1).L
em 0 .. :)Vermelho , 142 bytes
Experimente online!
Retorna o n-ésimo termo, 1 indexado
fonte
Python 3 , 107 bytes
Experimente online!
A inversão da verificação do palíndromo salvou 2 bytes :)
Para referência, o cheque positivo direto (109 bytes):
fonte
APL (NARS), 486 bytes
Qual é a palavra para quebrar o ciclo? Parece que é ": sai", certo?
{k≡⌽k←⍕⍵}
em p é o teste para o palíndromo. Essa função acima no loop armazena todo o palíndromo encontrado no conjunto P, se para algum elemento w de P for tal que iw esteja em P também, isso significa que i não está certo e temos incremento i. Resultados:fonte