Cuadrados esteganográficos
Su trabajo es tomar una cadena y generar una NxN
imagen que represente esta cadena. También debe escribir el algoritmo que toma la imagen y la convierte nuevamente en una cadena. La puntuación incluirá el recuento de bytes de ambos algoritmos:
Algoritmo "Cifrado" + Algoritmo "Descifrado" .
Debe publicar cada uno por separado, con recuentos de bytes para los algoritmos de cifrado y descifrado que se muestran individualmente.
Algoritmo de ejemplo
Por ejemplo, aquí está el "Programa de acertijos y código de golf" usando un algoritmo esteganográfico simple basado en ASCII en el canal Azul:
#2e7250,#6ea972,#04eb6f,#0fc767,#74ab72,#ee6161
#b73b6d,#1aae6d,#f37169,#bda56e,#1fe367,#e99620
#706450,#0d3575,#146b7a,#4ea47a,#2a856c,#95d065
#3f2d73,#cef720,#bab661,#d1b86e,#f22564,#12b820
#0f3d43,#c86e6f,#1ee864,#a66565,#247c20,#c3bb47
#0e296f,#89d46c,#585b66,#c08f20,#455c20,#136f20
Puede ver que el canal azul simplemente contiene los valores ascii para esta imagen:
50 = 80(P) 72 = 114(r) 6f = 111(o) 67 = 103(g) 72 = 114(r) 61 = 97(a)
6d = 109(m) 6d = 109(m) 69 = 105(i) 6e = 110(n) 67 = 103(g) 20 = 32( )
50 = 80(P) 75 = 117(u) 7a = 122(z) 7a = 122(z) 6c = 108(l) 65 = 101(e)
73 = 115(s) 20 = 32( ) 61 = 97(a) 6e = 110(n) 64 = 100(d) 20 = 32( )
43 = 67(C) 6f = 111(o) 64 = 100(d) 65 = 101(e) 20 = 32( ) 47 = 71(G)
6f = 111(o) 6c = 108(l) 66 = 102(f) 20 = 32( ) 20 = 32( ) 20 = 32( )
Mientras que el resto de los canales contienen valores generados aleatoriamente para "condimentar" la variedad de colores en la imagen. Al extraer el mensaje de la imagen, simplemente podemos ignorar los otros valores del canal y extraer el bit hexadecimal en el canal azul, reconstruyendo la cadena:
"Programming Puzzles and Code Golf"
Observe que los espacios que se usaron para rellenar la cadena en el cuadrado no se incluyen en la salida descifrada final. Si bien debe rellenar la cadena en la imagen, puede suponer que la cadena de entrada no terminará con espacios.
Reglas
- Debe codificar 1 carácter por píxel, el canal elegido para codificar el carácter es arbitrario.
- Los canales de los otros colores RGB deben ser aleatorios, distintos del que está eligiendo codificar la cadena; Esto significa que sus canales finales no codificados tendrían que estar entre
0x0000-0xFFFF
(elegidos al azar). - Expresar el resultado final como una matriz 2D de valores de color RGB está bien
0x000000-0xFFFFFF
, no es necesario usar la creación de imágenes a menos que quiera divertirse con él o si tiene menos bytes. Si elige generar como cadenas hexadecimales, prefije la cadena hexadecimal con#
EG#FFFFFF
o#05AB1E
. Puede separarse con pestañas, comas o cualquier otra cosa que sea horizontalmente sensible, pero debe mantener el patrón cuadrado; en otras palabras, debe usar la separación de línea nueva apropiada. - La salida debe estar en un cuadrado, y la cadena debe estar rellenada con espacios al final para acomodar esto. Esto significa que
N≈SQRT(Input#Length())
. Si la longitud de entrada no es un cuadrado perfecto, debe redondearN
y rellenar con espacios. - Como se indicó anteriormente, si está rellenando con espacios en la imagen, no debe incluir los caracteres rellenados en la salida final "descifrada".
- Puedes asumir que:
- La cadena de entrada no terminará con espacios.
- La cadena de entrada solo usará caracteres ASCII imprimibles.
- Este es el código de golf , el conteo de bytes más bajo gana.
fuente
Respuestas:
05AB1E , 34 + 12 = 46 bytes
Utiliza canal rojo.
05AB1E utiliza la codificación CP-1252 .
Codificar:
Pruébalo en línea!
Descodificar:
Pruébalo en línea!
Método de relleno alternativo con recuento de bytes igual
fuente
C, 201 (codificación) + 175 (decodificación) = 376 bytes
Para codificar:
Codifica cada carácter de la cadena de entrada en el canal verde del espectro RGB mientras configura los otros dos canales como valores hexadecimales aleatorios. Toma la entrada a través de STDIN como una cadena y emite a STDOUT una cadena multilínea de código de color hexadecimal en forma de cuadrado. Suponiendo que tiene instalado Python 3 e ImageMagick, y el archivo anterior se compila en un archivo nombrado
a.out
en el directorio de trabajo actual (CWD), puede obtener directamente la imagen resultante, denominadaOutput.png
, en el CWD desde la salida de texto usando el siguiente comando:Aquí hay una imagen de salida de muestra creada por el comando anterior utilizando
Programming Puzzles and Code Golf
como cadena de entrada:Para decodificar:
Toma entrada a través de STDIN una secuencia de cadenas de código de color hexadecimales separadas por espacios con cada una encerrada entre comillas dobles (
"
) (char** argv
inmain
) y también, cuando se llamamain
,int argc
para la entrada entera. Emite a STDOUT una cadena simple / multilínea que representa el mensaje decodificado.Intentaré jugar al golf más a lo largo del tiempo cuando y donde pueda.
Además, si usa ambos métodos en el mismo archivo, puede usar el siguiente
main
método para unirlo todo con cada función obteniendo las entradas correctas:y usando esto, para la codificación debe proporcionar
E
como primer argumento para llamar al método de codificación seguido del argumento de cadena única, mientras que para la decodificación, todo lo que necesita proporcionar es la secuencia de cadenas de código de color hexadecimal separadas por espacios con cada una encerrada en doble comillas ("
).Por último, si se quiere, se puede obtener la versión de usar listos totalmente preparado aquí , aunque no se jugó golf, pero tampoco lo hace la salida cualquier advertencias o errores en la compilación.
fuente
Python 2,
164160+9493 = 253 bytesGuardado 1 + 1 byte gracias a Wheat Wizard.
-5 bytes gracias a Kade
Codificador: la cadena debe estar entre comillas, por ejemplo
"CodeGolf"
, la salida es una imagen PPM de color ascii.Decodificador: toma el nombre de archivo de entrada como argumento de línea de comando
Uso:
Ejemplo:
Programación de puzzles y código de golf
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. En vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. En vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
fuente
for
int
de esto es 4, que luego se+1
edita, entonces 5-1
.print
y'
en el decodificador. También estoy bastante seguro de que podría hacerint((len(s)+1)**.5)
para guardar algunos bytes.' '.join("%d %d %d"
a''.join(3*"%d "
ya que estoy bastante seguro de que un espacio final está bien.Scala, 97 + 68 = 165 bytes
Cifrado (97 bytes):
Toma una cuerda y vuelve a ejecutar un iterador de secuencias de enteros.
Descifrado (68 bytes):
Toma un iterador de secuencias de enteros y devuelve una cadena.
Explicación:
.
fuente
Perl, (103 + 1) + (36 + 2) = 142 bytes
El codificador de texto a imagen (se ejecuta con
-p
una penalización de 1 byte;-p0
(para un byte adicional de penalizaciones) es necesario si desea manejar nuevas líneas en la cadena de entrada)Imagen para decodificador de texto (correr con
-p0
una pena de 2 bytes):Utiliza el
#abcdef
formato de imagen basado en texto y codifica en el canal azul. Aquí hay un ejemplo de un posible resultado dadoProgramming Puzzles and Code Golf
como entrada:Explicación del codificador:
Estaba realmente feliz de este uso de
\K
trabajado; especifica dónde reemplazar, y colocándolo dentro de un bucle, parece que la ocurrencia en la última iteración del bucle es lo que cuenta. Pors/(.*?\K,){$a}/\n/g
lo tanto , coincidirá con una cadena de longitud mínima de la forma algo coma cualquier cosa coma ... cualquier coma, que tenga$a
comas, pero la parte real reemplazada del partido simplemente será la última coma. Esto tiene el efecto de reemplazar cada$a
coma con una nueva línea, dándonos la forma cuadrada de la imagen.La gran ventaja de Perl para este desafío (aparte del convertidor de cadena a hexadecimal de caracteres incorporado, que era increíblemente conveniente) es que tiene un decodificador muy corto (tan corto, de hecho, que aunque Perl tiene un generador incorporado para convirtiendo hexadecimal a una cadena, era más corto no usarlo). Así es como funciona:
Las únicas instancias de dos caracteres inmediatamente antes de un carácter no alfanumérico son los canales azules (que queremos desempaquetar), que aparecen justo antes de las comas y las nuevas líneas; y los dos personajes que aparecen uno frente al
#
otro que el primero. No queremos la última categoría de coincidencias, pero inevitablemente se superponen a la categoría anterior y, por lo tanto, serán excluidas por la comprobación de coincidencias superpuestas.fuente
MySQL, 438 + 237 = 675 bytes
Hay una nueva línea al final de la salida, pero no aparece después de ser descifrada. La función hexadecimal (sobrecarga de enteros) cortaría los ceros iniciales, por lo que tuve que rellenarlo con una cadena 0. Podría guardar algunos bytes si pudiera declarar ambas funciones entre los delimitadores.
Encriptar
Descifrar
Uso:
fuente
C #, 312 + 142 = 454 bytes
Codificación:
Descodificación:
Programa completo:
fuente
Mathematica, 111 + 65 = 176 bytes
Codificador
Descifrador
fuente
Procesamiento,
220209194 +171167151 =391380376361345 bytesActualizar:
Eliminado inútil
noStroke()
e hizo que ambos bucles for-one-statementers.Eliminado inútil
image(p,0,0);
, le dio al descifrador el nombre de archivo como parámetroAlgoritmo de cifrado
Llamando a la función:
g("Programming Puzzles and Code Golf");
Esta es una función que toma una Cadena y crea la salida, antes de guardarla como
t.png
. Utiliza elred
valor para almacenar el texto oculto.Algoritmo de descifrado
Función de llamada por:
u(file_name);
Esta también es una función que busca la imagen especificada por el parámetro y luego genera la cadena oculta (ya que es más corta que devolver una cadena).
Código expandido
(Algoritmo de cifrado)
La cadena se pasa cuando se llama a la función. La primera línea de la función calcula la longitud del lado del cuadrado tomando el
ceil
de su raíz cuadrada. Luego ingresamos un bucle for, donde configuramos elstroke
(el color del borde) para que tenga el valor ASCII del personaje en rojo, y valores aleatorios para azul y verde. Después de hacer esto, creamos unrect
(rectángulo) con ancho =1
y alto =1
, es decir, un píxel (por alguna extraña razón, no puedo usarpoint
correctamente). En la última línea, la imagen resultante se guarda comot.png
.(Algoritmo de descifrado)
Esta función tiene el nombre del archivo como parámetro (como una cadena). Luego, la imagen en el archivo se almacena en una variable para ser utilizada más tarde. Una vez que hayamos terminado con eso, configuramos la cadena
""
lugar de crear una nueva cadena solo para contener la cadena oculta. Luego iteramos a través de la imagen a través de dos bucles for anidados, y agregamos a la cadena el valor del carácter del valor rojo del píxel. Finalmente, imprimimos la cadena resultante después de eliminar los espacios iniciales (usando una expresión regular). La razón por la que imprimimos el texto oculto en lugar de devolverlo es porque de esta manera es más corto y guardamos bytes.Texto sin formato de desafío cifrado:
fuente
Jelly, 40 + 20 = 60 bytes en la página de códigos de Jelly
Codificador (texto → imagen):
Pruébalo en línea!
Decodificador (imagen → texto):
Pruébalo en línea!
Un ejemplo de salida que el programa podría producir (almacena información en el canal rojo):
En estos desafíos más grandes, la brevedad de Jelly comienza a disminuir un poco, necesitando varios caracteres "estructurales" para resolver las ambigüedades de análisis, pero aún así es muy breve. Así es como funciona el codificador:
Y así es como funciona el decodificador:
fuente