Quadrados esteganográficos
Seu trabalho é coletar uma sequência e gerar uma NxN
imagem que represente essa sequência. Você também deve escrever o algoritmo que captura a imagem e a transforma novamente em uma string. A pontuação será incluirá a contagem de bytes de ambos os algoritmos:
Algoritmo "Criptografia" + Algoritmo "Descriptografia" .
Você deve postar cada um separadamente, com contagens de bytes para os algoritmos de criptografia e descriptografia exibidos individualmente.
Exemplo de algoritmo
Por exemplo, aqui está o "Programming Puzzles and Code Golf" usando um algoritmo esteganográfico simples baseado em ASCII no canal Blue:
#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
Você pode ver que o canal azul simplesmente contém os valores ascii para esta imagem:
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( )
Enquanto o restante dos canais mantém valores gerados aleatoriamente para "apimentar" a variedade de cores na imagem. Ao retirar a mensagem da imagem, podemos simplesmente ignorar os outros valores do canal e puxar o bit hexadecimal no canal azul, reconstruindo a string:
"Programming Puzzles and Code Golf"
Observe que os espaços que foram usados para preencher a cadeia no quadrado não estão incluídos na saída descriptografada final. Enquanto você deve preencher a sequência na imagem, você pode assumir que a sequência de entrada não terminará com espaços.
Regras
- Você deve codificar 1 caractere por pixel, o canal escolhido para codificar o caracter é arbitrário.
- Os canais das outras cores RGB devem ser randomizados, diferente daquele em que você deseja codificar a sequência; isso significa que seus canais finais não codificados precisariam estar entre
0x0000-0xFFFF
(escolhidos aleatoriamente). - Expressar o resultado final como uma matriz 2D de valores de cores RGB é bom
0x000000-0xFFFFFF
, não há necessidade de usar a criação de imagens, a menos que você queira se divertir com ele ou menos bytes. Se você escolher a saída como cadeias hexadecimais, prefixe a cadeia hexadecimal com#
EG#FFFFFF
ou#05AB1E
. Você pode separar com guias, vírgulas ou qualquer outra coisa que seja horizontalmente sensível, mas deve manter o padrão quadrado; em outras palavras, você deve usar a separação de nova linha apropriada. - A saída deve estar em um quadrado e a cadeia deve ser preenchida com espaços no final para acomodar isso. Isso significa isso
N≈SQRT(Input#Length())
. Se o comprimento da entrada não for um quadrado perfeito, você deve arredondar para cimaN
e preencher com espaços. - Como mencionado anteriormente, se você estiver preenchendo espaços na imagem, não deverá incluir os caracteres preenchidos na saída final "descriptografada".
- Você pode assumir que:
- A sequência de entrada não termina com espaços.
- A sequência de entrada usará apenas caracteres ASCII imprimíveis.
- Isso é código-golfe , menor número de bytes ganhos.