Pigpen密码加密


11

Pigpen密码加密

您的任务很简单:编写一个程序来接收文本作为输入并在Pigpen Cipher中输出文本的ASCII表示。

输入值

仅ASCII(无Unicode)字符。您必须至少能够处理16384个字符和256行。

输出量

  • 将所有不是换行符的字符替换为换行符ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz用空格替换。
  • 不区分大小写,将每个字母替换为其加密形式(请参阅下一节),在每行之后的三行中的每行后面插入一个空格。每个编码的字符都是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编码以及结尾的新行在下面。md5sum为6f8ff1fed0cca4dd0492f9728ea02e7b

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8
LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW
ICArLS0gfCAgICstLSAtLSsK

如果没有尾随新行,则md5sum为581005bef7ee76e24c019d076d5b375f,而base64为:

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8

LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLS​​ArLS0gICAgICBW ICArLS0gfCAgICstLS​​AtLSs =

规则

  • 禁止出现标准漏洞
  • 这是代码高尔夫。最短的代码获胜。
  • 在不能一次接受多行输入的语言(例如,带有的JavaScript prompt())中,请使用*(或其他一些字符)作为行分隔符。

埃兰达

  • 该示例缺少一些空格(空格应由前一个字符的尾部空格(如果有的话)本身以及其自己的尾部空格组成)。现在,此问题已得到解决。

1
我记得小时候曾玩过这个游戏,但从未知道它的名字。谢谢!
Geobits 2014年

我可以使用自定义字体吗?:-)
Florian F

@FlorianF No ...

用javascript编码。通常prompt用于输入,但仅接受一行。我可以使用特殊字符(如“ *”)在输入中标记新行吗?
edc65 2014年

@ edc65是的,您可以

Answers:


4

JavaScript(ES6)312327340372446

不算缩进空格和换行符-可能会更多。使用'*'标记输入中的新行,因为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  +-- |   +-- --+      

在“ Hello world”中,o和之间有5个空格w,OP只有4个
Claudiu 2014年

@Claudiu每个字符(偶数空白,字符32)3个空格,字符1个空格之间的分隔符。1 + 3 + 1 ==5。我将检查OP
edc65

是的,使用5绝对更有意义。我想他特别希望4作为特例,但是您问的好东西!
Claudiu 2014年

3

C# - 921 720

显然不是获奖作品,但这看起来实在太有趣了,无法冒充:)

程序将输入作为单个输入,然后打印猪笼草。要输入多行,请使用下划线(_),如output所示

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 2014年

1
在中m♥lti \n lin♣e \n input,我的电话将其表示为多心,而不是u,并且在n和e之间排成一线。这是为什么?
Beta Decay

2
@BetaDecay我认为是要显示低ASCII字符的处理
edc65

心脏和
棍棒

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

需要一个称为“ f”的78字节文件位于同一目录(文件名+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中 -lF297个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''

在线尝试!

这里可能还有更多可以打高尔夫的地方。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.