Proporcionó una entrada como un entero sin signo:
13457
Su función / subrutina debería devolver:
75431
Dado que este es un concurso de popularidad, sea creativo. Las soluciones creativas utilizan técnicas inusuales o ingeniosas para lograr la tarea dada.
Restricciones:
- No puedes usar matrices.
- No puedes usar cadenas.
- Sin anulación de RTL (
‮
)
Brownie señala por usar aritmética creativa.
Como se trata de un concurso de popularidad, sugiero no usar el %
operador modulo ( ) en su código.
Acerca de los ceros a la izquierda:
Si la entrada es:
12340
Entonces la salida:
4321
Sería aceptable.
popularity-contest
duci9y
fuente
fuente
1230
es la entrada? ¿Se nos permite salir321
? (De lo contrario, las cadenas son necesarias).Respuestas:
Mathematica, no modulo!
Vamos a desglosarlo.
Primero usamos algunos "aritmética creativa" para averiguar cuántos dígitos hay en el número:
length = Ceiling[Log[10, n]];
A continuación, rasterizamos el número a una bonita imagen grande:
Ahora consultamos el cuadro delimitador de esa imagen y llenamos el ancho y la altura (en realidad, utilizando el desplazamiento de la línea de base en lugar de la altura de la imagen, porque MM agrega algunos espacios en blanco debajo de la línea de base en la imagen).
A continuación, NestList resta de manera recursiva el ancho de la imagen dividido por la longitud de la cadena para permitir que ImageTake extraiga los caracteres del final de la imagen uno por uno, y ImageAssemble los vuelve a ensamblar a esta imagen:
Luego lo pasamos a la función TextRecognize para el reconocimiento óptico de caracteres, que con este tamaño de imagen y calidad de rasterización es capaz de reconocer impecablemente la salida final y darnos el número entero:
Logaritmos y OCR: ¡es como el chocolate y la mantequilla de maní!
Nuevo y mejorado
Esta versión rellena el número para tratar el comportamiento obstinado de TextRecognize con números pequeños, y luego resta el pad al final. ¡Esto incluso funciona para números de un solo dígito!
Sin embargo, por qué ejecutarías una rutina inversa en un solo número es un misterio para mí. Pero solo en aras de la exhaustividad, incluso lo hice funcionar para entradas de cero y uno, que normalmente se romperían porque el registro de piso no devuelve 1 para ellos.
fuente
TextRegognize
no funciona para números pequeños. Y tienes un error tipográficoheight = b[[3]];
. ¡También revisa mi respuesta también, por favor! :)TextRecognize
, es que devuelve una cadena, que no está permitida y también debe convertirla de nuevo en número.Perl / LuaTeX / Tesseract
El siguiente script de Perl lee el número como argumento de línea de comando, por ejemplo:
1234567890
El siguiente script de Perl imprime el número a través de LuaTeX. Se crea una fuente virtual sobre la marcha que refleja los dígitos horizontalmente.
Luego, el número entero se refleja nuevamente horizontalmente:
La imagen final se vuelve a leer a través de OCR (tesseract):
0987654321
fuente
Brainfuck
Básicamente, es solo un programa de inversión de entrada.
UPD: Como Sylwester señaló en los comentarios, en los compiladores / intérpretes clásicos de Brainfuck (sin posibilidad de ir a la izquierda desde el punto cero en la matriz de memoria) este programa no funcionaría en ausencia de '>' al principio, por lo que el más estable la versión es:
fuente
>
comienzo para hacer una celda cero antes de los datos, esto no funcionará en muchos intérpretes / compiladores.[.<]
no tiene celda cero para detenerse debido a eso y fallará. Error debf -n rev1.bf
esError: Out of range! Youwanted to '<' below the first cell.
. Si compilas obtienes unsegfault
quizás.,[.,]
Haskell
Sin matrices, cadenas o módulos.
Además, sé que se supone que no debemos usar listas o cadenas, pero me encanta lo breve que es cuando haces eso:
fuente
C ++
fuente
?:
Supongo que alguien tiene que ser el fiestero.
Golpetazo
Las limitaciones de tamaño dependen de su caparazón, pero estará bien dentro de lo razonable.
fuente
declare -i
. Compararfoo=089
ydeclare -i foo=089
(número octal no válido).Javascript
EDITAR : ya que hay una sugerencia para no usar
%
operador, ahora uso un pequeño truco.Sé que este no es un código de golf, pero no hay razón para hacerlo más largo.
r(13457)
devoluciones75431
Además, es mucho más rápido que el método de cadena (
n.toString().split('').reverse().join('')
):==> Informe JSPerf <==
fuente
~~
lugar deMath.floor
?~~
lugar deMath.floor
(el cambio sugerido por @Victor)Pitón
No estoy seguro si esta implementación califica para matemática creativa
Además,% operator no se usó per se, aunque uno podría argumentar que divmod hace lo mismo, pero luego la pregunta debe reformularse :-)
Implementación
manifestación
¿Como funciona?
Esta es una solución recursiva divmod * Esta solución determina el dígito menos significativo y luego lo empuja al final del número. *
Otra implementación de Python
¿Como funciona?
Esta es una solución recursiva que intercambia los dígitos extremos del número
Ejecución de ejemplo
fuente
Solo para ser contrario, un uso excesivo del operador de módulo:
Tenga en cuenta que esto siempre invierte 5 dígitos, y los enteros de 32 bits se desbordarán para valores de entrada superiores a 39045.
fuente
DO#
Aquí hay una manera de hacerlo sin el
%
operador Modulus ( ) y simplemente aritmética simple.fuente
%
operador. :) Pero entiendo lo que quieres decir, mi texto fue un poco engañoso.Golpetazo
fuente
do
Sin cadenas, matrices, módulo o división. En cambio, división por sustracción repetida.
fuente
Mathematica
Hacer una imagen fuera del número, reflejarla, dividirla en dígitos Entonces hay dos alternativas:
Compare cada imagen de un dígito reflejado con imágenes preparadas anteriormente, reemplácela con el dígito correspondiente y construya el número a partir de esto.
Refleje cada dígito por separado, construya una nueva imagen y páselo a la función de reconocimiento de imagen.
Hice ambas
EDITAR : Se agregó relleno de tres ceros, porque
TextRecognise
funciona correctamente solo con enteros> 999.fuente
Lua
No se utilizan matrices ni cadenas. El número se divide en dígitos y se vuelve a ensamblar utilizando la lista de argumentos.
fuente
%
! : PPython2
Asume que "entero sin signo" es de 32 bits
Cuando se le da entrada
1230
, sale0321
.fuente
"Since this is a popularity contest, I suggest not using the modulus (%) operator in your code."
Posdata
Sin matrices, sin cadenas, sin variables.
Lo mismo sin
mod
(que es solo un atajo, así que no hay gran diferencia):fuente
DO#
Esto no utiliza cadenas ni matrices, pero sí utiliza el
Stack<T>
tipo .NET (EDITAR: operador de módulo utilizado originalmente; ahora eliminado)fuente
do
En ese sentido, la solución obvia está representada en un par de otros idiomas, también podría publicarse en C.
Golfizado:
Sin golf:
EDITAR: acabo de ver la edición del módulo.
Golfizado (sin módulo):
Sin golf (sin módulo):
fuente
Java
Esto es lo que se me ocurrió, sin cadenas, sin matrices ... ni siquiera variables (en Java, me importa):
EDITAR Una versión más legible
fuente
Potencia Shell
Una solución rápida en PowerShell. No se utilizan matrices ni cadenas, ya sea implícita o explícitamente.
Pruebas:
fuente
Python (hecho fácilmente en ensamblaje)
Invierte los bits de un byte. ¿Puntos por no hacer exactamente lo mismo que todos los demás?
ejemplo
fuente
C ++
SALIDA
Tres ejecuciones de muestra
Prueba con ceros
¡También invierte números flotantes!
Si desea ejecutar este código , ejecútelo en su computadora porque crea un archivo temporal durante su tiempo de ejecución y no estoy seguro de si los compiladores en línea harían un archivo temporal en su computadora
fuente
ECMAScript 6
Luego:
reverse(12345)
salidas54321
reverse(3240)
salidas423
reverse(6342975)
salidas5792436
fuente
Fisión
Este programa invierte la entrada.
fuente
ADELANTE
Creo que esto es lo opuesto a lo popular ... pero usar Forth siempre es creativo ...Vamos a crear una nueva palabra.
Aquí, usa la palabra U / que devuelve el resto y el cociente, el resto se envía a la salida como número dentro de un campo de 1 carácter de largo, hasta que el dividendo sea cero. No se utiliza ninguna cadena, al menos hasta que se envíe algo al video. No uso un operador de módulo, en su lugar uso la división de enteros con resto y cociente. Intentemos
fuente
Código de máquina de Turing
Usando la sintaxis de aquí.
Pruébalo en línea!
fuente
Pitón
fuente
rev(1230)
da321
. Supongo que realmente debería dar0321
?do
fuente
Lote
Perdí la parte de no usar cuerdas, oh, bueno.
fuente
Python 2
fuente