Jump to content

Playfair cipher: Difference between revisions

(→‎{{header|zkl}}: bug fixes)
Line 1,478:
 
=={{header|zkl}}==
<lang zkl>fcn genKeyTable(key,deadChr){ // deadChr=="Q" or "J"
Punting Q out of the alphabet.
deadChr=deadChr.toUpper();
<lang zkl>fcn genKeyTable(key){
key=(key - " qQ").toUpper().unique() - " " - deadChr;
return(key + (["A".."Z"].aggregatepump(String).walk() - "Q"deadChr - key), deadChr);
}</lang>
<lang zkl>fcn playfair(text,keyTablekeytable){ // text is a-z only
keyTable,deadChr:=keytable;
text=text.toUpper();
text-=text - keyTable; // remove unencodable characters
if(text.len().isOdddeadChr=="Q") text+-=deadChr; else text=text.replace("ZJ","I");
 
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,Void.Read, //-->digraph
'wrapsink:=Sink(a,bString){;
foreach a in (text){
if(a==b) b="X";
b:=__aWalker._next() and __aWalker.value or "X";
if((ra:=row(a))==(rb:=row(b))) return(ltrRight(a)+ltrRight(b));
if(a==b){
if((ca:=col(a))==(cb:=col(b))) return(ltrBelow(a)+ltrBelow(b));
if(b=="X"){ // "XX" is pathological
return(ltrAt(ra,cb)+ltrAt(rb,ca));
if(not __aWalker.atEnd) __aWalker.push(b);
});
if(a==b) b="XZ";
}
else { __aWalker.push(b); b="X"; }
}
sink.write(
if((ra:=row(a))==(rb:=row(b))) return( ltrRight(a) + ltrRight(b));
else if((ca:=col(a))==(cb:=col(b))) return(ltrBelow(a) + ltrBelow(b));
return(else ltrAt(ra,cb) + ltrAt(rb,ca));
});
}
sink.close()
.pump(String,Void.Read,"".create.fp(" ")).strip(); // insert blanks
}</lang>
<lang zkl>fcn decodePF(text,keyTable){
keyTable,_=keyTable;
text-=" ";
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,Void.Read, //-->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));
});
.pump(String,Void.Read,"".create.fp(" ")).strip(); // insert blanks
}</lang>
}
}</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>
decodePF(playfair("X",keyTable).println(),keyTable).println();
decodePF(playfair("XX",keyTable).println(),keyTable).println();</lang>
{{out}}
<pre>
Hide the gold in the tree stump!!!
BM OD ZB XD NA BE KU DM UI XM MO UV IF
BMNDZBXDKYBEJVDMUIXMJZZRFT
HI DE TH EG OL DI NT HE TR EX ES TU MP
HIDETHEGOLDINTHETREXSTUMPZ
MW
XZ
MW MW
XZ XZ
</pre>
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.