Reto
Su tarea es codificar un número entero como una cadena de caracteres ASCII , luego decodificarlo con éxito después de que dicha cadena se haya barajado aleatoriamente.
Escribirás dos programas / funciones , que se denominarán codificador y decodificador. .
Codificador
- Entrada: un número entero en el rango .
- Salida: una cadena de ASCII caracteres (no necesariamente imprimible).
Descifrador
- Entrada: una permutación aleatoria de la cadena .
- Salida: el entero .
Tanteo
Sea la longitud máxima de en todos los valores posibles de . Si el codificador actúa de manera no determinista (lo cual está permitido, ver más abajo), entonces la será la longitud máxima de que puede ocurrir (posiblemente ).
Sea la longitud del codificador en bytes y la longitud del decodificador en bytes.
Entonces su puntaje es .
La victoria se otorga a la presentación la puntuación más baja .
Límite de tiempo
Hay un límite de tiempo algo arbitrario de 1 minuto en el tiempo de ejecución tanto del codificador como del decodificador para un solo caso de prueba (es decir, un único valor de ).
El objetivo es evitar una solución que encuentre que la fuerza bruta codifica enumerando todas las secuencias con ciertas propiedades. Si su solución hace algo más inteligente que eso, lo más probable es que se ajuste a la restricción de tiempo y se considerará válida. Del mismo modo, si funciona en TIO para algunos valores seleccionados al azar de , se considerará válido. De lo contrario, lo probaré en mi máquina, pero tenga en cuenta que si su solución es pura fuerza bruta, seguramente fallará.
Reglas
- El codificador y el decodificador deben estar escritos en el mismo idioma .
- El decodificador debe generar el número entero correcto para cada permutación posible de la cadena devuelta por elcodificador.
- El codificador y el decodificador se no se les permite compartir información de cualquier forma (por ejemplo, por medio de variables globales o archivos).
- La salida del codificador no necesita ser determinista (es decir, la misma entrada puede producir diferentes cadenas de salida si el codificador se ejecuta varias veces), pero el decodificador siempre debe adivinar el número entero correcto .
- El codificador y el decodificador pueden tomar y devolver el número entero de cualquier manera conveniente (por ejemplo, si está bien que la entrada sea
14
,"14"
o[1,4]
). - El codificador puede emitir la cadena ya sea por impresión en
stdout
o por devolver una cadena, una lista / matriz de caracteres o una lista / matriz de enteros en el intervalo ; tenga en cuenta que el decodificador recibirá como entrada una permutación de devuelta por el codificador , por lo que debe aceptar la cadena en el mismo formato que . - Las lagunas estándar están prohibidas.
- Si es posible, explique cómo funciona su código y por qué el puntaje que reclama es correcto.
Ejemplo
Suponga que .
- El codificador recibe
14
como entrada. Puede salir"qwerty"
.- El decodificador recibe una permutación
"qwerty"
como entrada, por ejemplo"tweyqr"
. Debe salir14
(en cualquier formato conveniente).
El codificador podría haber regresado[113,119,101,114,116,121]
, en cuyo caso el decodificador habría recibido (por ejemplo) [116,119,101,121,113,114]
.
Tenga en cuenta que la cadena devuelta por el codificador también puede incluir caracteres ASCII no imprimibles (pero siempre en el rango[0x00, ..., 0x7F]
).