Шифрование Pigpen Cipher
Ваша миссия проста: написать программу, которая получает текст в качестве входных данных и выводит его ASCII-представление в Pigpen Cipher .
вход
Только для ASCII (без Unicode) символов. Вы должны уметь обрабатывать не менее 16384 символов и 256 строк.
Вывод
- Замените все символы, которые не являются новыми строками или в
ABCDEFGHIJKLMNOPQRSTUVWXYZ
илиabcdefghijklmnopqrstuvwxyz
с пробелами. - Не учитывая регистр, замените каждую букву зашифрованной формой (см. Следующий раздел), вставляя в конце каждой из трех строк после каждой пробел. Каждый закодированный символ представляет собой блок 3 * 3 искусства ASCII. Замените пробелы с 3 * 3 блоков пробелов.
- Все символы должны быть в одних и тех же трех строках (назовите эти три строки одной линией ввода), если только не существует новой строки, которая начинается новой линией ввода. Оставьте нормальную строку пустой между линиями.
Шифр
| | | |
.| |.| |.
--+ for J +-+ for K +-- for L
--+ +-+ +--
.| |.| |.
--+ for M +-+ for N +-- for O
--+ +-+ +--
.| |.| |.
| for P | | for Q | for R
(ABCDEFGHI are the same as JKLMNOPQR, but with the . replaced by a space)
\./
V for W (note the row of 3 spaces on the top)
^
/.\ for Z (note the 3 spaces on the bottom)
\
.>
/ for X (note the leading spaces)
/
<.
\ for Y (note extra trailing spaces)
(STUV are like WXYZ, but with the . replaced by a space)
пример
Ввод "hEllo, wORLd" должен произвести:
+-+ +-+ | | +-- +-- +-- | --+
| | | | |. |. |. \./ |. |. |. |
| | +-+ +-- +-- +-- V +-- | +-- --+
Кодировка base64 выше, с завершающей новой строкой, ниже. Сумма md5 есть 6f8ff1fed0cca4dd0492f9728ea02e7b
.
Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8
LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW
ICArLS0gfCAgICstLSAtLSsK
Без завершающей новой строки md5sum - это, 581005bef7ee76e24c019d076d5b375f
а base64 - это:
Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8
LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW ICArLS0gfCAgICstLSAtLSs =
правила
- Стандартные лазейки запрещены.
- Это код гольф. Самый короткий код выигрывает.
- В языках, которые не могут принимать несколько строк ввода одновременно (например, JavaScript с
prompt()
), используйте*
(или какой-либо другой символ) в качестве разделителя строк.
Erranda
- В примере отсутствовали несколько пробелов (пробел должен состоять из завершающих пробелов предыдущего символа, если таковые имеются, самого себя и его собственных пробелов). Теперь это было исправлено.
prompt
используется для ввода, но он принимает только одну строку. Могу ли я использовать специальный символ (например, '*'), чтобы отметить новую строку в вводе?Ответы:
JavaScript (ES6) 312
327 340 372 446Не считая отступов и пробелов
- можно было бы играть в гольф больше. Использование '*' для пометки новых строк на входе, так какprompt
принимает одну строку.Тест в консоли FireFox / FireBug
Вход: ABCDEFGHI * JKLMNOPQR * STUV * WXYZ * HeLlO WoRlD!
источник
o
иw
в «Hello world», у OP только 4C # -
921720Очевидно, что это не победная запись, но это выглядело слишком весело, чтобы выдавать себя :)
Программа принимает ввод как один, а затем печатает свинарник. Чтобы ввести несколько строк, используйте подчеркивание (_), как показано в выводе .
Код
концепция
Шифр использует несколько последовательностей символов, которые дублируются. Например, «-» отображается 16 раз, а «__» (два пробела) - 20 раз. Я заменяю эти последовательности односимвольными символами и заменяю их во время выполнения, сокращая количество символов, необходимое для хранения шифра со свертками пополам. Точно так же для новой строки обычно требуется два символа, но она заменяется символом (n) и отключается позже.
Программа обрабатывает несколько строк ввода путем разбиения ввода в массив, где каждый элемент представляет собой одну строку ввода. Затем программа просто запускает шифр в каждой строке отдельно.
Это мой первый гольф на любом языке, поэтому, вероятно, многое можно сделать, чтобы улучшить этот код.
Вывод
источник
for(int i=0;i<p.Length; i++)
(около середины) есть ненужный пробелm♥lti \n lin♣e \n input
первых, мой телефон показывает, что в мульти есть сердце, а не ты, а в линии между n и e. Это почему?Python 2, 180 + 78 + 1 + 3 = 262 символа
180-байтовая программа (последние две строки являются вкладками):
Требуется 78-байтовый файл с именем 'f' для того же каталога (+1 байт для имени файла), который содержит следующее:
Кодировка base64 файла
f
:Программа выходит с исключением,
2>_
подавляет ошибку (+3 байта):Пояснение :
Я создал справочную таблицу,
L
которая представляет собой отображение{position_in_3x3_block: {letter_being_encrypted: symbol_for_letter_at_position}}
, хранящееся в плоском массиве. Программа печатает буквы, выполняя простой поиск каждой позиции.источник
f
и три байта для2>_
Perl 5
-lF
,297 288 261231 байтПопробуйте онлайн!
Здесь, вероятно, еще есть что-то, что могло бы сыграть в гольф дальше.
источник