MATL, 70 octets (total)
f'(.{'iV'})(.{1,'2GqqV'})'5$h'$1'0'$2'0K$hYX2Get2LZ)P2LZ(!tg)i?&S]1Gw)
Essayez-le sur MATL en ligne
Essayez plusieurs cas de test
Prend un drapeau comme troisième entrée, F
pour chiffrer la chaîne, T
pour la déchiffrer (merci à Kevin Cruijssen pour cette idée).
Cela a commencé comme une réponse de Julia jusqu'à ce que je réalise que la frappe stricte gênait trop, surtout pour le déchiffrement. Voici le code Julia que j'avais pour le chiffrement (rétroporté vers la v0.6 pour 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)))[:]),"ø","")
Essayez-le en ligne!
Explication:
L'opération de clôture ferroviaire
F . . . A . . . Z . . . .
O . B . R . A . Q . X
O . . . B . . . U
peut être vu comme lisant r = 3 caractères d'entrée, puis lisant r-2 caractères et préfixant et suffixant cela avec des valeurs fictives (null), puis relisant r caractères, etc., créant une nouvelle colonne à chaque fois:
F.A.Z.
OBRAQX
O.B.U.
puis inverser toutes les deux colonnes (puisque la partie zag du zigzag monte au lieu de descendre, ce qui fait une différence lorsque r> 3), puis lit cette matrice le long des lignes et supprime les caractères fictifs.
Le déchiffrement ne semblait pas avoir de modèles évidents comme celui-ci, mais en cherchant à ce sujet, je suis tombé sur ce post , qui m'a dit que (a) c'était un algorithme bien connu et (peut-être?) Publié pour les chiffrements ferroviaires, et ( b) le déchiffrement était une simple réutilisation de la même méthode, lui donnant les indices de la chaîne et obtenant les indices de ces indices après chiffrement, et lisant le texte chiffré à ces endroits.
Étant donné que le déchiffrement doit faire des choses en travaillant sur les indices, ce code effectue également le chiffrement en triant les indices de la chaîne, puis dans ce cas simplement en indexant ces index réarrangés.
% 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