Mã hóa mật mã Pigpen


11

Mã hóa mật mã Pigpen

Nhiệm vụ của bạn rất đơn giản: viết một chương trình nhận văn bản làm đầu vào và xuất ra bản trình bày ASCII của nó trong Mật mã Pigpen .

Đầu vào

Các ký tự chỉ ASCII (không có Unicode). Bạn phải có khả năng xử lý ít nhất 16384 ký tự và 256 dòng.

Đầu ra

  • Thay thế tất cả các ký tự không phải là dòng mới hoặc trong ABCDEFGHIJKLMNOPQRSTUVWXYZhoặc abcdefghijklmnopqrstuvwxyzbằng dấu cách.
  • Không phân biệt chữ hoa chữ thường, thay thế từng chữ cái bằng dạng được mã hóa của nó (xem phần tiếp theo), chèn một khoảng trắng ở mỗi trong ba dòng sau mỗi dòng. Mỗi ký tự được mã hóa là một khối 3 * 3 của nghệ thuật ASCII. Thay thế không gian bằng 3 * 3 khối không gian.
  • Tất cả các ký tự phải nằm trên ba dòng giống nhau (gọi ba dòng này là một dòng pigpen), trừ khi có một dòng mới, bắt đầu một dòng pigpen mới. Để trống một dòng bình thường giữa các dòng pigpen.

Mật mã

  |       | |       |
 .|       |.|       |.
--+ 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)

Thí dụ

Đầu vào "hEllo, wORLd" sẽ tạo ra:

+-+ +-+ |   |   +--         +-- +-- |   --+
| | | | |.  |.  |.      \./ |.  |.  |.    |
| | +-+ +-- +-- +--      V  +-- |   +-- --+

Mã hóa base64 ở trên, với một dòng mới, bên dưới. Md5sum là 6f8ff1fed0cca4dd0492f9728ea02e7b.

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8
LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW
ICArLS0gfCAgICstLSAtLSsK

Không có dòng mới, md5sum 581005bef7ee76e24c019d076d5b375fvà base64 là:

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8

LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW ICArLS0gfCAgICstLSAtLS

Quy tắc

  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là mã golf. Mã ngắn nhất sẽ thắng.
  • Trong các ngôn ngữ không thể chấp nhận nhiều dòng đầu vào cùng một lúc (ví dụ: JavaScript có prompt()), hãy sử dụng *(hoặc một số ký tự khác) làm dấu tách dòng.

Erranda

  • Ví dụ bị thiếu một vài khoảng trắng (Một khoảng trắng sẽ bao gồm các khoảng trắng ở cuối của ký tự trước, nếu có, chính nó và các khoảng trắng ở cuối của nó). Điều này hiện đã được sửa chữa.

1
Tôi nhớ chơi với nó khi còn bé, nhưng không bao giờ biết tên của nó. Cảm ơn!
Geobits

Tôi có thể sử dụng một phông chữ tùy chỉnh? :-)
Florian F

@FlorianF Không ...

Mã hóa trong javascript. Thường promptđược sử dụng cho đầu vào, nhưng nó chỉ chấp nhận một dòng duy nhất. Tôi có thể sử dụng một char đặc biệt (như '*') để đánh dấu một dòng mới trong đầu vào không?.
edc65

@ edc65 Có, bạn có thể

Câu trả lời:


4

JavaScript (ES6) 312 327 340 372 446

Không tính khoảng trắng thụt đầu dòng và dòng mới - có thể được đánh gôn nhiều hơn . Sử dụng '*' để đánh dấu các dòng mới trong đầu vào, vì promptchấp nhận một dòng duy nhất.

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'))

Thử nghiệm trong bảng điều khiển FireFox / FireBug

Đầu vào: ABCDEFGHI * JKLMNOPQR * STUV * WXYZ * HeLlO WoRlD!

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

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

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

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

+-+ +-+ |   |   +--         +-- +-- |   --+    
| | | | |.  |.  |.      \./ |.  |.  |.    |    
| | +-+ +-- +-- +--      V  +-- |   +-- --+      

Bạn có 5 khoảng cách giữa owtrong "Hello world", OP chỉ có 4
Claudiu

@Claudiu mỗi ký tự (thậm chí trống, char 32) 3 khoảng trắng, dấu phân cách giữa các ký tự 1 khoảng trắng. 1 + 3 + 1 == 5. Tôi sẽ kiểm tra với OP
edc65

Phải, nó chắc chắn có ý nghĩa hơn với 5. Tôi nghĩ rằng anh ấy đặc biệt muốn 4 như một trường hợp đặc biệt, nhưng điều tốt bạn đã hỏi!
Claudiu

3

C # - 921 720

Rõ ràng không phải là một mục chiến thắng, nhưng điều này có vẻ như quá nhiều niềm vui để vượt qua :)

Chương trình lấy đầu vào dưới dạng một, sau đó in pigpen. Để nhập nhiều dòng, sử dụng dấu gạch dưới (_) như đã thấy trong đầu ra .

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();}}

Ý tưởng

Mật mã sử dụng một số chuỗi ký tự được nhân đôi khá nhiều. Ví dụ: '-' hiển thị 16 lần và '__' (hai khoảng trắng) hiển thị 20 lần. Tôi thay thế các chuỗi này bằng các ký hiệu một ký tự và tắt chúng trong thời gian chạy, cắt giảm số lượng ký tự cần thiết để lưu trữ mật mã pigpen làm đôi. Tương tự, một dòng mới thường yêu cầu hai ký tự, nhưng được thay thế bằng ký hiệu (n) và được tắt sau đó.

Chương trình xử lý nhiều dòng đầu vào bằng cách chia đầu vào thành một mảng trong đó mỗi phần tử là một dòng đầu vào. Chương trình sau đó chỉ cần chạy mật mã trên mỗi dòng riêng biệt.

Đây là môn đánh gôn đầu tiên của tôi ở bất kỳ ngôn ngữ nào, vì vậy có lẽ có rất nhiều điều có thể được thực hiện để cải thiện mã này.

Đầu ra

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

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

multi_line_input
--+  /  |    \  +--
 .| <   |.    > |
--+  \  +--  /  |
|   +-- +-+ +-+
|.  |   |.| | |
+-- |   +-+ +-+
+-- +-+ --+  /   \
|   |.|  .| <     >
|   +-+   |  \   /

1
Tôi không biết C #, nhưng dường như có một khoảng trống không cần thiết ở for(int i=0;i<p.Length; i++)(gần giữa)

Cảm ơn professorfish, có một cái khác tôi cũng đã bỏ lỡ
jrbuchner

1
Trong m♥lti \n lin♣e \n input, điện thoại của tôi biểu thị rằng có một trái tim thay vì u trong đa, và một câu lạc bộ giữa n và e thẳng hàng. Tại sao vậy?
Beta Decay

2
@BetaDecay Tôi nghĩ rằng nó được dự định, để hiển thị việc xử lý các ký tự ASCII thấp
edc65

Trái tim và câu lạc bộ đã được đặt ở đó để thể hiện sự tuân thủ quy tắc của các thách thức: Thay thế tất cả các ký tự không phải là dòng mới hoặc trong ABCDEFGHIJKLMNOPQRSTUVWXYZ hoặc abcdefghijklmnopqrstuvwxyz bằng khoảng trắng
jrbuchner

2

Python 2, 180 + 78 + 1 + 3 = 262 ký tự

Chương trình 180 byte (hai dòng mới nhất là các tab):

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

Yêu cầu tệp 78 byte có tên 'f' là cùng một thư mục (+1 byte cho tên tệp), chứa các mục sau:

$ 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

Mã hóa base64 của tệp flà:

eJxTqKnR1dYGIgU4AwF0wQDBiIvRB+GaGgWwSl04A64DKIKKgDpsQBiuQg8GYBwMLQr6MXZgjO4w
oBQOhykohAF1gDCawxBaFADHITNz

Chương trình thoát với một ngoại lệ, 2>_loại bỏ lỗi (+3 byte):

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

Giải thích :

Tôi đã tạo một bảng tra cứu, Llà một ánh xạ {position_in_3x3_block: {letter_being_encrypted: symbol_for_letter_at_position}}, được lưu trữ trong một mảng phẳng. Chương trình in các chữ cái bằng cách tìm kiếm đơn giản cho từng vị trí.


Bạn nên thêm một byte cho fvà ba byte cho2>_

0

Perl 5 -lF , 297 288 261 231 byte

$,=$";$_=' .||.||. ';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''

Hãy thử trực tuyến!

Có lẽ vẫn còn một chút ở đây có thể được chơi gôn hơn nữa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.