MATL, 70 Bytes (insgesamt)
f'(.{'iV'})(.{1,'2GqqV'})'5$h'$1'0'$2'0K$hYX2Get2LZ)P2LZ(!tg)i?&S]1Gw)
Probieren Sie es mit MATL Online aus.
Probieren Sie mehrere Testfälle aus
Nimmt ein Flag als dritte Eingabe, F
um die Zeichenfolge zu verschlüsseln, T
um sie zu entschlüsseln (danke an Kevin Cruijssen für diese Idee).
Dies begann als Antwort von Julia, bis mir klar wurde, dass striktes Tippen zu viel störte, insbesondere für die Entschlüsselung. Hier ist der Julia-Code, den ich für die Verschlüsselung hatte (für TIO auf v0.6 zurückportiert):
!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)))[:]),"ø","")
Probieren Sie es online aus!
Erläuterung:
Der Schienenzaunbetrieb
F . . . A . . . Z . . . .
O . B . R . A . Q . X
O . . . B . . . U
kann als Lesen von r = 3 Zeichen der Eingabe, dann Lesen von r-2 Zeichen und Präfixieren und Suffixieren dieser mit Dummy-Werten (Nullen), dann erneutes Lesen von r Zeichen usw. angesehen werden, wobei jedes Mal eine neue Spalte erstellt wird:
F.A.Z.
OBRAQX
O.B.U.
dann jede zweite Spalte umkehren (da der Zack- Teil des Zickzacks nach oben statt nach unten geht, was einen Unterschied macht, wenn r> 3 ist), dann diese Matrix entlang der Zeilen lesen und die Dummy-Zeichen entfernen.
Die Entschlüsselung schien keine offensichtlichen Muster wie dieses zu haben, aber als ich mich danach umsah , stieß ich auf diesen Beitrag , der mir sagte, dass (a) dies ein bekannter und (möglicherweise?) Veröffentlichter Algorithmus für Schienenchiffren war und ( b) Die Entschlüsselung war eine einfache Wiederverwendung derselben Methode, bei der die Indizes der Zeichenfolge angegeben und die Indizes dieser Indizes nach der Verschlüsselung abgerufen und der Chiffretext an diesen Stellen gelesen wurden.
Da die Entschlüsselung Dinge tun muss, indem an Indizes gearbeitet wird, verschlüsselt dieser Code auch, indem er die Indizes der Zeichenfolge sortiert und in diesem Fall nur an diesen neu angeordneten Indizes indiziert.
% 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