Стеганографические площади
Ваша задача - взять строку и сгенерировать 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.
- Это код-гольф , выигрывает меньшее количество байт.
источник
Ответы:
05AB1E , 34 + 12 = 46 байт
Использует красный канал.
05AB1E использует CP-1252 кодировку .
Encode:
Попробуйте онлайн!
Decode:
Попробуйте онлайн!
Альтернативный метод заполнения с равным количеством байтов
источник
C, 201 (кодирование) + 175 (декодирование) = 376 байтов
Кодировать:
Кодирует каждый символ входной строки в зеленом канале спектра RGB, устанавливая два других канала в качестве случайных шестнадцатеричных значений. Принимает ввод через STDIN в виде строки и выводит в STDOUT многострочную строку шестнадцатеричного цветового кода в форме квадрата. Предполагая, что у вас установлены Python 3 и ImageMagick, и указанный выше файл скомпилирован в файл с именем
a.out
в текущем рабочем каталоге (CWD), вы можете напрямую получить результирующий образ с именемOutput.png
CWD из текстового вывода с помощью следующей команды:Вот пример выходного изображения, созданного вышеуказанной запятой с использованием
Programming Puzzles and Code Golf
в качестве входной строки:Расшифровать:
Принимает через STDIN последовательность строк шестнадцатеричного кода цвета, разделенных пробелами, каждая из которых заключена в двойные кавычки (
"
) (char** argv
inmain
), а также, когда вызываетсяmain
,int argc
для целочисленного ввода. Выводит в STDOUT одну / многострочную строку, представляющую декодированное сообщение.Я буду стараться играть в гольф с течением времени, когда и где только смогу.
Кроме того, если вы используете оба метода в одном и том же файле, вы можете использовать следующий
main
метод, чтобы сложить все вместе, чтобы каждая функция получала правильные входные данные:и используя это, для кодирования вы должны предоставить
E
в качестве первого аргумента вызов метода кодирования, за которым следует однострочный аргумент, тогда как для декодирования все, что вам нужно предоставить, - это последовательность разделенных пробелами строк шестнадцатеричного цветового кода, каждая из которых заключена в двойные кавычки ("
).Наконец, если вы хотите, вы можете получить полностью подготовленную, готовую к использованию версию здесь , хотя она не имеет отношения к игре, но также не выводит никаких предупреждений или ошибок при компиляции.
источник
Python 2,
164160 +9493 = 253 байтаСохранено 1 + 1 байт благодаря Wheat Wizard.
-5 байт благодаря Kade
Кодировщик: строка должна быть заключена в кавычки, например
"CodeGolf"
, вывод представляет собой цветное изображение ascii PPM.Декодер: принимает входное имя файла в качестве аргумента командной строки
Использование:
Пример:
Пазлы для программирования и Code Golf
Lorem Ipsum Dolor Sit Amet, Contetur Sadipscing Elitr, Sed Diam Nonumy Eirmod Tempor Invidunt UT Labore et Dolore Magna Aliquyam Erat, Sed Diam Volptua. В vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, нет моря Такимата святилище Есть Lorem Ipsum Долор Сит Амет. Lorem Ipsum Dolor Sit Amet, Contetur Sadipscing Elitr, Sed Diam Nonumy Eirmod Tempor Invidunt UT Labore et Dolore Magna Aliquyam Erat, Sed Diam Volptua. В vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, нет моря Такимата святилище Есть Lorem Ipsum Долор Сит Амет.
источник
for
int
из этого получается 4, которое затем+1
-1
.print
и'
в декодере. Я также уверен, что вы моглиint((len(s)+1)**.5)
бы сэкономить несколько байтов.' '.join("%d %d %d"
на,''.join(3*"%d "
так как я почти уверен, что завершающий пробел в порядке.Scala, 97 + 68 = 165 байт
Шифрование (97 байт):
Принимает строку и повторно запускает итератор последовательностей целых чисел.
Расшифровка (68 байт):
Принимает итератор последовательностей целых чисел и возвращает строку.
Объяснение:
,
источник
Perl, (103 + 1) + (36 + 2) = 142 байта
Кодер текста в изображение (выполняется с
-p
1-байтовым штрафом;-p0
(для дополнительного байта штрафов) необходим, если вы хотите обрабатывать переводы строки во входной строке):Декодер изображения в текст (работает с
-p0
2-байтовым штрафом):При этом используется
#abcdef
текстовый формат изображения и кодируется синим каналом. Вот пример возможного вывода, заданногоProgramming Puzzles and Code Golf
в качестве ввода:Объяснение кодера:
Я был действительно счастлив, что это использование
\K
сработало; он указывает, где заменить, и помещая его в цикл, кажется, что вхождение в последнюю итерацию цикла имеет значение. Таким образом,s/(.*?\K,){$a}/\n/g
будет соответствовать строка минимальной длины в виде любой запятой, любой запятой ... любой запятой, которая имеет$a
запятые, но фактически замененная часть совпадения будет просто последней запятой. Это имеет эффект замены каждого$a
запятой на новую строку, давая нам квадратную форму для изображения.Большим преимуществом Perl для этой задачи (кроме встроенного символьно-шестнадцатеричного преобразователя строки, что было невероятно удобно) является то, что он имеет очень короткий декодер (настолько короткий, что, хотя в Perl есть встроенная функция для преобразование шестнадцатеричного в строку, это было короче, чтобы не использовать его). Вот как это работает:
Единственными экземплярами двух символов непосредственно перед не алфавитно-цифровым символом являются синие каналы (которые мы хотим распаковать), которые появляются непосредственно перед запятыми и символами новой строки; и два символа, которые появляются друг перед
#
другом, чем первый. Мы не хотим последней категории совпадений, но они неизбежно перекрывают первую категорию и, таким образом, будут исключены проверкой перекрывающихся совпадений.источник
MySQL, 438 + 237 = 675 байт
В конце выходных данных есть завершающая новая строка, но она не отображается после расшифровки. Шестнадцатеричная функция (целочисленная перегрузка) отсекает начальные 0, поэтому мне пришлось заполнить ее строкой 0. Я мог бы сохранить несколько байтов, если бы мог объявить обе функции между разделителями.
шифровать
Расшифровать
Использование:
источник
C #, 312 + 142 = 454 байта
Кодирование:
Декодирование:
Полная программа:
источник
Mathematica, 111 + 65 = 176 байт
кодировщик
дешифратор
источник
Обработка,
220209194 +171167151 =391380376361345 байтОбновить:
Удалены бесполезны
noStroke()
и сделаны оба цикла for-statementers.Удалено бесполезно
image(p,0,0);
, расшифровщик дал имя файла в качестве параметраАлгоритм шифрования
Вызов функции:
g("Programming Puzzles and Code Golf");
Это функция, которая принимает строку и создает вывод, прежде чем сохранить его как
t.png
. Он используетred
значение для хранения скрытого текста.Алгоритм дешифрования
Вызов функции по:
u(file_name);
Это также функция, которая ищет изображение, указанное в параметре, а затем выводит скрытую строку (поскольку она короче, чем возвращение строки).
Расширенный код
(Алгоритм шифрования)
Строка передается при вызове функции. Первая строка функции вычисляет длину стороны квадрата, беря
ceil
его квадратный корень. Затем мы вводим цикл for, в котором мы устанавливаемstroke
(цвет края), чтобы значение ASCII символа было красным, а случайные значения - синим и зеленым. После этого мы создаемrect
(прямоугольник) с шириной =1
и высотой =1
, то есть пикселем (по какой-то странной причине я не могу использоватьpoint
правильно). В последней строке полученное изображение затем сохраняется какt.png
.(Алгоритм расшифровки)
Эта функция имеет имя файла в качестве параметра (в виде строки). Затем изображение в файле сохраняется в переменной для последующего использования. После того, как мы закончили с этим, мы устанавливаем строку
""
вместо того, чтобы создавать новую строку просто для хранения скрытой строки. Затем мы перебираем изображение через два вложенных цикла for и добавляем в строку символьное значение красного значения пикселя. Наконец, мы печатаем полученную строку после удаления начальных пробелов из нее (используя регулярное выражение). Причина, по которой мы печатаем скрытый текст, а не возвращаем его, заключается в том, что таким образом он короче и мы сохраняем байты.Зашифрованный текст запроса:
источник
Желе, 40 + 20 = 60 байт в кодовой странице желе
Кодировщик (текст → изображение):
Попробуйте онлайн!
Декодер (изображение → текст):
Попробуйте онлайн!
Пример вывода, который может выдать программа (она хранит информацию в красном канале):
В этих более сложных задачах краткость Jelly начинает немного уменьшаться, требуя нескольких «структурных» символов для разрешения разборов, но, тем не менее, все еще очень краткая. Вот как работает кодировщик:
А вот как работает декодер:
источник