MATL, 70 byte (tổng cộng)
f'(.{'iV'})(.{1,'2GqqV'})'5$h'$1'0'$2'0K$hYX2Get2LZ)P2LZ(!tg)i?&S]1Gw)
Dùng thử trên MATL Online
Hãy thử nhiều trường hợp thử nghiệm
Lấy một cờ làm đầu vào thứ ba, F
để mã hóa chuỗi, T
để giải mã nó (nhờ Kevin Cruijssen cho ý tưởng đó).
Điều này bắt đầu như một câu trả lời của Julia cho đến khi tôi nhận ra việc đánh máy nghiêm ngặt cản trở quá nhiều, đặc biệt là để giải mã. Đây là mã Julia tôi đã có để mã hóa (được nhập vào v0.6 cho 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)))[:]),"ø","")
Hãy thử trực tuyến!
Giải trình:
Hoạt động hàng rào đường sắt
F . . . A . . . Z . . . .
O . B . R . A . Q . X
O . . . B . . . U
có thể được xem là đọc r = 3 ký tự đầu vào, sau đó đọc r-2 ký tự và tiền tố và thêm vào đó bằng các giá trị giả (null), sau đó đọc lại ký tự r, v.v., tạo cột mới mỗi lần:
F.A.Z.
OBRAQX
O.B.U.
sau đó đảo ngược mỗi cột thứ hai (vì phần zag của zigzag tăng lên thay vì xuống, điều này tạo ra sự khác biệt khi r> 3), sau đó đọc ma trận này dọc theo các hàng và loại bỏ các ký tự giả.
Giải mã dường như không có bất kỳ mô hình rõ ràng nào như thế này, nhưng khi tìm kiếm xung quanh vấn đề này tôi đã tìm thấy bài đăng này , nó nói với tôi rằng (a) đây là một thuật toán được công bố nổi tiếng và (có thể?) Cho mật mã đường sắt, và ( b) giải mã là một cách sử dụng lại đơn giản của cùng một phương thức, cung cấp cho nó các chỉ số của chuỗi và nhận các chỉ số của các chỉ số đó sau khi mã hóa và đọc bản mã tại các vị trí đó.
Vì việc giải mã cần thực hiện mọi thứ bằng cách làm việc trên các chỉ mục, mã này cũng mã hóa bằng cách sắp xếp các chỉ mục của chuỗi, và trong trường hợp này chỉ cần lập chỉ mục tại các chỉ mục được sắp xếp lại đó.
% 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