26 lines
945 B
D
26 lines
945 B
D
import std.stdio, std.range, std.ascii, std.string, std.algorithm,
|
|
std.conv;
|
|
|
|
immutable mod = (in int m, in int n) pure nothrow @safe @nogc =>
|
|
((m % n) + n) % n;
|
|
|
|
immutable _s2v = (in string s) pure /*nothrow*/ @safe =>
|
|
s.toUpper.removechars("^A-Z").map!q{ a - 'A' };
|
|
|
|
string _v2s(R)(R v) pure /*nothrow*/ @safe {
|
|
return v.map!(x => uppercase[x.mod(26)]).text;
|
|
}
|
|
|
|
immutable encrypt = (in string txt, in string key) pure /*nothrow*/ @safe =>
|
|
txt._s2v.zip(key._s2v.cycle).map!q{ a[0] + a[1] }._v2s;
|
|
|
|
immutable decrypt = (in string txt, in string key) pure /*nothrow*/ @safe =>
|
|
txt._s2v.zip(key._s2v.cycle).map!q{ a[0] - a[1] }._v2s;
|
|
|
|
void main() {
|
|
immutable key = "Vigenere Cipher!!!";
|
|
immutable original = "Beware the Jabberwock, my son!" ~
|
|
" The jaws that bite, the claws that catch!";
|
|
immutable encoded = original.encrypt(key);
|
|
writeln(encoded, "\n", encoded.decrypt(key));
|
|
}
|