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;
 | |
| }
 | |
| ```
 |