Dado um número N , dê saída / retorne X para que N + X seja um palíndromo, onde | X | tem que ser o menor possível.
Palíndromo: Um número é um palíndromo, se sua sequência de dígitos for a mesma ao lê-los da esquerda para a direita e ao ler da direita para a esquerda.
95359
e 6548456
são simétricos, 123
e 2424
não são. Números com zeros à esquerda, como 020
não são um palíndromo.
A entrada é um número inteiro positivo menor que 10 15 . Leia-o no stdin, como um parâmetro-método, qualquer que seja.
A saída deve ser um número inteiro (positivo ou negativo) e deve ser 0 se a entrada já for um palíndromo. Você pode gravar sua saída no stdout, retorná-la de uma função ou o que quiser. Se houver 2 números (por exemplo, 2
e -2
) que atendam aos requisitos, imprima apenas um deles.
Exemplos:
Input Output
3 0
234 -2
1299931 -10
126 5 or -5 (only one of them)
fonte
N=10
a saída pode serX=-1
ouX=1
?Respostas:
Pyth ,
2620Atualizado para atender às novas regras.
O programa é executado em um loop infinito, que testa todos os incrementos possíveis, na ordem 0, -1, 1, -2, -2 ...
Explicação:
Exemplo de execução:
Isso levou 23 segundos.
Solução de bônus, mesma contagem de caracteres:
fonte
[0, 1, -1, 2, -2, ...]
de uma atualizaçãoZ=-Z+(Z<0)
?Ruby,
11184 bytesToma o número como seu único argumento de linha de comando.
fonte
CJam,
342925 bytesExperimente online.
Exemplos
Como funciona
fonte
Haskell - 62
Salve-o em um arquivo chamado
golf.hs
e teste-o com ghci:fonte
x<-[0..]>>=(\v->[n+v,n-v])
? É mais curto e o torna uma linha únicaPython 2.7,
98, 81Cria um palíndromo do número de entrada e subtrai-o da entrada para encontrar o delta.
uso:
ungolfed e anotado:
fonte
f(19) = -8
(palíndromo11
), onde deve ser+3
feito22
.Perl 5,
93898887756344Ungolfed:
Graças às sugestões de Dennis, reduzimos para 43 +
-p
= 44fonte
-$a
é menor do que$a*-1
. 2. Se você usar($a<1)
, não há necessidade? :$a++
. 3. Se você usar a-p
opção$_=<>
eprint$_
estiver implícito, poderá soltar a primeira instrução e alterar a última para$_=$a+0
.-p
switch como um byte extra, mas você pode recuperá-lo usando em($a<1)-$a
vez de-$a+($a<1)
.while
$/
vez de$a
, ele funcionará.05AB1E ,
1514 bytes (-1 Graças a Emigna)Experimente online!
Método:
fonte
2äн
vez deg;î£
.Java:
127109Iteração básica, verificando negativo e positivo antes de passar para o próximo candidato.
Para entrada
123456789012345
, ele retorna-1358024
para igual ao palíndromo123456787654321
.Quebras de linha:
fonte
n+i+""
e salva os colchetes? Eu acho que a precedência deve estar correta.toString()
. Obrigado :)i=i<1?-i+1:-i
? Vou chamá-lo de "profanação".Clojure, 92
Obtém o primeiro de uma sequência for lenta que funciona de 0 a zero e inclui apenas valores que formam palíndromos:
Sessão REPL-LPER:
fonte
JavaScript,
175136117Direto.
p
retorna true se um determinado número é palíndromo,f
pesquisa o mais próximo.Edição: Eu também joguei um pouco mais, graças ao doce truque de "indecrement" por Geobits na resposta Java aqui.
Uso:
fonte
p=n=>[...s=''+n].reverse().join('')==s f=n=>{r=t=0;while(!(p(n+r++)||p(n+t--)));return p(n+r-1)?r-1:t+1}
:)function
ereturn
são terrivelmente longo Palavras-reservados ...s=>{for(i=0;[...s+i+""].reverse().join``!=s+i;i=i<0?-i:~i);return i}
. Stack-overflow propenso a 61f=(s,i=0)=>[...s+i+""].reverse().join``==s+i?i:f(s,i<0?-i:~i)
J - 49 char
Uma função que mapeia números inteiros para números inteiros.
Veja como você pode criar esse resultado, em três partes. Esta é a exibição do J REPL: linhas recuadas são entrada do usuário e linhas desatualizadas são saída REPL. E sim, J escreve o sinal negativo com um sublinhado
_
.Exemplos:
Você também pode fazer com que o golfe prefira a solução positiva sobre a negativa quando iguais, alterando
_1 1
para1 _1
.fonte
Javascript 86
Este é o meu primeiro desafio de codegolf. Espero que esta solução seja aceitável.
ungolfed:
n => { s = (n + '').split(''); for (i = 0, j = s.length - 1; i < j; i++,j--) s[j] = s[i]; return s.join('') - n }
Explicação:Converta a entrada n em String e divida.
Itere nos dois lados da matriz resultante e copie o dígito em s [i] a s [j] até i <j. Isso resultará em nosso palíndromo desejado.
Junte a matriz novamente e subtraia n para obter x
fonte
s=(n+'').split('')
paras=[...(n+'')]
. raspar 5 bytesf(19)=3
porque 22 é o mais palindrômico mais próximo, mas a função retorna -8 para converter 19 em 11. btw[...n+'']
também funcionará por mais -2 bytesJavaScript (ES6), 84 bytes
Meu primeiro desafio de golfe! Sei que a solução mais curta e elegante já foi publicada por @Brian H., mas essa é outra abordagem.
Código de teste
Mostrar snippet de código
fonte
Braquilog , 8 bytes
Experimente online!
O predicado de rótulo
≜
é vital aqui, porque, ao usá-lo na saída antes que qualquer outra coisa aconteça (embora esteja realmente sendo chamado na lista que contém a entrada e a saída), seu valor absoluto é minimizado, porque, em vez de fazer algo mais inteligente com base no Restrições O programa adivinha todos os números inteiros, começando em 0, até encontrar um que funcione. Se≜
omitido, ocorre no programa que 0 é um palíndromo muito bom e sempre emitirá o negativo da entrada.fonte
Groovy -
131111107 caracteresGolfe:
execuções de amostra:
Ungolfed:
fonte
Python 2 - 76
Obtém o número de entrada e gera uma lista das diferenças entre a entrada e todos os números entre
0
e2*i
somente se o número for palíndrico.Em seguida, classifica a lista por valor absoluto e imprime o primeiro elemento.
fonte
min
com um argumento de palavra-chave em vez de classificar.C ++ 289
A função P verifica os palíndromos usando
<algorithm>
métodoUngolfed:
fonte
Mathematica 75
Provavelmente pode ser jogado mais.
Espaços não contados e desnecessários.
fonte
CoffeeScript: 73
Explicação: Isso tira vantagem do fato de que, se tivermos um número ímpar de comprimento (por exemplo, 1234567),
x.slice(0, y)
não incluiremos o dígito do meio, mas incluiremosx.slice(0, -y)
. JavaScriptslice
provavelmente não deveria funcionar dessa maneira, mas funciona.Eu esperava que o CoffeeScript / JavaScript tivesse uma maneira melhor de reverter uma string, mas o método split / reverse / join parece ser tudo o que existe.
fonte
PHP, 56 bytes
takes input from command line argument; run with
-nr
.fonte
javascript 68 bytes
HUGE props to @Beldraith for the algorithm, i'm posting this as an answer though, because it took me quite the time to get it to work in a single statement.
Any tips are welcome ;)
ungolfed
fonte
(n,s=[...n+''],j=s.length)=>s.map((v,i)=>i>--j?s[j]:v).join``-n
, but also a non-obvious counterexample (19) exists ;)Python, 109
fonte
123456789
causes it to fail, well below the 10^15 limit posted in the question.QBIC, 38 bytes, nc
Explanation:
The code reads an input, and then applies a modifier. It then tests to see if the number + modifier is a palindrome. Then, it flips the sigh on the modifier, re-applies that and tests again.
fonte
Bash, 73 bytes
Input goes to the 1st command line argument:
fonte
Axiom,
720594412 bytesThe byte count it is again this, but the algo it would be O(log(n)) because it would dipend only from the digit lenght of its input (and log10(n) would be near the lenght of the decimal digits of n). ungolfed and results
fonte
Husk,
16 129 bytesThanks @H.PWiz for -4 bytes!
Try it online!
Explanation
fonte
APL NARS 47 chars
this above search but algo can not be fast and right as the g below...
This
is a simple loop exit only when it find b≡⌽b so b is a string palindrome
fonte
Python 2,
5554 bytesTry it online!
fonte
Japt, 8 bytes
Try it
fonte