RosettaCodeData/Task/Bifid-cipher/Phix/bifid-cipher.phix
2026-02-01 16:33:20 -08:00

39 lines
1.4 KiB
Text

with javascript_semantics
enum encrypt,decrypt
function bifid(string msg, polybius, sequence p, integer n, ed)
string res = ""
sequence dx = {}, dy = {}, dxy
for i=1 to length(msg) do
integer k = find(msg[i],polybius)-1
dx &= floor(k/n)+1
dy &= remainder(k,n)+1
end for
if ed=encrypt then
dxy = split_by(dx&dy,2)
else
-- "simply reversing these steps" - yeah, right...
dxy = columnize(split_by(flatten(columnize({dx,dy})),length(dx)))
end if
for i=1 to length(dxy) do
integer {x,y} = dxy[i]
res &= p[x][y]
end for
return res
end function
procedure test(string msg, polybius)
integer n = sqrt(length(polybius))
if n=5 then msg = substitute(upper(msg),"J","I") end if
sequence p = split_by(polybius,n)
string enc = bifid(msg,polybius,p,n,encrypt),
dec = bifid(enc,polybius,p,n,decrypt)
printf(1,"For %dx%d polybius %s\n\n",{n,n,join(p,"\n ")})
printf(1,"Message : %s\nEncrypted: %s\nDecrypted: %s\n\n",{msg,enc,dec})
end procedure
constant polybii = {tagstart('A','J'-'A')&tagstart('K','Z'-'J'),
"BGWKZQPNDSIOAXEFCLUMTHYVR",
" ."&tagstart('A',26)&tagstart('a',26)&tagstart('0',10)},
messages = {"ATTACKATDAWN","FLEEATONCE",
"The invasion will start on the first of January 2023."}
for t=1 to 3 do test(messages[t],polybii[t]) end for