MATL, 70 byte (totale)
f'(.{'iV'})(.{1,'2GqqV'})'5$h'$1'0'$2'0K$hYX2Get2LZ)P2LZ(!tg)i?&S]1Gw)
Provalo su MATL Online
Prova più casi di test
Prende una bandiera come terzo input, F
per crittografare la stringa, T
per decifrarla (grazie a Kevin Cruijssen per quell'idea).
Questo è iniziato come una risposta di Julia fino a quando ho capito che la battitura rigorosa mi ha ostacolato troppo, specialmente per la decifrazione. Ecco il codice Julia che avevo per la crittografia (backported alla v0.6 per 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)))[:]),"ø","")
Provalo online!
Spiegazione:
L'operazione di recinzione ferroviaria
F . . . A . . . Z . . . .
O . B . R . A . Q . X
O . . . B . . . U
può essere visto come lettura di r = 3 caratteri di input, quindi lettura di r-2 caratteri e prefisso e suffisso quello con valori fittizi (null), quindi lettura di nuovo r caratteri, ecc., creando una nuova colonna ogni volta:
F.A.Z.
OBRAQX
O.B.U.
quindi inverte ogni seconda colonna (poiché il zag parte zigzag sale anziché verso il basso, che fa la differenza quando r> 3), allora la lettura di questa matrice lungo le righe e rimuovendo i caratteri fittizi.
La decifrazione non sembrava avere schemi ovvi come questo, ma quando ho cercato in questo mi sono imbattuto in questo post , che mi ha detto che (a) questo era un algoritmo ben noto e (forse?) Pubblicato per i codici ferroviari, e ( b) la decifrazione era un semplice riutilizzo dello stesso metodo, dandogli gli indici della stringa e ottenendo gli indici di quegli indici dopo la crittografia, e leggendo il testo cifrato in quei punti.
Poiché la decifrazione deve fare le cose lavorando sugli indici, questo codice esegue la crittografia anche ordinando gli indici della stringa, e quindi in questo caso semplicemente indicizzando quegli indici riorganizzati.
% 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