MATL, 70 bayt (toplam)
f'(.{'iV'})(.{1,'2GqqV'})'5$h'$1'0'$2'0K$hYX2Get2LZ)P2LZ(!tg)i?&S]1Gw)
MATL Online'da deneyin Birden fazla test senaryosunu
deneyin
F
Dize T
şifresini çözmek , deşifre etmek için üçüncü girdi olarak bir bayrak alır ( bu fikir için Kevin Cruijssen'e teşekkürler ).
Bu, özellikle deşifre olmak için katı yazmanın çok fazla yol aldığını anlayana kadar Julia'nın cevabı olarak başladı. Şifreleme için sahip olduğum Julia kodu (TIO için v0.6'ya aktarıldı):
!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)))[:]),"ø","")
Çevrimiçi deneyin!
Açıklama:
Raylı çit operasyonu
F . . . A . . . Z . . . .
O . B . R . A . Q . X
O . . . B . . . U
r = 3 giriş karakterinin okunması, ardından r-2 karakterlerinin okunması ve kukla değerlerle (null) ön eklenmesi ve son eklenmesi, ardından r karakterlerinin okunması vb. her seferinde yeni bir sütun oluşturularak görülebilir:
F.A.Z.
OBRAQX
O.B.U.
daha sonra her ikinci sütunu ters çevirir ( zigzagın zag kısmı aşağı yerine yükselir, bu da r> 3 olduğunda bir fark yaratır), daha sonra bu matrisi satırlar boyunca okur ve kukla karakterleri kaldırır.
Deşifre, bunun gibi bariz bir örüntüye sahip gibi görünmüyordu, ancak bu konuda etrafa bakarken , (a) bunun demiryolu şifreleri için iyi bilinen ve (muhtemelen?) Yayınlanmış bir algoritma olduğunu ve ( b) deşifre, aynı yöntemin basit bir şekilde yeniden kullanılmasıydı, ona dizenin indekslerini verdi ve şifrelemeden sonra bu indekslerin indekslerini aldı ve bu yerlerde şifreleme metnini okudu.
Deşifre, indeksler üzerinde çalışarak bir şeyler yapmak gerektiğinden, bu kod dizenin indekslerini sıralayarak ve daha sonra bu durumda sadece yeniden düzenlenmiş endekslerde indeksleyerek şifreleme yapar.
% 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