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.
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 ...)
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.
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.
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):
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.
(+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.
"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;
}
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.
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:
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
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.
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));
}
}
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
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.
Respuestas:
HTML
217 caracteres (1 carácter si soy descarado ...)reemplace
n
con su númerofuente
Your search -
, no coincidía con ningún documento.data:text/html,&%238238;egnahcxEkcatS olleH
Pitón
int(str(76543)[::-1])
EDITAR:
Solución más corta como lo sugiere @gnibbler:
o, si lo anterior no está claro:
fuente
s[::-1]
es mucho más rápido que''.join(reversed(s))
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):
Esto es python, pero podría hacerse en cualquier idioma, porque es solo un método matemático.
fuente
mod
con%
, es válido Python;)y=y*10+x%10
....a - (n * int(a/n))
lugar dea 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.)Perl 6
o:
para código escrito dinámicamente.
Los números obtuvieron métodos de cadena debido al diseño del lenguaje.
fuente
J - 6 caracteres + variable
Donde y es tu valor.
fuente
|.&.":
"revertir debajo de hacer", que es más o menos una traducción literal de la tarea.APL (3)
Uso:
fuente
PHP, 9 caracteres
Para hacerlo corto donde
N
es una constante:fuente
Befunge (3 personajes)
Programa ejecutable completo:
¿Dónde
N
está 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.fuente
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 naturalesn
en alguna baser
, obtienes patrones como este ((n - rev(n)) / (r - 1)
, forr=10
, envuelto enr
columnas, rojo denota número negativo):Esta secuencia podría generarse como tal (pseudocódigo):
Si almacena estos valores en una lista / matriz,
n - arr[n]
obtendría la forma inversa den
. 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.
fuente
Haskell
2824 caracteresfuente
f=read.reverse.show.(+0)
?(+0)
: Hombre legítimo! Aunque técnicamente no lo necesita.(+0)
en absoluto, yaf
que 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.Empuje
17 caracteresfuente
Scala - 33 caracteres
fuente
Rubí (14)
fuente
.to_s.reverse.to_i
cumplir con las especificaciones.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:
fuente
1111111119
Python 3+
Forma de función: 28 caracteres
Forma (sub) del programa: 25 caracteres
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.
fuente
Golfscript, 5 caracteres
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:
fuente
`-1%~
lugar de`-1$~
(y me he tomado la libertad de editar tu respuesta para decirlo).En scripting de shell:
Espero que esto haya sido útil :)
fuente
rev<<<yournumber
, por ejemplorev<<<132
(para bash / zsh, no por POSIX sin embargo)rev
es suficiente, la pregunta no dice que tiene que ser una función. Puede compararlorev
con una función incorporada, aunque no sea una.Un poco tarde pero
APL, 3
Si insiste en una función
fuente
Mathematica, 14 bytes
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.
fuente
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.
fuente
Lua
Los números y las cadenas son intercambiables, por lo que esto es trivial
fuente
Este REALMENTE toma una entrada, a diferencia del resto:
Python por cierto.
fuente
ActionScript
43 caracteres. num como parámetro de la función:
fuente
Maravilloso
fuente
Perl, 11 caracteres
La
p
bandera es necesaria para que esto funcione, incluida en el recuento.Uso:
fuente
p
bandera está incluida en el recuentoClojure (42 caracteres)
Ejemplo de uso:
devuelve 12389
fuente
Lisp común - 60 caracteres
te llevará 9724.
fuente
(first(list
?parse-integer
Ya devuelve el número.K, 3 bytes:
Evalúe (
.
) el reverso (|
) de la conversión a una cadena ($
).Ejemplo de uso:
fuente
rs , 20 bytes
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.
Anteponga continuamente el último carácter de la cadena principal al área antes del marcador hasta que no queden caracteres.
Retira el marcador.
fuente
mIRC 4.45 (35 Bytes)
fuente