La forma más corta de revertir un número

31

Escriba una función (o subprograma equivalente) para aceptar un único argumento con valor entero y devolver un valor (de tipo similar) encontrado al invertir el orden de los dígitos de base 10 del argumento.

Por ejemplo, dado 76543 retorno 34567

dmckee
fuente
66
Regrese al momento en que el número era una cadena, luego invierta la cadena
pmg
2
La idea de un "algoritmo más corto" es algo engañosa, especialmente si permites "cualquier idioma". Pensar en un algoritmo, y yo voy a dar un DSL con una adecuada "~" operador ...
3
Sólo un aviso: cualquier número que termina con 0 se convierte en un número menor de dígitos cuando se invierte ...
powtac
44
Conozco un algoritmo que no lleva tiempo , pero solo funciona en números palindrómicos;)
schnaader
Encontré tiempo para reescribirme. Espero que este siga siendo el rompecabezas que eltond pretendía plantear.
dmckee

Respuestas:

85

HTML 21 7 caracteres (1 carácter si soy descarado ...)

‮n

reemplace ncon su número

Grifo
fuente
1
Esto es simplemente genio. Yo iría por un char. O 2, ya que codifica a dos bytes en UTF-16: P
tomsmeding
17
Jajaja, hice una búsqueda en Google en esa etiqueta y fui recompensado con Your search -‮ , no coincidía con ningún documento.
JoeFish
Podrías probar este enlace en el navegador:data:text/html,&%238238;egnahcxEkcatS olleH
F. Hauri
3
Divertido en google transate también. @JoeFish: No puedo reproducir, ¡por favor publique un enlace!
F. Hauri
1
@JoeFish Cuando miro el comentario, su nombre de usuario se voltea y hay algo de texto después. txet emos si ereH
Stefnotch
32

Pitón

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

EDITAR:

Solución más corta como lo sugiere @gnibbler:

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

o, si lo anterior no está claro:

x=76543
int(`x`[::-1])
Vader
fuente
44
s[::-1]es mucho más rápido que''.join(reversed(s))
riza
44
Puede usar backticks (para repr) en lugar de usar str
gnibbler
@gnibbler Gracias por su sugerencia. He actualizado mi respuesta.
Vader
2
TBH, eso no es una función / procedimiento / como quieras llamarlo, y las especificaciones lo requieren.
Thomas Eding
Además, ni siquiera acepta un valor ...
Exelian
28

Universal (lenguaje agnóstico / independiente )

Si desea usar solo números (evite convertir el número en una cadena) y no quiere usar una biblioteca específica (para ser universal para cualquier idioma):

x = 76543 # or whatever is your number
y = 0
while x > 0:
    y *= 10
    y += ( x %10 )
    x /= 10 # int division 

Esto es python, pero podría hacerse en cualquier idioma, porque es solo un método matemático.

Kiril Kirov
fuente
Si lo reemplaza modcon %, es válido Python;)
phihag
Tienes razón, en realidad :) 10x
3
No el más corto, sino el más común y universal.
Kiril Kirov
3
y=y*10+x%10....
st0le
1
BrainFuck no lo hace, aunque se puede calcular. Cualquier lenguaje que no lo tenga puede usar en a - (n * int(a/n))lugar de a mod n. Además, si mira aquí , la operación de módulo se implementa de manera diferente en cada idioma. (Ver la tabla a la derecha.)
mbomb007
13

Perl 6

+$n.flip

o:

$n.flip

para código escrito dinámicamente.

Los números obtuvieron métodos de cadena debido al diseño del lenguaje.

Ming-Tang
fuente
10

J - 6 caracteres + variable

".|.":y

Donde y es tu valor.

MPelletier
fuente
2
Como una función: |.&.":"revertir debajo de hacer", que es más o menos una traducción literal de la tarea.
FireFly
9

APL (3)

⍎⌽⍕

Uso:

⍎⌽⍕12345 => 54321
marinus
fuente
8

PHP, 9 caracteres

(int)strrev(123);

Para hacerlo corto donde Nes una constante:

strrev(N)
Powtac
fuente
8

Befunge (3 personajes)

Programa ejecutable completo:

N.@

¿Dónde Nestá tu número? Las reglas dicen "aceptar un único argumento con valor entero "; En Befunge solo puedes ingresar números enteros del 0 al 9.

daniero
fuente
3
Esos son los únicos literales , pero otros números ciertamente podrían representarse. De lo contrario, la respuesta ganadora sería Brainfuck con el programa vacío. ;-)
FireFly
8

Independiente del lenguaje / matemática

Inspirado por la respuesta de Kiril Kirov arriba. Sentí curiosidad por las propiedades matemáticas de invertir un número, así que decidí investigar un poco.

Resulta que si trazas la diferencia n - rev(n)para los números naturales nen alguna base r, obtienes patrones como este ( (n - rev(n)) / (r - 1), for r=10, envuelto en rcolumnas, rojo denota número negativo):

table of differences

Esta secuencia podría generarse 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)

Si almacena estos valores en una lista / matriz, n - arr[n]obtendría la forma inversa de n. Ahora, para "jugar matemáticamente" esto, idealmente queremos una expresión de forma cerrada que nos dé el enésimo valor en la secuencia, de modo que podamos tener una expresión de forma cerrada para resolver toda la tarea. Desafortunadamente, no he podido encontrar esa expresión ... pero parece que debería ser posible. :(

Entonces, sí, no tanto un código de golf como una curiosidad matemática, pero si hay una expresión de forma cerrada de la secuencia anterior, en realidad podría ser útil en presentaciones de golf PL adecuadas.

Luciérnaga
fuente
7

Haskell 28 24 caracteres

f=read.reverse.show.(+0)
hammar
fuente
2
¿Qué tal f=read.reverse.show.(+0)?
FUZxxl
2
(+0): Hombre legítimo! Aunque técnicamente no lo necesita .(+0)en absoluto, ya fque sería más polimórfico de lo que requiere el problema (se le permite devolver una salida 'de tipo similar'). Me afeitaría esos 5 personajes.
Thomas Eding
7

Empuje

17 caracteres

:se ri<CR>C<C-R>"
Eric Fortis
fuente
Diría que son 10 caracteres (pulsaciones de teclas) si escribe el comando directamente en vim. Por cierto, aprendí algo nuevo en vim hoy, gracias :)
daniero
6

Scala - 33 caracteres

def r(a:Int)=(a+"").reverse.toInt
Lalith
fuente
1
+1 para scala, es bueno ver algo más que python / ruby ​​/ perl
lhk
Esto fallará en Int negativo. -123 debería devolver -321
samach
6

Rubí (14)

x = 13456
x.to_s.reverse
bodacious
fuente
3
"no" no está definido. Creo que querías poner "x" allí.
David Rivers
3
123456.to_s.reverse es aún más corto.
Steffen Roller
@mmdemirbas - gracias por arreglar el error tipográfico
bodacious
3
Debe .to_s.reverse.to_icumplir con las especificaciones.
histocrat
Un número que comienza con 0 no parece funcionar. 0112.to_s.reverse.to_i => 47
Joel
5

Es posible convertir un número en una cadena, luego invertir la cadena y luego convertir esa cadena de nuevo en número. Este tipo de características probablemente esté disponible en todos los idiomas. Si está buscando un método más matemático, esto podría ayudar:

int n = 76543;
int r = 0;

while (n > 0) {
    r *= 10;
    r += n % 10;
    n /= 10;
}

fuente
55
El mío es absolutamente el mismo (:
Sí, la única diferencia es que su código se parece a Python.
Este método se desborda en idiomas con precisión limitada. try1111111119
st0le
5

Python 3+

Forma de función: 28 caracteres

r=lambda i:int(str(i)[::-1])

Forma (sub) del programa: 25 caracteres

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

Considero que algunos de los otros ejemplos de Python son engañosos, o al menos baratos, debido al uso de entradas codificadas y / o no satisfacen completamente los requisitos.

PINCHAZO
fuente
5

Golfscript, 5 caracteres

`-1%~

Esto toma un argumento en la pila y deja el resultado en la pila. Estoy explotando la opción "subprograma" en la especificación: si insiste en una función, son cuatro caracteres más dejándola en la pila:

{`-1%~}:r
Peter Taylor
fuente
Creo que debes haber querido decir en `-1%~lugar de `-1$~(y me he tomado la libertad de editar tu respuesta para decirlo).
Ilmari Karonen
5

En scripting de shell:

  echo "your number"|rev

Espero que esto haya sido útil :)

tusharmakkar08
fuente
bueno uno! ¡no sabía que bash era capaz de eso también!
Pranit Bauva
1
Supongo que técnicamente no devuelve un "número" escrito de manera similar ... podría acortarse aún más con rev<<<yournumber, por ejemplo rev<<<132(para bash / zsh, no por POSIX sin embargo)
FireFly
1
Simplemente reves suficiente, la pregunta no dice que tiene que ser una función. Puede compararlo revcon una función incorporada, aunque no sea una.
nyuszika7h 01 de
esto no es válido: 'rev' no es una función incorporada, sino una llamada de programa externo.
Bastian Bittorf
67 bytes shell POSIX puro: X = $ 1; mientras que [$ X! = 0]; hacer Y = $ ((Y * 10 + X% 10)); X = $ ((X / 10)); hecho; echo $ Y
Bastian Bittorf
3

Un poco tarde pero

APL, 3

⍎⌽⍞

Si insiste en una función

⍎∘⌽∘⍕
TwiNight
fuente
Bueno, parece que no pude detectar un duplicado arriba ... (debido a que está en la segunda página)
TwiNight
Estoy triste, porque nadie dio brainfu * k o solución de espacio en blanco :( (un voto más y estás en la primera página)
Kiril Kirov
@KirilKirov Tengo una solución brainfu * k: codegolf.stackexchange.com/a/32826/24829
rpax
3

Mathematica, 14 bytes

IntegerReverse

Esto no es competitivo, porque esta función solo se agregó en la versión 10.3 de la semana pasada, pero para completar, pensé que agregaría el único (¿creo?) Incorporado para esta tarea.

Martin Ender
fuente
2

Podrías hacer lo siguiente en Java. Tenga en cuenta que esto se convierte en String y viceversa y no es una solución 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));
    }
}
Víctor
fuente
2
Es una solución matemática. La matemática no es números, no es aritmética. Las matemáticas también se ocupan de cadenas de símbolos. Y en este caso especial, la conversión hacia y desde una cadena es solo conversión hacia y desde base-10.
R. Martinho Fernandes
Lo que quise decir con "no es una solución matemática" es que no estamos haciendo ninguna matemática nosotros mismos. Los métodos están haciendo todo el análisis y las matemáticas para nosotros. A diferencia de, por ejemplo, la respuesta de Kiril Kirov.
Victor
Desbordará ...
st0le
2

Lua

Los números y las cadenas son intercambiables, por lo que esto es trivial

string.reverse(12345)
Alex
fuente
2

Este REALMENTE toma una entrada, a diferencia del resto:

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

Python por cierto.

Exeliano
fuente
2

ActionScript

43 caracteres. num como parámetro de la función:

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

Maravilloso

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

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

Perl, 11 caracteres

La pbandera es necesaria para que esto funcione, incluida en el recuento.

Uso:

$ echo 76543 | perl -pE '$_=reverse'
Zaid
fuente
Cuento
La pbandera está incluida en el recuento
Zaid,
2

Clojure (42 caracteres)

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

Ejemplo de uso:

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

devuelve 12389

Omar
fuente
2

Lisp común - 60 caracteres

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

te llevará 9724.

Chris Zimmerman
fuente
¿Por qué (first(list? parse-integerYa devuelve el número.
Florian Margaine
2

K, 3 bytes:

.|$

Evalúe ( .) el reverso ( |) de la conversión a una cadena ($ ).

Ejemplo de uso:

  .|$76543
34567
JohnE
fuente
2

rs , 20 bytes

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

Técnicamente, esto no cuenta (rs fue creado a principios de este año), pero no vi ninguna otra respuesta basada en expresiones regulares, y pensé que esto estaba bien.

Demo en vivo.

Explicación:

#

Inserte un carácter de libra al comienzo de la cadena. Esto se usa como marcador.

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

Anteponga continuamente el último carácter de la cadena principal al área antes del marcador hasta que no queden caracteres.

#/

Retira el marcador.

kirbyfan64sos
fuente
2

mIRC 4.45 (35 Bytes)

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