MATL, 70 ไบต์ (ทั้งหมด)
f'(.{'iV'})(.{1,'2GqqV'})'5$h'$1'0'$2'0K$hYX2Get2LZ)P2LZ(!tg)i?&S]1Gw)
ลองใช้งานบน MATL Online
ลองทดสอบหลายกรณี
ใช้แฟล็กเป็นอินพุตที่สามF
เพื่อเข้ารหัสสตริงT
เพื่อถอดรหัส (ขอบคุณ Kevin Cruijssenสำหรับแนวคิดนั้น)
สิ่งนี้เริ่มต้นจากคำตอบของ Julia จนกระทั่งฉันรู้ว่าการพิมพ์ที่เข้มงวดได้มากเกินไปโดยเฉพาะการถอดรหัส นี่คือรหัส Julia ที่ฉันมีสำหรับการเข้ารหัส (backported ถึง 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) จากนั้นอ่านเมทริกซ์นี้ตามแนวแถวและลบอักขระจำลองออก
ดูเหมือนว่าการถอดรหัสไม่ได้มีรูปแบบที่ชัดเจนใด ๆ เช่นนี้ แต่เมื่อค้นหารอบ ๆ นี้ฉันเจอโพสต์นี้ซึ่งบอกฉันว่า (a) นี่เป็นอัลกอริทึมที่รู้จักกันดี b) decipherment เป็นการใช้ซ้ำอย่างง่ายของวิธีการเดียวกันทำให้มันเป็นดัชนีของสตริงและรับดัชนีของดัชนีเหล่านั้นหลังจากการเข้ารหัสและการอ่าน ciphertext ที่สถานที่เหล่านั้น
เนื่องจากการถอดรหัสต้องทำสิ่งต่าง ๆ โดยการทำงานกับดัชนีรหัสนี้ทำการเข้ารหัสด้วยการเรียงลำดับดัชนีของสตริงและจากนั้นในกรณีนี้เพียงแค่ทำดัชนีดัชนีที่จัดเรียงใหม่เหล่านั้น
% 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