MATL、70バイト(合計)
f'(.{'iV'})(.{1,'2GqqV'})'5$h'$1'0'$2'0K$hYX2Get2LZ)P2LZ(!tg)i?&S]1Gw)
MATL Onlineで
試す複数のテストケースを試す
3番目の入力としてフラグを取り、F
文字列を暗号化し、T
解読します(そのアイデアを提供してくれたKevin Cruijssenに感謝し ます)。
これは、特に解読のために、厳密なタイピングが邪魔になりすぎていることに気づくまで、ジュリアの答えとして始まりました。これが暗号化のために持っていたJuliaコードです(TIOのv0.6にバックポートされました)。
!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文字を読み取って、ダミー値(null)で接頭辞と接尾辞を付けてから、r文字を再度読み取るなど、毎回新しい列を作成すると見なすことができます。
F.A.Z.
OBRAQX
O.B.U.
次に、2番目の列ごとに反転し(ジグザグのザグ部分が下ではなく上に移動するため、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