Created
January 3, 2018 03:23
-
-
Save devNoiseConsulting/ae9f6efbce41ab073698497ad30e0aa9 to your computer and use it in GitHub Desktop.
Knot Hash - Advent of Code - 20171210
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| let knotHash = function(size, lengths) { | |
| let numbers = new Array(size).fill(0).map((v, i) => i); | |
| let skip = 0; | |
| let currentPosition = 0; | |
| lengths.forEach((v, i) => { | |
| let length = [...numbers, ...numbers] | |
| .slice(currentPosition, currentPosition + v) | |
| .reverse(); | |
| length.forEach((v, i) => { | |
| numbers[(currentPosition + i) % numbers.length] = v; | |
| }); | |
| currentPosition = (currentPosition + v + skip++) % numbers.length; | |
| }); | |
| return numbers[0] * numbers[1]; | |
| }; | |
| let knotHashRounds = function(lengths) { | |
| let salt = [17, 31, 73, 47, 23]; | |
| let skip = 0; | |
| let currentPosition = 0; | |
| let numbers = new Array(256).fill(0).map((v, i) => i); | |
| let knotHash = function(input, lengths) { | |
| let numbers = input.slice(); | |
| lengths.forEach((v, i) => { | |
| let length = [...numbers, ...numbers] | |
| .slice(currentPosition, currentPosition + v) | |
| .reverse(); | |
| length.forEach((v, i) => { | |
| numbers[(currentPosition + i) % numbers.length] = v; | |
| }); | |
| currentPosition = (currentPosition + v + skip++) % numbers.length; | |
| }); | |
| return numbers; | |
| }; | |
| lengths = lengths | |
| .split('') | |
| .map(v => v.charCodeAt()) | |
| .concat(salt); | |
| for (let i = 0; i < 64; i++) { | |
| numbers = knotHash(numbers, lengths); | |
| } | |
| let denseHash = numbers.reduce((acc, v, i) => { | |
| let index = Math.floor(i / 16); | |
| acc[index] = acc[index] ^ v; | |
| return acc; | |
| }, new Array(16).fill(0)); | |
| denseHash = denseHash.map(v => ('0' + v.toString(16)).substr(-2)).join(''); | |
| return denseHash; | |
| }; | |
| let test = [3, 4, 1, 5]; | |
| let size = 5; | |
| test = [63, 144, 180, 149, 1, 255, 167, 84, 125, 65, 188, 0, 2, 254, 229, 24]; | |
| size = 256; | |
| let result = knotHash(size, test); | |
| console.log(result); | |
| test = '63,144,180,149,1,255,167,84,125,65,188,0,2,254,229,24'; | |
| result = knotHashRounds(test); | |
| console.log(result); | |
| // 7e81 4e31 206f 4073 fe25 7cb9 50fd 4807 | |
| // 62e2 204d 2ca4 f492 4f6e 7a80 f128 8786 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment