Шифрование Pigpen Cipher

11

Шифрование 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

  • В примере отсутствовали несколько пробелов (пробел должен состоять из завершающих пробелов предыдущего символа, если таковые имеются, самого себя и его собственных пробелов). Теперь это было исправлено.

источник
1
Я помню, как играл с этим в детстве, но никогда не знал названия этого. Спасибо!
Geobits
Могу ли я использовать собственный шрифт? :-)
Флориан Ф
@FlorianF Нет ...
Кодирование в JavaScript. Обычно promptиспользуется для ввода, но он принимает только одну строку. Могу ли я использовать специальный символ (например, '*'), чтобы отметить новую строку в вводе?
edc65
@ edc65 Да, вы можете

Ответы:

4

JavaScript (ES6) 312 327 340 372 446

Не считая отступов и пробелов - можно было бы играть в гольф больше . Использование '*' для пометки новых строк на входе, так как promptпринимает одну строку.

console.log(prompt().split('*').map(s=>
  [0,1,2].map(r=>
  [...s].map(c=>o+=n+
    '   \\1/ \\ /1\\ /  V  ^  1><1 --++-++-- 1||1||1 '.substr(
    (c=(32|c.charCodeAt())-97)<0|c>25?0:c<18
     ?27+3*'330441552030141252033144255'[f=8,c%9*3+r]
     :3*'482630015274'[f=21,c%4*3+r],3,n=' ')
  .replace(1,' .'[r&c>f])
  ,n='\n'),o=''
)&&o).join('\n'))

Тест в консоли FireFox / FireBug

Вход: ABCDEFGHI * JKLMNOPQR * STUV * WXYZ * HeLlO WoRlD!

  | | | |   --+ +-+ +-- --+ +-+ +--
  | | | |     | | | |     | | | |  
--+ +-+ +-- --+ +-+ +--   | | | |  

  | | | |   --+ +-+ +-- --+ +-+ +--
 .| |.| |.   .| |.| |.   .| |.| |. 
--+ +-+ +-- --+ +-+ +--   | | | |  

     \   /   ^ 
\ /   > <   / \
 V   /   \     

     \   /   ^ 
\./  .> <.  /.\
 V   /   \     

+-+ +-+ |   |   +--         +-- +-- |   --+    
| | | | |.  |.  |.      \./ |.  |.  |.    |    
| | +-+ +-- +-- +--      V  +-- |   +-- --+      
edc65
источник
У вас есть 5 пробелов между oи wв «Hello world», у OP только 4
Claudiu
@Claudiu каждый символ (даже пустой, символ 32) 3 пробела, разделитель между символами 1 пробел. 1 + 3 + 1 == 5. Я проверю с OP
edc65
Да, это определенно имеет больше смысла с 5. Я думал, что он специально хотел 4 как особый случай, но хорошо, что вы спросили!
Клавдиу
3

C # - 921 720

Очевидно, что это не победная запись, но это выглядело слишком весело, чтобы выдавать себя :)

Программа принимает ввод как один, а затем печатает свинарник. Чтобы ввести несколько строк, используйте подчеркивание (_), как показано в выводе .

Код

using System;class P{static void Main(){
int i,y,j,k,w,z;string[]g=Console.ReadLine().ToLower().Split('_');
var d="_________  |b .|b--+_| |b|.|b+-+_|  b|. b+--_--+b .|b--+_+-+b|.|b+-+_+--b|. b+--_--+b .|b  |_+-+b|.|b| |_+--b|. b|  _____   b\\./b v _ \\ b .>b / _ / b<. b \\ _ ^ b/.\\b   _  b  b  ".Replace('b','\n').Split('_');
for(i=0;i<d.Length;i++){if(d[i]==""){d[i]=i<17?d[i+9]:d[i+4];d[i]=d[i].Replace('.',' ');}}
for(y=0;y<g.Length;y++){string o="",s,e=g[y];var r=new string[z=e.Length][];
for(i=0;i<z;i++){if(e[i]-97<0|e[i]-97>25)e=e.Replace(e[i],'{');
o+=d[e[i]-97]+'_';r[i]=(o.Split('_')[i].Split('\n'));}
for(j=0;j<3;j++)for(k=0;k<(w=r.Length);k++){
s=r[k][j];Console.Write(k==w-1?s+'\n':s+' ');}}
Console.ReadLine();}}

концепция

Шифр использует несколько последовательностей символов, которые дублируются. Например, «-» отображается 16 раз, а «__» (два пробела) - 20 раз. Я заменяю эти последовательности односимвольными символами и заменяю их во время выполнения, сокращая количество символов, необходимое для хранения шифра со свертками пополам. Точно так же для новой строки обычно требуется два символа, но она заменяется символом (n) и отключается позже.

Программа обрабатывает несколько строк ввода путем разбиения ввода в массив, где каждый элемент представляет собой одну строку ввода. Затем программа просто запускает шифр в каждой строке отдельно.

Это мой первый гольф на любом языке, поэтому, вероятно, многое можно сделать, чтобы улучшить этот код.

Вывод

hEllo,wORLd
+-+ +-+ |   |   +--        +-- +-- |   --+
| | | | |.  |.  |.     \./ |.  |.  |.    |
| | +-+ +-- +-- +--     v  +-- |   +-- --+

code_golf
|   +-- --+ +-+
|   |.    | | |
+-- +-- --+ +-+
--+ +-- |   +--
  | |.  |.  |
  | +-- +-- +--

multi_line_input
--+  /  |    \  +--
 .| <   |.    > |
--+  \  +--  /  |
|   +-- +-+ +-+
|.  |   |.| | |
+-- |   +-+ +-+
+-- +-+ --+  /   \
|   |.|  .| <     >
|   +-+   |  \   /
jrbuchner
источник
1
Я не знаю C #, но, кажется, в for(int i=0;i<p.Length; i++)(около середины) есть ненужный пробел
Спасибо Professorfish, был еще один, который я тоже пропустил
jrbuchner
1
Во- m♥lti \n lin♣e \n inputпервых, мой телефон показывает, что в мульти есть сердце, а не ты, а в линии между n и e. Это почему?
бета-распад
2
@BetaDecay Я думаю, что это предназначено, чтобы показать обработку низких символов ASCII
edc65
Сердце и клуб были помещены туда, чтобы продемонстрировать соответствие правилу испытаний: заменить всех персонажей, которые не являются новыми строками или в ABCDEFGHIJKLMNOPQRSTUVWXYZ или abcdefghijklmnopqrstuvwxyz пробелами
jrbuchner
2

Python 2, 180 + 78 + 1 + 3 = 262 символа

180-байтовая программа (последние две строки являются вкладками):

L=open('f','rb').read().decode('zip')
while 1:
 n=raw_input()
 for s in(0,3,6):
    for c in n:w=ord(c.lower())-97;print''.join(L[w+(s+i)*26]for i in(0,1,2))if-1<w<27 else'  ',
    print

Требуется 78-байтовый файл с именем 'f' для того же каталога (+1 байт для имени файла), который содержит следующее:

$ hexdump f
0000000 9c78 a853 d1a9 d6d5 2206 3805 0103 c174
0000010 c100 8b88 07d1 9ae1 051a 4ab0 385d ae03
0000020 2803 8a82 3a80 406c ae18 0f42 6006 0c1c
0000030 0a2d 31fa 6076 ee8c a030 0e14 2987 8428
0000040 7501 3080 c39a 5a10 0014 21c7 7333
000004e

Кодировка base64 файла f:

eJxTqKnR1dYGIgU4AwF0wQDBiIvRB+GaGgWwSl04A64DKIKKgDpsQBiuQg8GYBwMLQr6MXZgjO4w
oBQOhykohAF1gDCawxBaFADHITNz

Программа выходит с исключением, 2>_подавляет ошибку (+3 байта):

$ echo "hEllo,wORLd" | python pigpen.py 2>_| ./md5.py
7ed49b7013a30cc3e84aa807f6585325

Пояснение :

Я создал справочную таблицу, Lкоторая представляет собой отображение {position_in_3x3_block: {letter_being_encrypted: symbol_for_letter_at_position}}, хранящееся в плоском массиве. Программа печатает буквы, выполняя простой поиск каждой позиции.

Клаудиу
источник
Вы должны добавить один байт для fи три байта для2>_
0

Perl 5 -lF , 297 288 261 231 байт

$,=$";$_=' .||.||. ';chomp@F;map{@r=/.../g;say map{/[a-z]/i?$r[-65+ord uc]:$"x3}@F}(y/./ /r.y/.| /-+-/r x2)x2 .'    \\  /  ^ 'x2,y/./ /r x3 .$_ x3 .'\\ /  ><  / \\\\./ .><. /.\\',(y/.| /-+-/r x2 .y/./ /r)x2 .' V  /  \\    'x2;say''

Попробуйте онлайн!

Здесь, вероятно, еще есть что-то, что могло бы сыграть в гольф дальше.

Xcali
источник