การเข้ารหัสตัวเลข Pigpen


11

การเข้ารหัสตัวเลข Pigpen

ภารกิจของคุณเป็นเรื่องง่าย: การเขียนโปรแกรมที่ได้รับข้อความที่เป็น input และเอาท์พุทเป็นตัวแทนของ ASCII ในหมูธรรมดา

อินพุต

ASCII เท่านั้น (ไม่มี Unicode) อักขระ คุณต้องสามารถจัดการอย่างน้อย 16384 ตัวอักษรและ 256 บรรทัด

เอาท์พุต

  • แทนที่อักขระทั้งหมดที่ไม่ใช่บรรทัดใหม่หรือในABCDEFGHIJKLMNOPQRSTUVWXYZหรือabcdefghijklmnopqrstuvwxyzด้วยช่องว่าง
  • เปลี่ยนตัวอักษรแต่ละตัวให้เป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ (ดูหัวข้อถัดไป) แทรกช่องว่างต่อท้ายในสามบรรทัดหลังละบรรทัด อักขระที่เข้ารหัสแต่ละตัวเป็นบล็อก 3 * 3 ของศิลปะ ASCII แทนที่ช่องว่างด้วยช่องว่าง 3 * 3 บล็อก
  • อักขระทุกตัวควรอยู่ในสามบรรทัดเดียวกัน (เรียกทั้งสามบรรทัดนี้ว่า pigpen-line) ยกเว้นว่าจะมีบรรทัดใหม่ซึ่งจะเริ่มบรรทัด pigpen ใหม่ เว้นบรรทัดบรรทัดว่างไว้ระหว่าง pigpen-lines

รหัส

  |       | |       |
 .|       |.|       |.
--+ 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 ของด้านบนมีบรรทัดใหม่ต่อท้ายอยู่ด้านล่าง md5sum 6f8ff1fed0cca4dd0492f9728ea02e7bคือ

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8
LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW
ICArLS0gfCAgICstLSAtLSsK

หากไม่มีบรรทัดใหม่ที่ต่อท้าย md5sum คือ581005bef7ee76e24c019d076d5b375fและ base64 คือ:

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8

LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBL ICArLS0gfCAgICStLSA

กฎระเบียบ

  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือรหัสกอล์ฟ รหัสที่สั้นที่สุดชนะ
  • ในภาษาที่ไม่สามารถรับอินพุตได้หลายบรรทัดในแต่ละครั้ง (เช่น JavaScript ด้วยprompt()) ให้ใช้*(หรืออักขระอื่น ๆ ) เป็นตัวคั่นบรรทัด

Erranda

  • ตัวอย่างหายไปสองสามช่องว่าง (ช่องว่างควรประกอบด้วยช่องว่างต่อท้ายของอักขระก่อนหน้าถ้ามีตัวเองและช่องว่างต่อท้ายของตัวเอง) สิ่งนี้ได้ถูกแก้ไขแล้ว

1
ฉันจำได้ว่าเล่นกับเด็กคนนี้ แต่ไม่เคยรู้ชื่อของมันเลย ขอบคุณ!
Geobits

ฉันสามารถใช้แบบอักษรที่กำหนดเองได้หรือไม่? :-)
Florian F


การเข้ารหัสใน 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ใน "Hello world" OP มีเพียง 4
Claudiu

@Claudiu อักขระแต่ละตัว (เว้นว่างแม้แต่อักขระ 32 ตัว) 3 ช่องว่างคั่นระหว่างตัวอักษร 1 ช่อง 1 + 3 + 1 == 5. ฉันจะตรวจสอบกับ OP
edc65

ใช่แล้วมันสมเหตุสมผลมากขึ้นกับ 5. ฉันคิดว่าเขาต้องการ 4 เป็นกรณีพิเศษ แต่สิ่งที่ดีที่คุณถาม!
Claudiu

3

C # - 921 720

เห็นได้ชัดว่าไม่ใช่รายการที่ชนะ แต่ดูเหมือนจะสนุกมากเกินไปที่จะผ่าน :)

โปรแกรมรับอินพุตเป็นตัวเดียวแล้วพิมพ์ pigpen หลายเส้นที่นำเข้าใช้ขีดล่าง (_) เท่าที่เห็นในการส่งออก

รหัส

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++)(ใกล้กลาง)

ขอบคุณ 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 byte สำหรับชื่อไฟล์) ซึ่งมีสิ่งต่อไปนี้:

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

ลองออนไลน์!

อาจจะยังมีอยู่บ้างที่นี่ที่สามารถตีกอล์ฟต่อไปได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.