Escreva uma função (ou subprograma equivalente) para aceitar um único argumento com valor inteiro e retorne um valor (do mesmo tipo) encontrado revertendo a ordem dos dígitos da base 10 do argumento.
Volte para o tempo, o número era uma corda, em seguida, inverter a seqüência
pmg
2
A idéia de um "algoritmo mais curto" é um tanto ilusória, especialmente se você permitir "qualquer idioma". Pense-se um algoritmo, e eu vou dar-lhe uma DSL com um operador apropriado "~" ...
3
Apenas um aviso: qualquer número terminando com 0 torna-se um número menor de dígitos quando revertida ...
powtac
44
Eu sei que um algoritmo que leva pouco tempo , mas só funciona em capicua;)
schnaader
Encontrei tempo para reescrever a mim mesmo. Espero que este continue sendo o quebra-cabeça que pretendia representar.
precisa
Respostas:
85
HTML 21 7 caracteres (1 caractere se sou atrevido ...)
s[::-1]é muito mais rápido do que''.join(reversed(s))
riza 11/06
4
Você pode usar acentos graves (por repr) em vez de usar str
gnibbler
@gnibbler Obrigado pela sugestão. Eu atualizei minha resposta.
Vader
2
TBH, isso não é uma função / procedimento / como você deseja chamá-lo, e as especificações exigem.
Thomas Eding
Além disso, ele nem sequer aceita um valor ...
Exelian
28
Universal ( independente de idioma / independente )
Se você deseja usar apenas números (evite converter o número em string) e não quiser usar alguma biblioteca específica (para ser universal para qualquer idioma):
x = 76543 # or whatever is your number
y = 0
while x > 0:
y *= 10
y += ( x %10 )
x /= 10 # int division
Isso é python, mas pode ser feito em qualquer idioma, porque é apenas um método matemático.
O BrainFuck não, embora possa ser calculado. Qualquer idioma que não o possua pode usar em a - (n * int(a/n))vez de a mod n. Além disso, se você olhar aqui , a operação do módulo é implementada de maneira diferente em todos os idiomas. (Veja a tabela à direita.) #
Mbomb007
13
Perl 6
+$n.flip
ou:
$n.flip
para código digitado dinamicamente.
Os números têm métodos de string devido ao design da linguagem.
Esses são os únicos literais , mas outros números certamente podem ser representados. Caso contrário, a resposta vencedora seria Brainfuck com o programa vazio. ;-)
FireFly
8
Independente de idioma / matemática
Inspirado pela resposta de Kiril Kirov acima. Fiquei curioso sobre as propriedades matemáticas de reverter um número, então decidi investigar um pouco.
Acontece que, se você plotar a diferença n - rev(n)para números naturais nem alguma base r, obtém padrões como este ( (n - rev(n)) / (r - 1)para r=10, agrupados em rcolunas, vermelho indica número negativo):
Esta sequência pode ser gerada como tal (pseudocódigo):
for i=1 to r:
output 0
for m=0, 1, …
for k=1 to (r-1):
for d=1 to r^m:
for i=0 to (r-1):
output (r-1) * (r+1)^m * (k - i)
Se você armazenar esses valores em uma lista / matriz, n - arr[n]obterá a forma invertida de n. Agora, para "jogar matematicamente" isso, idealmente, queremos uma expressão de forma fechada que nos forneça o n: ésimo valor na sequência, para que possamos ter uma expressão de forma fechada para resolver a tarefa inteira. Infelizmente, não consegui encontrar essa expressão ... mas parece que deveria ser possível. :(
Então, sim, não tanto um código-golfe quanto uma curiosidade matemática, mas se houver uma expressão de forma fechada da sequência acima, ela pode realmente ser útil em envios adequados de golfe PL.
(+0): Homem legítimo! Embora tecnicamente você não precise disso .(+0), pois fseria mais polimórfico do que o problema requer (é permitido retornar uma saída com 'tipo semelhante'). Eu rasparia esses 5 caracteres.
Eu diria que são 10 caracteres (pressionamentos de tecla) se você digitar o comando diretamente no vim. Btw, eu aprendi algo novo no vim hoje, graças :)
"no" é indefinido. Eu acho que você pretendia colocar "x" lá.
David Rivers
3
123456.to_s.reverse é ainda mais curto.
precisa
@mmdemirbas - obrigado por corrigir o erro de digitação
bodacious
3
Precisa estar .to_s.reverse.to_iem conformidade com as especificações.
histocrat
Um número que começa com 0 parece não funcionar. 0112.to_s.reverse.to_i => 47
Joel
5
É possível converter um número em uma sequência, depois inverta a sequência e depois converta-a novamente em número. Esse tipo de recurso provavelmente está disponível em todos os idiomas. Se você está procurando um método mais matemático, isso pode ajudar:
int n = 76543;
int r = 0;
while (n > 0) {
r *= 10;
r += n % 10;
n /= 10;
}
Sim, a única diferença é que seu código se parece com Python.
Esse método é excedido em idiomas com precisão limitada. tente1111111119
st0le 16/05
5
Python 3+
Formulário de função: 28 caracteres
r=lambda i:int(str(i)[::-1])
Formulário de (sub) programa: 25 caracteres
print(input()[::-1])
Considero que alguns dos outros exemplos de Python são trapaceiros, ou pelo menos baratos, devido ao uso de entrada codificada e / ou por não satisfazer totalmente os requisitos.
Isso pega um argumento na pilha e deixa o resultado na pilha. Estou explorando a opção "subprogram" na especificação: se você insiste em uma função, são quatro caracteres a mais na pilha:
um bom! não sabia que bash era capaz disso também!
Pranit Bauva
1
Eu acho que tecnicamente ele não devolver um "número" semelhante tipado ... poderia ser reduzido ainda mais com rev<<<yournumber, por exemplo rev<<<132(para bash / zsh, e não por POSIX embora)
FireFly
1
Basta rev, a pergunta não diz que tem que ser uma função. Você pode comparar revcom uma função interna, mesmo que não seja uma.
precisa saber é o seguinte
isso é inválido: 'rev' não é um builtin, mas uma chamada de programa externa.
Bastian Bittorf 22/07
Shell POSIX puro de 67 bytes: X = $ 1; while [$ X! = 0]; faça Y = $ ((Y * 10 + X% 10)); X = $ ((X / 10)); done; echo $ Y
Isso não é competitivo, porque essa função foi adicionada apenas na versão 10.3 da semana passada, mas, para completar, pensei em adicionar o único (eu acho?) Incorporado para esta tarefa.
Você pode fazer o seguinte em Java. Observe que isso se converte em String e vice-versa e não é uma solução matemática.
public class test {
public static int reverseInt(int i) {
return Integer.valueOf((new StringBuffer(String.valueOf(i))).reverse().toString());
}
public static void main(String[] args) {
int i = 1234;
System.out.println("reverse("+i+") -> " + reverseInt(i));
}
}
É uma solução matemática. Matemática não é números, não é aritmética. A matemática também lida com cadeias de símbolos. E neste caso especial, a conversão de e para string é apenas conversão de e para base-10.
R. Martinho Fernandes
O que eu quis dizer com "não é uma solução matemática" é que nós mesmos não fazemos matemática. Os métodos estão fazendo toda a análise e matemática para nós. Ao contrário de, por exemplo, a resposta de Kiril Kirov.
213 Victor Victor
Será que
estou
2
Lua
Números e seqüências de caracteres são intercambiáveis, portanto, isso é trivial
Respostas:
HTML
217 caracteres (1 caractere se sou atrevido ...)substitua
n
pelo seu númerofonte
Your search -
- não encontrou nenhum documento.data:text/html,&%238238;egnahcxEkcatS olleH
Python
int(str(76543)[::-1])
EDITAR:
Solução mais curta, conforme sugerido por @gnibbler:
ou, se acima não estiver claro:
fonte
s[::-1]
é muito mais rápido do que''.join(reversed(s))
Universal ( independente de idioma / independente )
Se você deseja usar apenas números (evite converter o número em string) e não quiser usar alguma biblioteca específica (para ser universal para qualquer idioma):
Isso é python, mas pode ser feito em qualquer idioma, porque é apenas um método matemático.
fonte
mod
por%
, é válido Python;) #y=y*10+x%10
....a - (n * int(a/n))
vez dea mod n
. Além disso, se você olhar aqui , a operação do módulo é implementada de maneira diferente em todos os idiomas. (Veja a tabela à direita.) #Perl 6
ou:
para código digitado dinamicamente.
Os números têm métodos de string devido ao design da linguagem.
fonte
J - 6 caracteres + variável
Onde y é o seu valor.
fonte
|.&.":
"reverse under do", que é praticamente uma tradução literal da tarefa.APL (3)
Uso:
fonte
PHP, 9 caracteres
Para abreviar, onde
N
é uma constante:fonte
Befunge (3 caracteres)
Programa executável completo:
Onde
N
está o seu número? As regras dizem "aceitar um único argumento com valor inteiro "; No Befunge, você só pode inserir números inteiros de 0 a 9.fonte
Independente de idioma / matemática
Inspirado pela resposta de Kiril Kirov acima. Fiquei curioso sobre as propriedades matemáticas de reverter um número, então decidi investigar um pouco.
Acontece que, se você plotar a diferença
n - rev(n)
para números naturaisn
em alguma baser
, obtém padrões como este ((n - rev(n)) / (r - 1)
parar=10
, agrupados emr
colunas, vermelho indica número negativo):Esta sequência pode ser gerada como tal (pseudocódigo):
Se você armazenar esses valores em uma lista / matriz,
n - arr[n]
obterá a forma invertida den
. Agora, para "jogar matematicamente" isso, idealmente, queremos uma expressão de forma fechada que nos forneça o n: ésimo valor na sequência, para que possamos ter uma expressão de forma fechada para resolver a tarefa inteira. Infelizmente, não consegui encontrar essa expressão ... mas parece que deveria ser possível. :(Então, sim, não tanto um código-golfe quanto uma curiosidade matemática, mas se houver uma expressão de forma fechada da sequência acima, ela pode realmente ser útil em envios adequados de golfe PL.
fonte
Haskell,
28.24 caracteresfonte
f=read.reverse.show.(+0)
?(+0)
: Homem legítimo! Embora tecnicamente você não precise disso.(+0)
, poisf
seria mais polimórfico do que o problema requer (é permitido retornar uma saída com 'tipo semelhante'). Eu rasparia esses 5 caracteres.Vim
17 caracteresfonte
Scala - 33 Chars
fonte
Rubi (14)
fonte
.to_s.reverse.to_i
em conformidade com as especificações.É possível converter um número em uma sequência, depois inverta a sequência e depois converta-a novamente em número. Esse tipo de recurso provavelmente está disponível em todos os idiomas. Se você está procurando um método mais matemático, isso pode ajudar:
fonte
1111111119
Python 3+
Formulário de função: 28 caracteres
Formulário de (sub) programa: 25 caracteres
Considero que alguns dos outros exemplos de Python são trapaceiros, ou pelo menos baratos, devido ao uso de entrada codificada e / ou por não satisfazer totalmente os requisitos.
fonte
Golfscript, 5 caracteres
Isso pega um argumento na pilha e deixa o resultado na pilha. Estou explorando a opção "subprogram" na especificação: se você insiste em uma função, são quatro caracteres a mais na pilha:
fonte
`-1%~
antes`-1$~
(e tomei a liberdade de editar sua resposta para dizer isso).No script de shell:
Espero que isso tenha sido útil :)
fonte
rev<<<yournumber
, por exemplorev<<<132
(para bash / zsh, e não por POSIX embora)rev
, a pergunta não diz que tem que ser uma função. Você pode compararrev
com uma função interna, mesmo que não seja uma.Meio tarde, mas
APL, 3
Se você insiste em uma função
fonte
Mathematica, 14 bytes
Isso não é competitivo, porque essa função foi adicionada apenas na versão 10.3 da semana passada, mas, para completar, pensei em adicionar o único (eu acho?) Incorporado para esta tarefa.
fonte
Você pode fazer o seguinte em Java. Observe que isso se converte em String e vice-versa e não é uma solução matemática.
fonte
Lua
Números e seqüências de caracteres são intercambiáveis, portanto, isso é trivial
fonte
Este realmente recebe uma entrada, ao contrário de alguns dos outros:
Python btw.
fonte
Actionscript
43 caracteres. num como o parâmetro para a função:
fonte
Groovy
fonte
Perl, 11 caracteres
O
p
sinalizador é necessário para que isso funcione, incluído na contagem.Uso:
fonte
p
bandeira está incluída na contagemClojure (42 caracteres)
Exemplo de uso:
retorna 12389
fonte
Lisp comum - 60 caracteres
você receberá 9724.
fonte
(first(list
?parse-integer
já retorna o número.K, 3 bytes:
Avalie (
.
) o reverso (|
) da conversão para uma string ($
).Exemplo de uso:
fonte
rs , 20 bytes
Tecnicamente, isso não conta (o rs foi criado no início deste ano), mas eu não vi outras respostas baseadas em regex e achei que era legal.
Demonstração ao vivo.
Explicação:
Insira um caractere de libra no início da string. Isso é usado como um marcador.
Anexe previamente o último caractere da sequência principal à área antes do marcador até que não haja mais caracteres.
Retire o marcador.
fonte
mIRC 4.45 (35 bytes)
fonte