Skip to content

Instantly share code, notes, and snippets.

@devNoiseConsulting
Created January 3, 2018 03:23
Show Gist options
  • Select an option

  • Save devNoiseConsulting/ae9f6efbce41ab073698497ad30e0aa9 to your computer and use it in GitHub Desktop.

Select an option

Save devNoiseConsulting/ae9f6efbce41ab073698497ad30e0aa9 to your computer and use it in GitHub Desktop.
Knot Hash - Advent of Code - 20171210
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