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.
fonte
Respostas:
05AB1E , 34 + 12 = 46 bytes
Usa canal vermelho.
05AB1E usa a codificação CP-1252 .
Codificar:
Experimente online!
Decodificar:
Experimente online!
Método alternativo de preenchimento com contagem de bytes igual
fonte
C, 201 (codificação) + 175 (decodificação) = 376 bytes
Para codificar:
Codifica cada caractere da sequência de entrada no canal verde do espectro RGB enquanto define os outros dois canais como valores hexadecimais aleatórios. Leva a entrada através de STDIN como uma sequência e gera para STDOUT uma sequência multilinha de código de cores hexadecimal na forma de um quadrado. Supondo que você tenha o Python 3 e o ImageMagick instalados e o arquivo acima seja compilado em um arquivo nomeado
a.out
no diretório de trabalho atual (CWD), é possível obter diretamente a imagem resultante, denominadaOutput.png
, no CWD a partir da saída textual, usando o seguinte comando:Aqui está uma imagem de saída de amostra criada pela vírgula acima, usando
Programming Puzzles and Code Golf
como string de entrada:Para decodificar:
Recebe da entrada STDIN uma sequência de cadeias de código hexadecimal de espaço separadas por espaço, cada uma entre aspas duplas (
"
) (char** argv
inmain
) e também, quando chamadamain
,int argc
para a entrada inteira. Emite para STDOUT uma sequência de linhas únicas / múltiplas, representando a mensagem decodificada.Vou tentar jogar estes mais ao longo do tempo, quando e onde puder.
Além disso, se você mesclar os dois métodos no mesmo arquivo, poderá usar o
main
método a seguir para reunir tudo, com cada função obtendo as entradas corretas:e usando isso, para a codificação, você deve fornecer
E
como o primeiro argumento a chamar o método de codificação seguido pelo argumento de cadeia única, enquanto que para a decodificação, tudo o que você precisa fornecer é a sequência de cadeias de código de cores hexadecimais separadas por espaço, com cada uma delas aspas duplas ("
).Por fim, se desejar, você pode obter a versão totalmente preparada e pronta para uso aqui , embora não seja um jogo de golfe, mas também não gera nenhum aviso ou erro na compilação.
fonte
Python 2,
164160 +9493 = 253 bytesEconomizou 1 + 1 byte graças ao Wheat Wizard.
-5 bytes graças ao Kade
Codificador: a string deve estar entre aspas; por exemplo
"CodeGolf"
, a saída é uma imagem PPM ascii colorida.Decodificador: recebe o nome do arquivo de entrada como argumento da linha de comando
Uso:
Exemplo:
Programação de quebra-cabeças e código de golfe
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod temporariamente associado a labore et dolore magna aliquyam erat, sed diam voluptua. No vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no mar takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod temporariamente associado a labore et dolore magna aliquyam erat, sed diam voluptua. No vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no mar takimata sanctus est Lorem ipsum dolor sit amet.
fonte
for
int
a partir deste é 4, que é, em seguida,+1
ed, assim 5-1
.print
e'
no decodificador. Também tenho certeza de que você poderia fazerint((len(s)+1)**.5)
para salvar alguns bytes.' '.join("%d %d %d"
para,''.join(3*"%d "
pois tenho certeza de que um espaço à direita está OK.Scala, 97 + 68 = 165 bytes
Criptografia (97 bytes):
Pega uma String e executa um Iterador de Sequências de Inteiros.
Descriptografia (68 bytes):
Toma um iterador de sequências de números inteiros e retorna uma string.
Explicação:
.
fonte
Perl, (103 + 1) + (36 + 2) = 142 bytes
O codificador de texto em imagem (executado com
-p
uma penalidade de 1 byte;-p0
(para um byte adicional de penalidades) é necessário se você deseja manipular novas linhas na sequência de entrada):Decodificador de imagem em texto (executado com
-p0
uma penalidade de 2 bytes):Isso usa o
#abcdef
formato de imagem baseado em texto e codifica no canal azul. Aqui está um exemplo de uma saída possível fornecidaProgramming Puzzles and Code Golf
como entrada:Explicação do codificador:
Fiquei muito feliz com esse uso do
\K
trabalho; especifica onde substituir e, colocando-o dentro de um loop, parece que a ocorrência na última iteração do loop é o que conta. Então,s/(.*?\K,){$a}/\n/g
vai encontrar uma string de tamanho mínimo da forma nada vírgula qualquer coisa vírgula ... nada vírgula, que tem$a
vírgulas, mas a parte real substituído do jogo será simplesmente a última vírgula. Isso tem o efeito de substituir todas as$a
vírgulas por uma nova linha, fornecendo a forma quadrada da imagem.A grande vantagem do Perl para esse desafio (além do conversor de cadeia de caracteres para hexadecimal de caracteres embutido, que era incrivelmente conveniente) é que ele possui um decodificador muito curto (tão curto, de fato, que, embora o Perl tenha um built-in para convertendo hexadecimal em uma string, era mais curto não usá-lo). Veja como funciona:
As únicas instâncias de dois caracteres imediatamente antes de um caractere não alfanumérico são os canais azuis (que queremos descompactar), que aparecem logo antes de vírgulas e novas linhas; e os dois caracteres que aparecem um antes do
#
outro que o primeiro. Não queremos a última categoria de correspondências, mas elas inevitavelmente se sobrepõem à categoria anterior e, portanto, serão excluídas pela verificação de correspondências sobrepostas.fonte
MySQL, 438 + 237 = 675 bytes
Há uma nova linha à direita no final da saída, mas ela não aparece após ser descriptografada. A função hexadecimal (sobrecarga de número inteiro) cortaria os zeros à esquerda, então tive que preenchê-la com uma string 0. Eu poderia economizar alguns bytes se pudesse declarar as duas funções entre os delimitadores.
Criptografar
Descriptografar
Uso:
fonte
C #, 312 + 142 = 454 bytes
Codificação:
Decodificação:
Programa completo:
fonte
Mathematica, 111 + 65 = 176 bytes
Codificador
Decodificador
fonte
Processamento,
220209194 +171167151 =391380376361345 bytesAtualizar:
Removido inútil
noStroke()
e feito os dois for-loops one-statementers.Removido inútil
image(p,0,0);
, deu ao decodificador o nome do arquivo como parâmetroAlgoritmo de criptografia
Chamando a função:
g("Programming Puzzles and Code Golf");
Esta é uma função que recebe uma String e cria a saída antes de salvá-la como
t.png
. Ele usa ored
valor para armazenar o texto oculto.Algoritmo de descriptografia
Chamar a função por:
u(file_name);
Essa também é uma função que procura a imagem especificada pelo parâmetro e, em seguida, gera a string oculta (já que é mais curta do que retornar uma string).
Código expandido
(Algoritmo de criptografia)
A cadeia é passada quando a função é chamada. A primeira linha da função calcula o comprimento lateral do quadrado tirando a
ceil
raiz quadrada. Em seguida, inserimos um loop for, onde definimos astroke
(a cor da borda) para que o valor ASCII do caractere seja vermelho e os valores aleatórios para azul e verde. Depois disso, criamos umrect
(retângulo) com largura =1
e altura =1
, ou seja, um pixel (por algum motivo estranho, não posso usarpoint
corretamente). Na última linha, a imagem resultante é salva comot.png
.(Algoritmo de descriptografia)
Esta função tem o nome do arquivo como parâmetro (como uma string). Em seguida, a imagem no arquivo é armazenada em uma variável para ser usada posteriormente. Depois que terminamos, definimos a string para, em
""
vez de criar uma nova string apenas para manter a string oculta. Em seguida, iteramos na imagem por meio de dois loops for-aninhados e adicionamos à string o valor do caractere do valor vermelho do pixel. Por fim, imprimimos a sequência resultante após remover os espaços iniciais (usando uma regex). A razão pela qual imprimimos o texto oculto em vez de retorná-lo é porque dessa maneira é mais curto e economizamos bytes.Texto bruto do desafio criptografado:
fonte
Jelly, 40 + 20 = 60 bytes na página de códigos de Jelly
Codificador (texto → imagem):
Experimente online!
Decodificador (imagem → texto):
Experimente online!
Um exemplo de saída que o programa pode produzir (armazena informações no canal vermelho):
Nesses desafios maiores, a discrepância de Jelly começa a diminuir um pouco, precisando de vários caracteres "estruturais" para resolver as ambiguidades da análise, mas ainda assim é muito concisa. Veja como o codificador funciona:
E aqui está como o decodificador funciona:
fonte