Стеганографічні квадрати
Ваше завдання - взяти рядок і створити NxN
зображення, що представляє цю рядок. Ви також повинні записати алгоритм, який бере зображення і перетворює його назад у рядок. Оцінка буде включати в себе кількість байтів обох алгоритмів:
Алгоритм "Шифрування" + Алгоритм "Розшифрування" .
Ви повинні розміщувати кожен окремо, з байтовими підрахунками як алгоритмів шифрування, так і дешифрування, що відображаються окремо.
Приклад алгоритму
Наприклад, ось "Головоломки програмування та кодовий гольф", використовуючи простий стеганографічний алгоритм на основі ASCII на каналі "Синій":
#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.
- Це кодовий гольф , виграє найменший байт.