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


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


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])

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.


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.


10

J - 6 caracteres + variável

".|.":y

Onde y é o seu valor.


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


8

PHP, 9 caracteres

(int)strrev(123);

Para abreviar, onde Né uma constante:

strrev(N)

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.


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.


7

Haskell, 28. 24 caracteres

f=read.reverse.show.(+0)

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>"

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

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

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;
}

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.


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

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 :)


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

⍎∘⌽∘⍕

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.


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));
    }
}

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)

2

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

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

Python btw.


2

Actionscript

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

num.toString().split('').reverse().join('')

2

Groovy

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

assert r(1234) == 4321
assert r(345678987654567898765) == 567898765456789876543
assert r(345346457.24654654) == 45645642.754643543

2

Perl, 11 caracteres

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

Uso:

$ echo 76543 | perl -pE '$_=reverse'

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


2

Lisp comum - 60 caracteres

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

você receberá 9724.


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

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.


2

mIRC 4.45 (35 bytes)

$regsubex(12,/(.)/g,$mid(\A,-\n,1))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.