Con desafíos como Salida con la misma longitud que el código y Crear salida dos veces la longitud del código , pensé en un desafío separado pero similar.
La tarea es producir una salida. Puede ser una cadena, una lista de caracteres o el formato de salida predeterminado de su programa. Sin embargo, su salida siempre debe tener la misma longitud, independientemente de la entrada. Y lo más importante, la salida debería ser diferente para diferentes entradas .
Entrada
Un número entero , cuyos rangos están determinados por la elección del idioma. Si su idioma tiene enteros de longitud variable, el rango es .
Salida
Una cadena o una lista de caracteres, o una impresión en STDOUT o STDERR. Solo puede usar uno de estos métodos. La salida debe tener la misma longitud independientemente de la entrada, pero depende de usted definir qué longitud es. La salida puede no contener los caracteres de dígitos 0-9
o el signo menos-
. La salida debe ser determinista .
Debería poder demostrar que para cada salida solo hay una entrada posible , ya sea mediante una prueba formal, un argumento o una búsqueda de fuerza bruta.
Esta es una pregunta de código de golf, así que elimine los bytes extraños. Todos los idiomas son bienvenidos, ¡cuanto más mejor!
Respuestas:
JavaScript (ES8), 33 bytes
Espera la entrada en el rango de enteros JS seguros :- 253≤ n < 253 .
Devuelve una cadena de 76 caracteres.
Pruébalo en línea!
¿Cómo?
Paso 1
La entrada se convierte primero a binario. Esto conserva el signo menos inicial para números negativos.
Ejemplos:
123
→"1111011"
-77
→"-1001101"
Paso 2
La cadena resultante está codificada en base-64.
Significa que cada bloque de 1 a 3 caracteres se convertirá en un nuevo bloque de 4 caracteres. Esta conversión es segura porque ninguno de los bloques resultantes contiene los símbolos prohibidos (dígitos o signo menos).
Bloques de 3 caracteres
Se debe codificar un único bloque final de 1 o 2 caracteres si la longitud de la cadena binaria no es múltiplo de 3:
Bloques de 1 carácter
Bloques de 2 caracteres
Paso 3
La salida final se rellena con espacios finales.
fuente
Python 3 ,
4939 bytesPruébalo en línea!
-10 bytes gracias a siete negativos
Convierte el entero en hexadecimal y antepone espacios de hasta 9 caracteres en total. Luego, dobla el código ASCII de cada carácter en la cadena (algunos se extienden fuera de ASCII en Unicode, pero Python lo maneja bien), generando una lista de caracteres.
Esto funciona porque cada dígito, incluyendo
-
, se asigna a un carácter ASCII diferente. No hay enteros entre-2147483648
y2147483648
son iguales, por lo que convertirlos a espacios hexadecimales y anteriores no los haría iguales. Luego, asignarlos a diferentes puntos de código no conduce a colisiones, por lo que todavía no hay dos valores en el rango que conduzcan a salidas iguales.Pitón 3 ,
595647 bytesPruébalo en línea!
-3 bytes gracias a Jitse
-9 bytes gracias a siete negativos
Mismo algoritmo, pero usando en
map
lugar de unfor
bucle.fuente
map
enfoque reemplazandolist( ... )
con[* ... ]
"%9x"%i
`4e9+n`
05AB1E ,
115 bytes-6 bytes portando el enfoque de @Stephen , ¡así que asegúrate de votarlo!
Salidas de una lista de hasta 100 caracteres, con100 - ( longitud de entrada ) cantidad de
@
(el doble del punto de código espacio), y todo-0123456789
asignada aZ`bdfhjlnpr
(el doble de los puntos de código ASCII).Pruébalo en línea.
Explicación:
Respuesta original de 11 bytes :
Pruébelo en línea (limitado a en
1000
lugar de2147483648
).Explicación:
La longitud de salida es siempre 2.147.483.648 caracteres de longitud. Saldrá2147483648 - | n | - 1 cantidad de espacios, junto con El |n | cantidad de nuevas líneas, agregada con una 'a' si norte < 0 o 'b' si n ≥ 0 .
fuente
brainfuck ,
4829281613 bytesEste programa requiere celdas, dondedonorte∈ N , pero si desea resultados consistentes, asegúrese de que donorte< 256
Obviamente, la salida será única, independientemente del número que ingrese (- ∞ < n < ∞ ). Si el entero es más corto, el programa rellenará la salida para que coincida exactamente ∞ bytes, por lo que la longitud es siempre la misma.
Esta respuesta es un poco desafiante al desafío, ya que no indicó que la salida tiene que ser finita.
Pruébalo en línea!
Respuesta original de 28 bytes:
Éste rellenará la salida para que sea exactamente28- 1 bytes. El mecanismo de conversión de números funciona igual aquí. Este programa asume lo mismo que el programa anterior.
fuente
Python 3 , 39 bytes
Pruébalo en línea!
Convierte el número dado en una representación de cadena binaria (rellena con espacios), luego asigna los caracteres
(space)-01
acaab
con lastr.translate
función.fuente
Jalea , 4 bytes
Un enlace monádico que acepta un número entero que produce una lista de 52 caracteres.
El rango de entrada puede ser hasta algo más de- 2223≤ n < 2223 ya que 52 ! > 2224 .
Pruébalo en línea!
¿Cómo?
Asi que...
fuente
Rubí , 27 bytes
Pruébalo en línea!
('%34b'%n)
Converts an integer into its binary representation, using..1
to indicate a negative number (this is meant to represent an infinitely-long prefix of 1s), and left-pads this out to 34 characters using spaces. Then we replace the0
s with 'a' and the1
s with 'h' to create the Maniacal Base 2 Representation: strings like "haaahahahaaha" prepended with spaces and sometimes..
. Since every step here is invertible this is 1:1.Edit: Let the record show that @manatwork posted this identical solution first. Oops. I should've refreshed.
fuente
Jelly, 6 bytes
Try it online!
Since Jelly has arbitrary length integers, this monadic link takes an integer in the range±231 and returns a length 7 alphabetic string. It works by adding 232 and then base decompressing into the capital letters.
fuente
C (gcc), 38 bytes
Try it online!
This expands each bit of the input integer into a byte that is either 0 or 1 (which are both unprintable characters, but there is no rule against that). So the output is always 32 bytes, and guaranteed to be unique.
fuente
f(a){putchar(a&1);f(a/2);}
C# (Visual C# Interactive Compiler), 35 bytes
Try it online!
fuente
x = int.MinValue
as it can't be negated.Haskell, 31 bytes
Try it online!
Adds
2^60
to the input so that the resulting number has the same amount of digits for the whole input range. Turn into a string and shift each character 10 places to the right in the ASCII order (0
->:
...9
->C
).fuente
C # (compilador interactivo de Visual C #) , 52 bytes
Pruébalo en línea!
Un enfoque diferente para la solución ac # aprovecha el hecho de que el módulo c # es negativo para los números negativos. Supongo que podría eliminar un byte o dos si permite caracteres que no se muestran ('\ 0', etc.) actualizando
+65...
para no compensar el valor del carácter a algo legible por humanos.fuente
Perl 5
-MDigest::MD5=md5_hex -p
, 23 bytesPruébalo en línea!
Previamente:
Perl 5
-p
, 29 bytesTry it online!
Converts the number to its 64 bit binary representation, then transliterates
0
and1
toa
andb
, respectively.fuente
T-SQL,
73 7061 bytesSolo estoy reemplazando directamente los dígitos (y
-
) con letras, después deSTR
rellenar el entero a 11 caracteres. No es necesaria la conversión a hexadecimal o binario.TRANSLATE
se introdujo en SQL 2017.La entrada es a través de una tabla preexistentet con columna INT norte , según nuestras reglas de IO . El rango del - 231≤ n < 231 .
INT
tipo de datos en SQL esEDITAR : guardado 3 bytes reemplazando el relleno manual con una conversión a CHAR (11), que es un formato de caracteres de ancho fijo que se rellena automáticamente con espacios.
EDIT 2 : guardado 9 bytes mediante el uso de la
STR()
función en lugar deCAST
.STR
convierte un número en una cadena de texto rellenada a la longitud especificada.fuente
APL (Dyalog Unicode) , 28 bytes
Pruébalo en línea!
Dfn simple, tomando un argumento entero. Usos
⎕IO←0
.TIO se vincula a un caso de prueba de
-2^10
a2^10
. La0~⍨
parte elimina el duplicado0
de los argumentos.Cómo:
fuente
Japt , 6 bytes
Creo que esto es correcto Inspirado en la solución Python de Stephen, así que por favor
+1
.Intentalo
fuente
Malbolge , 2708 bytes
Esta respuesta es súper engañosa, porque siempre produce la misma cantidad de entrada, que es igual a∞ .
Pruébalo en línea!
fuente
Perl 6 , 12 bytes
Pruébalo en línea!
Anónimo Cualquiera que sea la lambda que tome un número y la cadena OR con 11
@
s. Esto asigna los dígitospqrstuvwxy
y el guión am
, luego rellena la cadena a 11 caracteres con@
sfuente
Perl 5 (-p), 9 bytes
Pruébalo en línea!
Bitwxise-xor de la entrada con la cadena
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
.fuente
Wolfram Language (Mathematica) ,
4433 bytesPruébalo con un dominio más pequeño
-2 gracias a Greg Martin
Imprime13 ! + n 14 ! , y una nueva línea. Funciona en el dominio.[ - 13 ! , 14 ! - 13 ! ) , que es un superconjunto de [ - 231, 231) .
>>
, seguido de la representación de cadena de 523069747202 caracteres de una lista deNull
s acolchado porTrue
s hasta una longitud deDado el tamaño de la salida, he incluido un caso de prueba con un dominio más pequeño de[ - 24 4, 24 4) en lugar
fuente
2^31
y2^32
a13!
y14!
, respectivamente. A la pérdida de cierta "brevedad" en la salida ...Stax , 6 bytes
Ejecutar y depurarlo
Procedimiento:
fuente
PHP ,
6454 bytes-10 bytes usando la
strtr
función en lugar del reemplazo manual de caracteres.Pruébalo en línea!
El valor int más grande posible en PHP a partir de ahora es de
9223372036854775807
19 dígitos, considerando el signo menos en números negativos, será 20. El código anterior reemplaza el signo menos (-
) con elA
carácter y cada dígito de0
a9
con un carácter deD
aM
y luego rellena la cadena a la derecha con un espacio para que siempre tenga 20 caracteres de longitud. Por ejemplo, la salida para la entrada de-9876543210
es"AMLKJIHGFED "
.La salida es único para cada entrada de número entero y se puede obtener de nuevo a la entrada mediante la eliminación de todos los espacios, reemplazando
A
con-
y sustituirD
aM
la0
de9
.PHP , 44 bytes
Pruébalo en línea!
Esta es la misma idea que la respuesta de Arnauld . Convierte la entrada a binario y luego la convierte a base-64. También lo agrega a 88 caracteres (la longitud más grande es para
-9223372036854775807
88 caracteres) con el espacio en blanco a la derecha para obtener siempre la misma longitud en la salida.fuente
Retina 0.8.2 , 21 bytes
Pruébalo en línea! Siempre da salida a 11 caracteres de la gama
n
..z
. Explicación:Traduzca los caracteres ASCII imprimibles a las letras minúsculas. Este mapas
-
an
e0
..9
aq
..z
. (¡Es realmente afortunado que los dígitos sean los caracteres ASCII imprimibles del 16 al 25!)Añadir 10
o
s. Como la entrada tendrá entre 1 y 11 caracteres, ahora hay entre 11 y 21 caracteres.Extrae los primeros 11 caracteres. Como hay menos de 22 caracteres, esto solo coincidirá una vez.
fuente
Carbón de leña , 9 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Siempre genera 10 espacios y letras mayúsculas. Explicación:
fuente
R , 37 bytes
Pruébalo en línea!
Parece que la salida es aleatoria, ¡pero no lo es! La entrada se utiliza como semilla del generador de números pseudoaleatorios, y luego obtenemos uno de los26 ! = 4 ⋅ 1026 permutaciones del alfabeto. La salida siempre es de longitud 51 (26 letras + 25 espacios).
Todavía existe el problema de asegurar que todos los resultados sean diferentes. Terminamos con232≈ 4 ⋅ 109 9 permutaciones (fuera de 4 ⋅ 1026 ) Si pretendemos que las permutaciones se distribuyen uniformemente al azar, entonces la probabilidad de que todas las permutaciones sean diferentes se puede calcular siguiendo los mismos cálculos que para el problema de cumpleaños . La probabilidad de que 2 salidas específicas sean idénticas es10- 17 , entonces una aproximación de primer orden de la probabilidad de que todos 232 las salidas son distintas es
que está lo suficientemente cerca de 1 para mí.
fuente
brainfuck ,
2019 bytes-1 byte gracias a Krzysztof Szewczyk
Pruébalo en línea!
Emite el número con cada dígito y guión mapeado a 255 menos su valor ordinal, rellenado a 255 caracteres con bytes NUL.
fuente
-[>,[->-<]>.[-]<<-]
R ,
4037 bytesPruébalo en línea!
Una alternativa a la respuesta de Robin Ryder ; Esto es ciertamente determinista.
Esto convierte la entrada a un
raw
vector de 32 bytes, cada byte es un número hexadecimal00
o01
representa los bits del entero. A continuación, coaccionar a unalogical
mediante la comparación de0
, por lo que00
se asigna aFALSE
y01
aTRUE
. Luego, necesitamos eliminar una sola letra de cada unaFALSE
para garantizar una salida de igual longitud, seleccionada arbitrariamente para serS
. El resultado se imprime (con espacio) para una longitud de 169.fuente
Zsh , 43 bytes
Pruébalo en línea!
Esta solución supera los
long long
límites de los enteros de Zsh trabajando solo con caracteres. Sólo dirigí a 30 caracteres para facilitar la lectura, pero sustituyendo30
con99
permitiré que este método funcione en todos los números de-1E99+1
a1E100-1
.El efecto de interpretar los códigos decimales como hexadecimales es el siguiente:
Zsh , 46 bytes
Pruébalo en línea!
Declara x como un número binario, rellenado con ceros hasta un ancho de 66. Luego asigna
0
→a
y1
→b
. También asignamos2
y-
a a, ya que esos caracteres están impresos en[[-]][base]#[num]
notación. Para ver cómo se$x
ve antes del reemplazo y los límites de Zsh para analizar tipos enteros, verifique la salida de depuración en el enlace TIO.fuente
Java (JDK) , 42 bytes
Pruébalo en línea!
Primero, esto crea la representación hexadecimal de la entrada, rellena a la izquierda con espacios que proporciona la misma restricción de longitud (8 caracteres de longitud), elimina el signo menos y mantiene cada salida intermedia única.
Esto proporciona una cadena con 17 caracteres posibles diferentes:
0123456789abcdef
y espacio.Luego, cada personaje se transmite y se asigna agregando 64 a su punto de código si es un dígito o un espacio. Efectivamente, esto da como resultado la siguiente asignación:
0123456789abcdef<space>
a lapqrstuvwxyabcdef`
que tiene 17 caracteres diferentes, por lo que no habrá dos números que den como resultado la misma salida.fuente
Bash , 30 bytes
Pruébalo en línea!
Para demostrar que la salida es única, busqué en Google las colisiones MD5 y no encontré resultados dentro de los enteros entre- 231 y 231 . Para evitar tener caracteres prohibidos en la salida, simplemente traduzca los caracteres en cuestión como letras mayúsculas. La salida siempre tiene la misma longitud por definición, y se garantiza que no contiene caracteres prohibidos.
fuente