* feat(tools): add seed/solution restore script * chore(curriculum): remove empty sections' markers * chore(curriculum): add seed + solution to Chinese * chore: remove old formatter * fix: update getChallenges parse translated challenges separately, without reference to the source * chore(curriculum): add dashedName to English * chore(curriculum): add dashedName to Chinese * refactor: remove unused challenge property 'name' * fix: relax dashedName requirement * fix: stray tag Remove stray `pre` tag from challenge file. Signed-off-by: nhcarrigan <nhcarrigan@gmail.com> Co-authored-by: nhcarrigan <nhcarrigan@gmail.com>
187 lines
5.5 KiB
Markdown
187 lines
5.5 KiB
Markdown
---
|
|
id: 5a23c84252665b21eecc8029
|
|
title: Straddling checkerboard
|
|
challengeType: 5
|
|
forumTopicId: 302325
|
|
dashedName: straddling-checkerboard
|
|
---
|
|
|
|
# --description--
|
|
|
|
Implement functions to encrypt and decrypt a message using the [straddling checkerboard](https://en.wikipedia.org/wiki/Straddling_checkerboard) method. The functions will take a string and an array as parameters. The array has 3 strings representing the 3 rows of the checkerboard. The output will be a series of decimal digits. Numbers should be encrypted by inserting the escape character before each digit, then including the digit unencrypted. This should be reversed for decryption.
|
|
|
|
# --hints--
|
|
|
|
`straddle` should be a function.
|
|
|
|
```js
|
|
assert(typeof straddle == 'function');
|
|
```
|
|
|
|
`straddle("One night-it was on the twentieth of March, 1888-I was returning.",["ESTONIA R", "BCDFGHJKLM", "PQUVWXYZ./"])` should return a string.
|
|
|
|
```js
|
|
assert(
|
|
typeof straddle(
|
|
'One night-it was on the twentieth of March, 1888-I was returning.',
|
|
['ESTONIA R', 'BCDFGHJKLM', 'PQUVWXYZ./']
|
|
) == 'string'
|
|
);
|
|
```
|
|
|
|
`straddle("One night-it was on the twentieth of March, 1888-I was returning.",["ESTONIA R", "BCDFGHJKLM", "PQUVWXYZ./"])` should return `"34045747525284613427502840425027537379697175891898898898584619028294547488"`.
|
|
|
|
```js
|
|
assert.equal(
|
|
straddle(
|
|
'One night-it was on the twentieth of March, 1888-I was returning.',
|
|
['ESTONIA R', 'BCDFGHJKLM', 'PQUVWXYZ./']
|
|
),
|
|
'34045747525284613427502840425027537379697175891898898898584619028294547488'
|
|
);
|
|
```
|
|
|
|
`straddle("One night-it was on the twentieth of March, 1888-I was returning",["HOL MES RT", "ABCDFGIJKN", "PQUVWXYZ./"])` should return `"139539363509369743061399059745399365901344308320791798798798367430685972839363935"`.
|
|
|
|
```js
|
|
assert.equal(
|
|
straddle('One night-it was on the twentieth of March, 1888-I was returning', [
|
|
'HOL MES RT',
|
|
'ABCDFGIJKN',
|
|
'PQUVWXYZ./'
|
|
]),
|
|
'139539363509369743061399059745399365901344308320791798798798367430685972839363935'
|
|
);
|
|
```
|
|
|
|
`straddle("Thecheckerboardcakerecipespecifies3largeeggsand2.25cupsofflour.",["ET AON RIS", "BCDFGHJKLM", "PQ/UVWXYZ."])` should return `"125021250212707204372221327070218600960021823809623283724002424935226226962262521636094232328463769"`.
|
|
|
|
```js
|
|
assert.equal(
|
|
straddle('Thecheckerboardcakerecipespecifies3largeeggsand2.25cupsofflour.', [
|
|
'ET AON RIS',
|
|
'BCDFGHJKLM',
|
|
'PQ/UVWXYZ.'
|
|
]),
|
|
'125021250212707204372221327070218600960021823809623283724002424935226226962262521636094232328463769'
|
|
);
|
|
```
|
|
|
|
`unstraddle` should be a function.
|
|
|
|
```js
|
|
assert(typeof unstraddle == 'function');
|
|
```
|
|
|
|
`unstraddle("34045747525284613427502840425027537379697175891898898898584619028294547488",["ESTONIA R", "BCDFGHJKLM", "PQUVWXYZ./"])` should return a string.
|
|
|
|
```js
|
|
assert(
|
|
typeof unstraddle(
|
|
'34045747525284613427502840425027537379697175891898898898584619028294547488',
|
|
['ESTONIA R', 'BCDFGHJKLM', 'PQUVWXYZ./']
|
|
) == 'string'
|
|
);
|
|
```
|
|
|
|
`unstraddle("34045747525284613427502840425027537379697175891898898898584619028294547488",["ESTONIA R", "BCDFGHJKLM", "PQUVWXYZ./"])` should return `"ONENIGHTITWASONTHETWENTIETHOFMARCH1888IWASRETURNING."`.
|
|
|
|
```js
|
|
assert.equal(
|
|
unstraddle(
|
|
'34045747525284613427502840425027537379697175891898898898584619028294547488',
|
|
['ESTONIA R', 'BCDFGHJKLM', 'PQUVWXYZ./']
|
|
),
|
|
'ONENIGHTITWASONTHETWENTIETHOFMARCH1888IWASRETURNING.'
|
|
);
|
|
```
|
|
|
|
`unstraddle("139539363509369743061399059745399365901344308320791798798798367430685972839363935",["HOL MES RT", "ABCDFGIJKN", "PQUVWXYZ./"])` should return `"ONENIGHTITWASONTHETWENTIETHOFMARCH1888IWASRETURNING"`.
|
|
|
|
```js
|
|
assert.equal(
|
|
unstraddle(
|
|
'139539363509369743061399059745399365901344308320791798798798367430685972839363935',
|
|
['HOL MES RT', 'ABCDFGIJKN', 'PQUVWXYZ./']
|
|
),
|
|
'ONENIGHTITWASONTHETWENTIETHOFMARCH1888IWASRETURNING'
|
|
);
|
|
```
|
|
|
|
`unstraddle("125021250212707204372221327070218600960021823809623283724002424935226226962262521636094232328463769",["ET AON RIS", "BCDFGHJKLM", "PQ/UVWXYZ."])` should return `"THECHECKERBOARDCAKERECIPESPECIFIES3LARGEEGGSAND2.25CUPSOFFLOUR."`.
|
|
|
|
```js
|
|
assert.equal(
|
|
unstraddle(
|
|
'125021250212707204372221327070218600960021823809623283724002424935226226962262521636094232328463769',
|
|
['ET AON RIS', 'BCDFGHJKLM', 'PQ/UVWXYZ.']
|
|
),
|
|
'THECHECKERBOARDCAKERECIPESPECIFIES3LARGEEGGSAND2.25CUPSOFFLOUR.'
|
|
);
|
|
```
|
|
|
|
# --seed--
|
|
|
|
## --seed-contents--
|
|
|
|
```js
|
|
function straddle(message, alphabet) {
|
|
|
|
}
|
|
|
|
function unstraddle(message, alphabet) {
|
|
|
|
}
|
|
```
|
|
|
|
# --solutions--
|
|
|
|
```js
|
|
function straddle(message, alphabet) {
|
|
var prefixes = new Array(
|
|
'',
|
|
alphabet[0].indexOf(' '),
|
|
alphabet[0].lastIndexOf(' ')
|
|
);
|
|
|
|
var out = '';
|
|
message = message.toUpperCase();
|
|
message = message.replace(/([0-9])/g, '/$1'); // dumb way to escape numbers
|
|
for (var i = 0; i < message.length; i++) {
|
|
var chr = message[i];
|
|
if (chr == ' ') continue;
|
|
for (var j = 0; j < 3; j++) {
|
|
var k = alphabet[j].indexOf(chr);
|
|
if (k < 0) continue;
|
|
out += prefixes[j].toString() + k;
|
|
}
|
|
if (chr == '/') out += message[++i];
|
|
}
|
|
return out;
|
|
}
|
|
function unstraddle(message, alphabet) {
|
|
var prefixes = new Array(
|
|
'',
|
|
alphabet[0].indexOf(' '),
|
|
alphabet[0].lastIndexOf(' ')
|
|
);
|
|
var out = '';
|
|
var n, o;
|
|
for (var i = 0; i < message.length; i++) {
|
|
n = message[i] * 1;
|
|
switch (n) {
|
|
case prefixes[1]:
|
|
o = alphabet[1][message[++i]];
|
|
break;
|
|
case prefixes[2]:
|
|
o = alphabet[2][message[++i]];
|
|
break;
|
|
default:
|
|
o = alphabet[0][n];
|
|
}
|
|
o == '/' ? (out += message[++i]) : (out += o);
|
|
}
|
|
return out;
|
|
}
|
|
```
|