Playfair cipher: Difference between revisions

m
(Updated D entry)
Line 1,480:
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 };
Line 1,492:
ltrBelow:='wrap(c){ keyTable[(keyTable.index(c)+5)%25] };
ltrAt:='wrap(r,c){ keyTable[r*5+c] };
(text.toUpper()-"Q").pump(String,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));
});
Line 1,506:
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(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));
});
Anonymous user