Стеганографические площади
Ваша задача - взять строку и сгенерировать NxN
изображение, представляющее эту строку. Вы также должны написать алгоритм, который принимает изображение и превращает его обратно в строку. Оценка будет включать в себя количество байтов обоих алгоритмов:
Алгоритм «Шифрование» + Алгоритм «Расшифровка» .
Вы должны публиковать каждый отдельно, с количеством байтов для алгоритмов шифрования и дешифрования, отображаемых отдельно.
Пример алгоритма
Например, вот «Программирование головоломок и Code Golf» с использованием простого стеганографического алгоритма на основе ASCII в канале 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
Вы можете видеть, что синий канал просто содержит значения ascii для этого изображения:
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( )
В то время как остальные каналы содержат случайно сгенерированные значения, чтобы «оживить» разнообразие цветов в изображении. При извлечении сообщения обратно из изображения, мы можем просто игнорировать значения других каналов и вытянуть шестнадцатеричный бит в синем канале, восстанавливая строку:
"Programming Puzzles and Code Golf"
Обратите внимание, что пробелы, которые использовались для заполнения строки в квадрате, не включаются в окончательный расшифрованный вывод. Хотя вы должны дополнить строку на изображении, вы можете предположить, что входная строка не будет заканчиваться пробелами.
правила
- Вы должны кодировать 1 символ на пиксель, канал, выбранный для кодирования символа, является произвольным.
- Каналы других цветов RGB должны быть случайными, кроме того, который вы выбираете для кодирования строки; это означает, что ваши окончательные некодированные каналы должны быть между
0x0000-0xFFFF
(случайно выбранными). - Выражение конечного результата в виде двумерного массива значений цвета RGB - это хорошо
0x000000-0xFFFFFF
, нет необходимости использовать создание изображения, если вы не хотите с ним повеселиться или если оно меньше байтов. Если вы решите выводить как шестнадцатеричные строки, добавьте к шестнадцатеричной строке префикс#
EG#FFFFFF
или#05AB1E
. Вы можете разделить вкладками, запятыми или чем-то еще, что будет иметь смысл по горизонтали, но оно должно поддерживать квадратный узор; другими словами, вы должны использовать соответствующее разделение новой строки. - Выходные данные должны быть в квадрате, и строка должна быть дополнена пробелами в конце, чтобы вместить это. Это значит что
N≈SQRT(Input#Length())
. Если длина ввода не является идеальным квадратом, вы должны округлитьN
и дополнить пробелами. - Как указывалось ранее, если вы добавляете пробелы на изображении, вы не должны включать символы дополнения в окончательный «расшифрованный» вывод.
- Вы можете предположить, что:
- Входная строка не будет заканчиваться пробелами.
- Во входной строке будут использоваться только печатные символы ASCII.
- Это код-гольф , выигрывает меньшее количество байт.