Maneira mais curta de reverter um número

31

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.

Por exemplo, dado 76543, retorne 34567

dmckee
fonte
6
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 ...)

‮n

substitua npelo seu número

Griffin
fonte
1
Isso é simplesmente genial. Eu pagaria um char. Ou 2, pois codifica para dois bytes em UTF-16: P
tomsmeding
17
Hahaha, eu fiz uma pesquisa no Google nessa tag e fui recompensado com Your search -‮ - não encontrou nenhum documento.
31412 JoeFish
U poderia tentar este link no navegador:data:text/html,&%238238;egnahcxEkcatS olleH
F. Hauri
3
Engraçado no google transate também. @ JoeFish: Não consigo reproduzir, por favor poste um link!
F. Hauri
1
@JoeFish Quando olho para o comentário, seu nome de usuário é invertido e há algum texto após ele. txet emos siereH
Stefnotch 22/10/2015
32

Python

int(str(76543)[::-1])

EDITAR:

Solução mais curta, conforme sugerido por @gnibbler:

int(`76543`[::-1])

ou, se acima não estiver claro:

x=76543
int(`x`[::-1])
Vader
fonte
4
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.

Kiril Kirov
fonte
Se você substituir modpor %, é válido Python;) #
phihag 11/11
Você está certo, na verdade :) 10x #
3
Não é o mais curto, mas o mais comum e universal.
Kiril Kirov
3
y=y*10+x%10....
st0le
1
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.

Ming-Tang
fonte
10

J - 6 caracteres + variável

".|.":y

Onde y é o seu valor.

MPelletier
fonte
2
Como uma função: |.&.":"reverse under do", que é praticamente uma tradução literal da tarefa.
FireFly
9

APL (3)

⍎⌽⍕

Uso:

⍎⌽⍕12345 => 54321
marinus
fonte
8

PHP, 9 caracteres

(int)strrev(123);

Para abreviar, onde Né uma constante:

strrev(N)
Powtac
fonte
8

Befunge (3 caracteres)

Programa executável completo:

N.@

Onde Nestá 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.

daniero
fonte
3
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):

tabela de diferenças

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.

FireFly
fonte
7

Haskell, 28. 24 caracteres

f=read.reverse.show.(+0)
hammar
fonte
2
Que tal f=read.reverse.show.(+0)?
FUZxxl
2
(+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.
Thomas Eding
7

Vim

17 caracteres

:se ri<CR>C<C-R>"
Eric Fortis
fonte
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 :)
daniero
6

Scala - 33 Chars

def r(a:Int)=(a+"").reverse.toInt
Lalith
fonte
1
+1 para scala, agradável de ver algo mais do que python / ruby / perl
LHK
Isso falhará no Int negativo. -123 deve retornar -321
samach
6

Rubi (14)

x = 13456
x.to_s.reverse
corpóreo
fonte
3
"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;
}

fonte
5
O meu é absolutamente o mesmo (:
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.

JAB
fonte
5

Golfscript, 5 caracteres

`-1%~

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:

{`-1%~}:r
Peter Taylor
fonte
Acho que você deve ter pensado `-1%~antes `-1$~(e tomei a liberdade de editar sua resposta para dizer isso).
Ilmari Karonen 7/03/12
5

No script de shell:

  echo "your number"|rev

Espero que isso tenha sido útil :)

tusharmakkar08
fonte
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
Bastian Bittorf
3

Meio tarde, mas

APL, 3

⍎⌽⍞

Se você insiste em uma função

⍎∘⌽∘⍕
TwiNight
fonte
Bem parece que eu não poderia detectar uma duplicata acima ... (devido ao facto de estar na página 2)
TwiNight
Estou triste, que ninguém deu brainfu * k ou espaços em branco solução :( (mais um voto e você está na primeira página)
Kiril Kirov
@KirilKirov Eu tenho uma solução k brainfu *: codegolf.stackexchange.com/a/32826/24829
rpax
3

Mathematica, 14 bytes

IntegerReverse

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.

Martin Ender
fonte
2

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));
    }
}
Vencedor
fonte
2
É 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

string.reverse(12345)
Alex
fonte
2

Este realmente recebe uma entrada, ao contrário de alguns dos outros:

print`input()`[::-1]

Python btw.

Exelian
fonte
2

Actionscript

43 caracteres. num como o parâmetro para a função:

num.toString().split('').reverse().join('')
Kumsal Obuz
fonte
2

Groovy

r={"$it".reverse() as BigDecimal}

assert r(1234) == 4321
assert r(345678987654567898765) == 567898765456789876543
assert r(345346457.24654654) == 45645642.754643543
Armand
fonte
2

Perl, 11 caracteres

O psinalizador é necessário para que isso funcione, incluído na contagem.

Uso:

$ echo 76543 | perl -pE '$_=reverse'
Zaid
fonte
Eu conto 10 caracteres
F. Hauri
A pbandeira está incluída na contagem
Zaid
2

Clojure (42 caracteres)

#(->> % str reverse(apply str)read-string)

Exemplo de uso:

(#(->> % str reverse(apply str)read-string) 98321)

retorna 12389

Omar
fonte
2

Lisp comum - 60 caracteres

(first(list(parse-integer(reverse(write-to-string '4279)))))

você receberá 9724.

Chris Zimmerman
fonte
Por que (first(list? parse-integerjá retorna o número.
Florian Margaine
2

K, 3 bytes:

.|$

Avalie ( .) o reverso ( |) da conversão para uma string ( $).

Exemplo de uso:

  .|$76543
34567
JohnE
fonte
2

rs , 20 bytes

#
+#(.*)(.)/\2#\1
#/

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.

+#(.*)(.)/\2#\1

Anexe previamente o último caractere da sequência principal à área antes do marcador até que não haja mais caracteres.

#/

Retire o marcador.

kirbyfan64sos
fonte
2

mIRC 4.45 (35 bytes)

$regsubex(12,/(.)/g,$mid(\A,-\n,1))
onkarjit
fonte