MATL,总共70个字节
f'(.{'iV'})(.{1,'2GqqV'})'5$h'$1'0'$2'0K$hYX2Get2LZ)P2LZ(!tg)i?&S]1Gw)
在MATL Online上
尝试尝试多个测试案例
将标志用作第三输入,F
以加密字符串,T
以解密字符串(感谢 Kevin Cruijssen的想法)。
这开始是一个茱莉亚的答案,直到我意识到严格的打字方式(尤其是对于解密而言)妨碍了太多。这是我用于加密的Julia代码(向TIO移植到v0.6):
朱莉娅 0.6,191字节
!M=(M[2:2:end,:]=flipdim(M[2:2:end,:],2);M)
s|n=replace(String((!permutedims(reshape([rpad(replace(s,Regex("(.{$n})(.{1,$(n-2)})"),s"\1ø\2ø"),length(s)*n,'ø')...],n,:),(2,1)))[:]),"ø","")
在线尝试!
说明:
围栏操作
F . . . A . . . Z . . . .
O . B . R . A . Q . X
O . . . B . . . U
可以看作是读取r = 3个字符的输入,然后读取r-2个字符,并给它们加上虚拟值(空值)作为前缀和后缀,然后再次读取r个字符,依此类推,每次创建一个新列:
F.A.Z.
OBRAQX
O.B.U.
然后反转第二列(因为之字形的zag部分上升而不是下降,这在r> 3时有所不同),然后沿行读取此矩阵,并删除伪字符。
解密似乎没有任何明显的模式,但是在四处寻找时,我遇到了这篇文章,它告诉我(a)这是一种众所周知的(可能是?)公开的密码算法,并且( b)解密是对同一方法的简单重用,给它提供字符串的索引,并在加密后获得那些索引的索引,并在那些位置读取密文。
由于解密需要通过处理索引来完成,因此该代码也通过对字符串的索引进行排序来进行加密,然后在这种情况下,只需对那些重新排列的索引进行索引即可。
% implicit first input, say 'FOOBARBAZQUX'
f % indices of input string (i.e. range 1 to length(input)
'(.{'iV'})(.{1,'2GqqV'})'5$h
% Take implicit second input, say r = 3
% Create regular expression '(.{$r})(.{1,$(r-2)})'
% matches r characters, then 1 to r-2 characters
% (to allow for < r-2 characters at end of string)
'$1'0'$2'0K$h % Create replacement expression, '$1\0$2\0'
YX % Do the regex replacement
2Ge % reshape the result to have r rows (padding 0s if necessary)
t2LZ) % extract out the even columns of that
P % flip them upside down
2LZ( % assign them back into the matrix
! % transpose
tg) % index into the non-zero places (i.e. remove dummy 0s)
i? % read third input, check if it's true or false
&S] % if it's true, decipherment needed, so get the indices of the
% rearranged indices
1Gw) % index the input string at those positions