Count Mathias Sandorf 是 Jules Verne 笔下的英雄,他通过一张硬卡片上的密钥来加密 Trieste 的反叛者们传递的消息。这个密钥是一个 6x6 的网格,其中有一些格子被挖空了。在图 1 中这些被挖空的格子已经已经标记成了白色。在卡片的一端有个缺口作为标记。空白的消息是编码为空字符串的,而非空白的消息则按照下面的 Sandorf 算法加密:
Figure 1: Sandorf's cipher key
-
如果一行信息的长度不是 36 的整数倍,就在这行信息的后面添加 `#' 直到其长度是 36 的倍数,然后将此行信息翻转。通常情况下,原始的信息其结尾不会是 #,但在信息的中间有可能会包含 #。例如,下面的消息
Real Programmers use Fortran. Quiche Eaters use Pascal.
包含了 55 个字符,因此应当在其末尾添加 17 个空格。在第一部之后,该消息成为如下的样子:
#################.lacsaP esu sretaE ehciuQ .nartroF esu sremmargorP laeR
-
将密钥放在一张纸上,缺口向上。
-
将信息中的下面 9 个字符(第一次是头 9 个字符)通过密钥上的小孔写到纸上,从左向右、从上向下,每个小孔中写一个字符。
-
将密钥顺时针旋转 90 度并重复第三步开始的动作,直到密钥返回到其起始的位置(缺口向上)。这样就可以得到一个 6x6 的字符矩阵,我们将其称为coded group。
-
重复从第 2 步开始执行直到所有的信息都复制到 coded group 中。然后将每一个 coded group 中的字符从第一行到最后一行顺序展开。例如,对于上面的信息,会形成如下的两个 coded group
u#l# # geuhoc
as#r## raPir
ec##st sutrl
##aa## rQae o
EP# ## emFR .
#e#s. meanrs将它们连接在一起,就会形成最后的加密信息:
u#l# #as#r##ec##st##aa##EP# ## #e#s.geuhoc raPir sutrlrQae oemFR .meanrs
Input and Output
编写一个程序对使用 Sandorf 算法加密的程序进行解密。输入的加密信息分成很多行,每行一条。每行的长度都有可能是不同的,但不会超过 108 个字符。在一行当中,除了换行符以外的所有字符都是加密信息的一部分。在输出时,每行输出一条解密信息。将上述信息解密可以得到如下的结果:
Real Programmers use Fortran. Quiche Eaters use Pascal.
Sample Input
irdetn ihtoteao pesms soiaCet snaoi
#e#r# edt#aasdrtltn ca reyor feneiv
o#kginasksoaemlt f odatrnip as ene
w#lerhiomfte t rSp se ntt.is id,raal
o#r#i#etbanagvareioml nbfooheo lny
e# #s#holp#lpt#iiok# w#so ts.tiis h
H### ##d#l##a####n##o)##Dg#(##i#n#o#
Sample Output
Competition is a disease that sooner
or later infects every trade and
profession and makes it take a long
step forward. Still, it remains the
obligation of every honorable man
to oppose it with his skills.
(Donald Honig)