背景
一百十三年前,业余密码学家FélixDelastelle在四方形密码上发表了他的作品,该密码是一种二位置换密码,它接受25个字母的两个排列作为密钥,并对包含这些字母的消息进行编码。
像大多数纸笔密码一样,四平方密码今天没有任何密码价值,但是在其发明之时,它比其专论密码具有明显的优势。
一百十三年后,爱丽丝·德勒斯特勒(Alice Delastelle)决定通过增加字母的大小和键的数量来改进四格密码。[需要引用]
按键设定
字母包含以下字符(以空格开头):
!"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ
给定一个密码短语,我们按以下方式构造此字母的排列:
仅保留每个字符的第一个出现。
按字母的自然顺序附加字母中未使用的字符。
在将四个密码短语变成四个键之后,我们将每个键分成边长为7的正方形,并排列四个得到的正方形,以便它们形成一个大正方形。
例如,如果密码短语是
PROGRAMMING PUZZLES & CODE GOLF
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
DON'T TELL EVE!!!
密钥将像这样构造和排列:
PROGAMI POULARI
N UZLES TY CNES
&CDF!"# &DBWG!"
$%'()*+ #$%'()*
,-./:;< +,-./:;
=>?@BHJ <=>?@FH
KQTVWXY JKMQVXZ
CORET H DON'T E
SBAYPL! LV!"#$%
"#$%&'( &()*+,-
)*+,-./ ./:;<=>
:;<=>?@ ?@ABCFG
DFGIJKM HIJKMPQ
NQUVWXZ RSUWXYZ
加密
给定明文消息,例如
ALICE LOVES BOB.
我们附加0或1个空格以使其长度均匀,并将其分成字符对:
["AL" "IC" "E " "LO" "VE" "S " "BO" "B."]
对于每个字符对,我们将第一个字符放在第一个方块中(阅读顺序),第二个字符放置在第四个方块中。
然后,我们选择其余正方形中的字符,以使四个选定的字符形成一个矩形,其边平行于正方形的边。
最后,我们用第二个和第三个正方形的选定字符替换字符对。
对于我们的示例字符串,这将产生
["PP" "A@" "E " "YT" "ZE" "EH" "=T" "<-"]
得到以下密文:
PPA@E YTZEEH=T<-
任务
编写一个程序或函数,该程序或函数接受四个密码短语和一个纯文本,使用上述四方形密码的变体对其进行加密,然后返回所得的密文。
细节:
五个输入字符串将仅由所提及字母的字符组成。
可以按任何顺序读取这五个输入字符串,例如,用换行符分隔的单个字符串或五个字符串的数组。
您可以假定所有字符串都不为空。
输出必须是单个字符串。
如果选择将输出打印到STDOUT,则只能打印密文字符和(可选)尾随换行符。
适用标准代码高尔夫球规则。
测试用例
在所有测试用例中,前四个字符串按读取顺序对应于键平方,最后一个输入字符串对应于明文。
输入项
PROGRAMMING PUZZLES & CODE GOLF
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
DON'T TELL EVE!!!
ALICE LOVES BOB.
输出量
PPA@E YTZEEH=T<-
输入项
!"#$%&'()*+,-./:;<=>
!"#$%&'()*+,-./:;<=>?@ABCDE
!"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKL
!"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRS
HELLO, WORLD!
输出量
LALLR)#TROKE !
输入项
,'K AB-Q=?@("W$>XM).C#<I:G!OLP*+;SZJTU%NED/&VFHRY
:,-D$C<SU=IYHFVA;! JG/M&L+WT%#.Q@(N*R")EZOBKX?'>P
L()JX,BND?Z<>P*FU%=O@&KIC+A!Y:;$SWHR.EMG'/T"QV #-
<->CI")AP Q:+U;O/F(KH&ER!MW?X'VJLZ#.$,BSGN@TD%*Y=
SPIN THE PPCG WHEEL OF BLAME!
输出量
#>TE,VK+,ZQ(&<F@RA.NL@DM%NAC&>
输入项
& %(,-#)$@?/=>'*"<:;!.+
=/$- ?;',@#!(&<")%.:>+*
&%-/<?.;$'#:=!( ,>"+*)@
=,<-*?#.'@/;>%!+:(& ")$
HNRA#JX$H %JAV+"GTS,
输出量
GOOD LUCK, HAVE FUN.