MATL, 70 byte (total)
f'(.{'iV'})(.{1,'2GqqV'})'5$h'$1'0'$2'0K$hYX2Get2LZ)P2LZ(!tg)i?&S]1Gw)
Cobalah di MATL Online
Coba beberapa uji kasus
Mengambil bendera sebagai input ketiga F
, T
untuk menguraikan string, untuk menguraikannya (terima kasih kepada Kevin Cruijssen untuk ide itu).
Ini dimulai sebagai jawaban Julia sampai saya menyadari pengetikan yang ketat terlalu banyak, terutama untuk penguraian. Berikut kode Julia yang saya miliki untuk penyandian (backported ke v0.6 untuk TIO):
!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)))[:]),"ø","")
Cobalah online!
Penjelasan:
Operasi pagar pagar
F . . . A . . . Z . . . .
O . B . R . A . Q . X
O . . . B . . . U
dapat dilihat sebagai membaca r = 3 karakter input, kemudian membaca r-2 karakter dan awalan dan suffix dengan nilai dummy (nulls), kemudian membaca r karakter lagi, dll., membuat kolom baru setiap kali:
F.A.Z.
OBRAQX
O.B.U.
kemudian membalikkan setiap kolom kedua (karena bagian zag dari zigzag naik bukan ke bawah, yang membuat perbedaan ketika r> 3), kemudian membaca matriks ini di sepanjang baris, dan menghapus karakter dummy.
Penguraian tampaknya tidak memiliki pola yang jelas seperti ini, tetapi ketika mencari-cari tentang hal ini saya menemukan posting ini , yang mengatakan kepada saya bahwa (a) ini adalah algoritma yang terkenal dan (mungkin?) Dipublikasikan untuk cipher kereta api, dan ( b) penguraian adalah penggunaan kembali yang sederhana dari metode yang sama, memberikannya indeks string dan mendapatkan indeks indeks tersebut setelah pengodean, dan membaca ciphertext di tempat-tempat itu.
Karena penguraian perlu melakukan hal-hal dengan mengerjakan indeks, kode ini melakukan pengodean juga dengan menyortir indeks string, dan kemudian dalam hal ini hanya mengindeks pada indeks yang disusun ulang.
% 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