激烈的四方密码


17

背景

一百十三年前,业余密码学家FélixDelastelle在四方形密码上发表了他的作品,该密码是一种二位置换密码,它接受25个字母的两个排列作为密钥,并对包含这些字母的消息进行编码。

像大多数纸笔密码一样,四平方密码今天没有任何密码价值,但是在其发明之时,它比其专论密码具有明显的优势。

一百十三年后,爱丽丝·德勒斯特勒(Alice Delastelle)决定通过增加字母的大小和键的数量来改进四格密码。[需要引用]

按键设定

字母包含以下字符(以空格开头):

 !"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ

给定一个密码短语,我们按以下方式构造此字母的排列:

  1. 仅保留每个字符的第一个出现。

  2. 按字母的自然顺序附加字母中未使用的字符。

在将四个密码短语变成四个键之后,我们将每个键分成边长为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.

Answers:


4

CJam,52 50 49 47 46 44字节

l2/qN/'[,32>A,s-f|2/f{~@S+2<.#_7f%_W%.m.m.=}

输入顺序是线5, 2, 3, 1, 4在线尝试

(感谢@MartinBüttner,-1个字节,感谢@ Dennis,-2个字节)

说明

l2/           Read the message and split into chunks of 2
qN/           Read rest of input and split by newlines (pass phrases)
'[,32>        Generate " !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"
A,s-          Remove digits 0123456789
f|            Setwise OR with each pass phrase to remove duplicates, giving keys
2/            Split keys into two pairs
f{ ... }      For each message chunk...
  ~             Unwrap key pairs
  @S+2<         Add a space to the message chunk then cap to length 2
  .#            Find the two chars in keys 1, 4
  _7f%          Copy indices and perform modulo 7 on both
  _W%           Copy and reverse
  .m.m          Vectorised subtraction twice
  .=            Apply both indices to keys 2, 3

对于指数,我们希望交换的至少显著数字,基座7例如,对于第一个例子AL是指数47在分别的键1和4。在基数7中,这是[0 4][1 0]。调换至少显著数字给出[0 0][1 4],即011,并且这对应于PP在分别键2和3。

但是,代码执行以下操作,而不是进行基本转换:

[4 7]     A: Initial indices
[4 0]     B: Indices mod 7
[0 4]     C: Reverse of B

[4 -4]    B-C
[0 11]    A-(B-C)

6

Pyth,74 71字节

L+%eb7*7/hb7Jcms+oxdN{d--CMr33 91`MTd.z2ssm@VeJ,ydy_dCmxLhdedC,hJ.tcz2d

可能会进行很多优化。我使用了很多荏苒的。

按以下顺序输入:

ALICE LOVES BOB.
PROGRAMMING PUZZLES & CODE GOLF
DON'T TELL EVE!!!
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE

我可以窃取您的输入订单提示吗?
Maltysen

@Maltysen当然。
orlp 2015年

4

Pyth- 88 86 83 78 76 75 72字节

@orlp节省了8个字节

Waaay太久了,对此我感到很不满意,但是在我寻找更好的方法处理正方形时将其发布。

Jm+oxdN{d-+d-CMr33 91`MTd.zsms@VtPJ,+*7hKs.DR7xV,hJeJdeK+*7@K2@K1C.tcz2d

在这里在线尝试


您可以替换c+e.z*%le.z2d2C.tce.z2d。不要问:)
orlp 2015年
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.