MATL, 70 байт (всього)
f'(.{'iV'})(.{1,'2GqqV'})'5$h'$1'0'$2'0K$hYX2Get2LZ)P2LZ(!tg)i?&S]1Gw)
Спробуйте на MATL Online
Спробуйте кілька тестових випадків
Візьме прапор як третій вхід, F
щоб T
розшифрувати рядок, розшифрувати його (спасибі Кевіну Круйссену за цю ідею).
Це почалося як відповідь Джулії, поки я не зрозумів, що суворий набір тексту заважає занадто багато, особливо для розшифровки. Ось код Юлії, який я мав для шифрування (підтримується версією v0.6 для 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)))[:]),"ø","")
Спробуйте в Інтернеті!
Пояснення:
Операція залізничної огорожі
F . . . A . . . Z . . . .
O . B . R . A . Q . X
O . . . B . . . U
можна розглядати як читання r = 3 символи введення, потім зчитування символів r-2 та префіксацію та суфікс, що має фіктивні значення (нулі), потім знову читання r символів тощо, створюючи кожен стовпець щоразу:
F.A.Z.
OBRAQX
O.B.U.
потім обертається кожен другий стовпчик (оскільки заг- частина зигзагу йде вгору замість вниз, що має значення при r> 3), потім читаючи цю матрицю по рядках і видаляючи фіктивні символи.
Розшифровка, схоже, не мала подібних очевидних зразків, але, обшукуючи це, я натрапив на цю посаду , яка мені сказала, що (а) це добре відомий і (можливо?) Опублікований алгоритм для шифрів залізниць, б) розшифровка - це просте повторне використання того ж методу, присвоєння йому індексів рядка та отримання індексів цих індексів після шифрування та зчитування шифротексту в цих місцях.
Оскільки розшифровкою потрібно займатися, працюючи над індексами, цей код виконує шифрування також шляхом сортування індексів рядка, а потім у цьому випадку просто індексування цих переставлених індексів.
% 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