· 9 years ago · Oct 22, 2016, 08:00 PM
1function stringToChars(str) {
2 return str.split('');
3}
4
5function charsToString(chars) {
6 return chars.join('');
7}
8
9function letterNumberEncode(c) {
10 return c.charCodeAt(0) - 'A'.charCodeAt(0);
11}
12
13function letterNumberDecode(i) {
14 return String.fromCharCode(i + 'A'.charCodeAt(0));
15}
16
17function toArray(obj) {
18 return Array.prototype.slice.call(obj);
19}
20
21function map(iterator) {
22 return array => array.map(iterator);
23}
24
25function reduce(iterator) {
26 return array => array.reduce(iterator);
27}
28
29function roundTableAddition(mod, a, b) {
30 return ((a + b) % mod + mod) % mod;
31}
32
33function compose() {
34 return argument => toArray(arguments).reduce((r, func) => func(r), argument);
35}
36
37const stringToCharIndexes = compose(stringToChars, map(letterNumberEncode));
38const charIndexesToString = compose(map(letterNumberDecode), charsToString);
39
40function caesarCipherCharIndexEncrypt(key, paintCharIndex) {
41 return roundTableAddition(26, key, paintCharIndex);
42}
43
44function caesarCipherCharIndexDecrypt(key, paintCharIndex) {
45 return roundTableAddition(26, -key, paintCharIndex);
46}
47
48function iterateCharIndexes(iterator) {
49 return compose(
50 stringToCharIndexes,
51 map(iterator),
52 charIndexesToString
53 );
54}
55
56function caesarCipherEncrypt(secretKey) {
57 return iterateCharIndexes(
58 caesarCipherCharIndexEncrypt.bind(this, secretKey)
59 );
60}
61
62function caesarCipherDecrypt(secretKey) {
63 return iterateCharIndexes(
64 caesarCipherCharIndexDecrypt.bind(this, secretKey)
65 );
66}