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