MATL, 70 바이트 (총)
f'(.{'iV'})(.{1,'2GqqV'})'5$h'$1'0'$2'0K$hYX2Get2LZ)P2LZ(!tg)i?&S]1Gw)
MATL Online에서
사용해보십시오. 여러 테스트 사례를 사용해보십시오.
F
문자열을 암호화하고 T
해독하기 위해 플래그를 세 번째 입력으로 사용 합니다 ( 케빈 크루이 센 에게 감사의 말을 전합니다 ).
이것은 특히 타이핑이 엄격하게 타이핑되는 것을 깨달을 때까지 Julia의 대답으로 시작되었습니다. 다음은 암호화를 위해 가지고 있던 Julia 코드입니다 (TIO의 경우 v0.6으로 백 포트 됨).
!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.
그런 다음 지그재그 의 zag 부분이 아래로 이동하지 않고 r> 3에서 차이가 있기 때문에 두 번째 열마다 반전 한 다음 행을 따라이 행렬을 읽고 더미 문자를 제거하십시오.
해독은 이와 같은 명백한 패턴이없는 것처럼 보이지만 이것에 대해 검색 할 때이 게시물을 보았습니다. (a) 이것은 레일 암호에 대해 잘 알려져 있고 (아마도?) 게시 된 알고리즘이며 b) 해독은 동일한 방법을 간단히 재사용하여 문자열의 인덱스를 제공하고 암호화 후 인덱스의 인덱스를 가져 와서 그 위치에서 암호문을 읽었습니다.
해독은 인덱스 작업을 통해 일을 수행해야하기 때문에이 코드는 문자열의 인덱스를 정렬하여 암호화를 수행 한 다음이 경우에는 재 배열 된 인덱스에서 인덱싱합니다.
% 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