Introducción
Algunos caracteres ASCII son tan caros en estos días ...
Para ahorrar dinero, ha decidido escribir un programa que codifique caracteres costosos utilizando caracteres económicos.
Sin embargo, los precios de los personajes cambian con frecuencia y no desea modificar su programa cada vez que necesita codificar o decodificar un personaje diferente. Necesitará una solución más dinámica.
Desafío
Su tarea es escribir dos programas: un codificador y un decodificador .
El codificador debe aceptar una lista de cinco caracteres económicos y un solo carácter costoso.
Debería generar una única cadena compuesta por los caracteres económicos, que codifica el carácter costoso.
Esta cadena no puede tener más de 4 caracteres para permanecer económica. Sin embargo, no tiene que usar todos los caracteres económicos en la codificación y las codificaciones pueden tener diferentes longitudes.
El decodificador debe aceptar la cadena producida por el codificador y generar el carácter costoso.
El decodificador no aceptará ninguna entrada que no sea la cadena codificada. Debe funcionar, sin modificar, desde la salida del codificador para cualquier combinación (válida) de entradas. En otras palabras, su programa de decodificador no sabe qué caracteres son caros o baratos.
Puntuación
¡El código combinado más corto gana!
Notas
Todos los caracteres serán letras mayúsculas
[A-Z]
, minúsculas[a-z]
o números[0-9]
.La lista de caracteres económicos no contendrá duplicados. Ningún personaje será económico y costoso.
El codificador y el decodificador no tienen que estar escritos en el mismo idioma, pero pueden estarlo. Puedes escribir un programa o una función.
La entrada y salida pueden estar en cualquier formato razonable para su idioma.
Los dos programas pueden no compartir ninguna variable o información.
Resumen
La entrada de algunos caracteres económicos y un carácter costoso se da al codificador.
El codificador genera una cadena de caracteres económicos que codifica el carácter costoso.
El decodificador recibe la salida del codificador y genera el carácter costoso.
Ejemplos
Entrada: a, b, c, d, e
f
Posibilidades de codificador: a
eeee
caec
Descifrador: f
Entrada: a, b, c, d, e
h
Posibilidades de codificador: bc
cea
eeaa
Descifrador: h
Entrada: q, P, G, 7, C
f
Posibilidades de codificador: 777
P7
PPCG
Descifrador: f
Respuestas:
Pyth, 46 bytes
Codificador, 22 bytes
Decodificador, 24 bytes
fuente
S4
conT
y guardar cada uno de bytes en ambos programas.CJam,
55504847 bytesCodificador,
242221 bytesPruébalo en línea.
Decodificador,
31282726 bytesPruébalo en línea.
fuente
'
'
No es un operador. Puede encontrarlo en la página de sintaxis .gawk, 163 + 165 = 328
Probado con gawk 4.1.1, pero también debería funcionar en versiones anteriores de gawk. Necesita ser ligeramente modificado (alargado) para trabajar con mawk.
codificador (163):
decodificador (165):
Bueno, funciona, pero soy consciente de que este podría no ser el mejor enfoque para esto. No tengo idea de para qué sirve la quinta carta barata, porque uso solo cuatro.
Estos son de un solo uso. Si desea ingresar un segundo código, debe reiniciarlos. Los espacios después de las comas se requieren en la entrada para codificar.
Lo que pensé
Mi primera pregunta fue "¿Qué podría obtener un decodificador de estos 4 caracteres?" (Los llamaré a, b, cyd), y mi idea inicial era obtener 6 bits de información de las siguientes relaciones:
¡Guau, 6 bits, eso es perfecto! Pensé que era genial, pero las pruebas mostraron que esto no funcionaría. Solo hay 24 combinaciones posibles. Maldición.
El siguiente paso fue tratar de contar, basado en lo que ya sabía. Entonces, la primera letra que aparece en la cadena se convertiría en 0, luego la segunda letra introducida en la cadena se convertiría en 1 y así sucesivamente. Pero no me llevaría a las 62 combinaciones necesarias.
Pero de todos modos me gusta la idea.
Bueno, entonces me di cuenta de que podía combinar estos dos, porque los caracteres en la entrada ya tienen relaciones, y no tendría que esperar hasta que se introdujeran para darles un valor.
Cómo funciona
Nota: Esto ya no es exactamente cómo funcionan las versiones de golf, pero el principio se mantuvo igual.
Para el decodificador:
Se construye una matriz, cuyo índice contiene todos los números de cuatro dígitos cuyo dígito más grande no es mayor que el número de dígitos distintos en ese número. Hay 75 números diferentes de cuatro dígitos que cumplen esa condición. Los forcé, porque hasta ahora no pude encontrar una manera de construirlos, y no estoy seguro de que esto sea más corto de todos modos. Mientras los encuentro, les asigno los caracteres caros en orden asciibético.
Luego reemplazo todos los caracteres de la cadena de entrada con un dígito. El más pequeño (por ejemplo, 'B' más pequeño que 'a') se convierte en 1, el segundo más pequeño se convierte en 2, y así sucesivamente hasta 4. Por supuesto, depende de cuántos caracteres diferentes hay en la entrada, cuál es el dígito más alto en la cadena resultante será.
Luego simplemente imprimo el elemento de matriz, que tiene esa cadena como índice.
El codificador funciona en consecuencia.
Cómo utilizar
Copie el código directamente en un comando de línea de bash awk o haga dos archivos "encode.awk" y "decode.awk" y pegue el código en consecuencia. O incluso mejor use el siguiente código, que sale automáticamente después de en / decodificación, o puede usarse varias veces eliminando el comando de salida al final.
encode.awk
decode.awk
Aquí hay un ejemplo de uso:
Recuerde que se requiere el espacio después de cada coma, si utiliza las versiones de golf.
Si lo desea, puede usar este script corto y sucio para generar algunos datos de muestra
y hacer algo divertido como
Lo he visto más como un rompecabezas de programación. Creo que es un poco triste, que casi todo aquí está golfizado, porque puedes aprender mucho más de código legible y bien documentado, pero esa es solo mi opinión. Y lo jugué como lo solicité;)
fuente