Шифрування Pippen Cipher


11

Шифрування Pippen Cipher

Ваша місія проста: написати програму, яка отримує текст як вхідний і виводить ASCII уявлення про нього в шифр Pigpen .

Вхідні дані

Символи, що містять лише 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  +-- |   +-- --+

Базове кодування вищезазначених, з новим наступним рядком, знаходиться нижче. Md5sum є 6f8ff1fed0cca4dd0492f9728ea02e7b.

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8
LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW
ICArLS0gfCAgICstLSAtLSsK

Без нового рядка, md5sum є, 581005bef7ee76e24c019d076d5b375fа base64 є:

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8

LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW ICArLS0gfCAgICstLSAtLSs =

Правила

  • Стандартні лазівки заборонені.
  • Це код гольфу. Найкоротший код виграє.
  • У мовах, які не можуть приймати декілька рядків введення одночасно (наприклад, JavaScript з prompt()), використовуйте *(або якийсь інший символ) як роздільник рядків.

Ерранда

  • У прикладі бракувало декількох пробілів (Пробіл повинен складатися з проміжків проміжків попереднього символу, якщо вони є, та власних пробілів). Зараз це було виправлено.

1
Я пам’ятаю, як грала з цим у дитинстві, але ніколи не знала його назви. Дякую!
Геобіт

Чи можна використовувати спеціальний шрифт? :-)
Флоріан Ф

@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  +-- |   +-- --+      

У вас 5 пробілів між oі wв "Привіт, світ", в ОП є лише 4
Клавдіу

@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
--+  /  |    \  +--
 .| <   |.    > |
--+  \  +--  /  |
|   +-- +-+ +-+
|.  |   |.| | |
+-- |   +-+ +-+
+-- +-+ --+  /   \
|   |.|  .| <     >
|   +-+   |  \   /

1
Я не знаю C #, але, здається, в for(int i=0;i<p.Length; i++)(біля середини) є зайвий простір

Спасибі
profesorfish

1
У m♥lti \n lin♣e \n inputмоєму телефоні видно, що як серце замість u у мульти, так і клуб між 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''

Спробуйте в Інтернеті!

Тут, мабуть, ще є трохи, що можна було б пограти в гольф далі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.