MATL, 70 bytes (total)
f'(.{'iV'})(.{1,'2GqqV'})'5$h'$1'0'$2'0K$hYX2Get2LZ)P2LZ(!tg)i?&S]1Gw)
Pruébelo en MATL en línea
Pruebe múltiples casos de prueba
Toma una bandera como tercera entrada, F
para cifrar la cadena, T
para descifrarla (gracias a Kevin Cruijssen por esa idea).
Esto comenzó como una respuesta de Julia hasta que me di cuenta de que la mecanografía estricta se interponía demasiado, especialmente para descifrarla. Aquí está el código de Julia que tenía para el cifrado (respaldado a v0.6 para 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)))[:]),"ø","")
Pruébalo en línea!
Explicación:
La operación de valla ferroviaria
F . . . A . . . Z . . . .
O . B . R . A . Q . X
O . . . B . . . U
puede verse como lectura de r = 3 caracteres de entrada, luego lectura de caracteres r-2 y prefijos y sufijos con valores ficticios (nulos), luego lectura de caracteres r nuevamente, etc., creando una nueva columna cada vez:
F.A.Z.
OBRAQX
O.B.U.
a continuación, invirtiendo cada segunda columna (desde la zag parte de zigzag sube en lugar de hacia abajo, lo que hace una diferencia cuando r> 3), entonces la lectura de esta matriz a lo largo de las filas, y la eliminación de los personajes ficticios.
El desciframiento no parecía tener ningún patrón obvio como este, pero cuando busqué sobre esto me encontré con esta publicación , que me decía que (a) este era un algoritmo bien conocido y (¿posiblemente?) Publicado para cifrado de riel, y ( b) el descifrado fue una simple reutilización del mismo método, dándole los índices de la cadena y obteniendo los índices de esos índices después del cifrado, y leyendo el texto cifrado en esos lugares.
Dado que el descifrado necesita hacer cosas al trabajar en índices, este código también cifra al clasificar los índices de la cadena y, en este caso, simplemente indexa esos índices reorganizados.
% 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