Playfair cipher: Difference between revisions

Content added Content deleted
(Updated D entry)
(Added zkl)
Line 997: Line 997:
Encoded: BM OD ZB XD NA BE KU DM UI XM KZ ZR FT
Encoded: BM OD ZB XD NA BE KU DM UI XM KZ ZR FT
Decoded: HI DE TH EG OL DI NT HE TR EX ST UM PZ
Decoded: HI DE TH EG OL DI NT HE TR EX ST UM PZ
</pre>

=={{header|zkl}}==
Punting Q out of the alphabet.
<lang zkl>fcn genKeyTable(key){
key=(key-" qQ").toUpper().unique();
key + (["A".."Z"].aggregate(String).walk()-"Q"-key);
}</lang>
<lang zkl>fcn playfair(text,keyTable){ // text is a-z only
text=text.toUpper();
text=text-(text-keyTable); // remove unencodable characters
if(text.len().isOdd) text+="Z";
row:='wrap(c){ keyTable.index(c)/5 };
col:='wrap(c){ keyTable.index(c)%5 };
ltrRight:='wrap(c){ keyTable[(keyTable.index(c)+1)%25] };
ltrBelow:='wrap(c){ keyTable[(keyTable.index(c)+5)%25] };
ltrAt:='wrap(r,c){ keyTable[r*5+c] };
(text.toUpper()-"Q").pump(String,T(T,Void.Read,1), //-->digraph
'wrap(a,b){
if(a==b) b="X";
if((ra:=row(a)) == (rb:=row(b))) return(ltrRight(a)+ltrRight(b));
if((ca:=col(a)) == (cb:=col(b))) return(ltrBelow(a)+ltrBelow(b));
return(ltrAt(ra,cb)+ltrAt(rb,ca));
});
}</lang>
<lang zkl>fcn decodePF(text,keyTable){
row:='wrap(c){ keyTable.index(c)/5 };
col:='wrap(c){ keyTable.index(c)%5 };
ltrLeft:='wrap(c){ keyTable[(keyTable.index(c)-1)%25] };
ltrUp:='wrap(c){ n:=keyTable.index(c)-5; if(n<0)n+=25; keyTable[n%25] };
ltrAt:='wrap(r,c){ keyTable[r*5+c] };
text.pump(String,T(T,Void.Read,1), //-->digraph
'wrap(a,b){
if((ra:=row(a)) == (rb:=row(b))) return(ltrLeft(a)+ltrLeft(b));
if((ca:=col(a)) == (cb:=col(b))) return(ltrUp(a)+ltrUp(b));
return(ltrAt(ra,cb)+ltrAt(rb,ca));
});
}</lang>
<lang zkl>msg:="Hide the gold in the tree stump!!!";
keyTable:=genKeyTable("playfair example");
msg.println();
e:=playfair(msg,keyTable); e.println();
decodePF(e,keyTable).println();</lang>
{{out}}
<pre>
Hide the gold in the tree stump!!!
BMNDZBXDKYBEJVDMUIXMJZZRFT
HIDETHEGOLDINTHETREXSTUMPZ
</pre>
</pre>