diff options
author | Julien Dessaux | 2022-12-31 01:15:20 +0100 |
---|---|---|
committer | Julien Dessaux | 2022-12-31 01:15:20 +0100 |
commit | b7a31cc6887bd15769bfdf75f36003869b2561a5 (patch) | |
tree | 46f551bc7e3631aa49f10b8518297fcd1f20a099 /2022/20-Grove-Positioning-System/first.js | |
parent | 2022-19 in js (diff) | |
download | advent-of-code-b7a31cc6887bd15769bfdf75f36003869b2561a5.tar.gz advent-of-code-b7a31cc6887bd15769bfdf75f36003869b2561a5.tar.bz2 advent-of-code-b7a31cc6887bd15769bfdf75f36003869b2561a5.zip |
2022-20 in js
Diffstat (limited to '')
-rw-r--r-- | 2022/20-Grove-Positioning-System/first.js | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/2022/20-Grove-Positioning-System/first.js b/2022/20-Grove-Positioning-System/first.js new file mode 100644 index 0000000..7a49d57 --- /dev/null +++ b/2022/20-Grove-Positioning-System/first.js @@ -0,0 +1,88 @@ +import * as fs from "fs"; + +class File { + constructor(line) { + this.length = line.length; + this.data = line.map(v => ({value: v})); // index in data + this.data[0].left = this.data[this.length-1]; + this.data[0].right = this.data[1]; + this.data[this.length-1].left = this.data[this.length-2]; + this.data[this.length-1].right = this.data[0]; + for (let i=1; i<this.length-1; ++i) { + this.data[i].left = this.data[i-1]; + this.data[i].right = this.data[i+1]; + } + this.data.forEach(v => { if (v.value === 0) this.head = v; }); + } + get(i) { + let it = this.head; + for (let offset = i % this.length; offset > 0; --offset) { + it = it.right; + } + return it.value; + } + mix() { + this.data.forEach(v => { + if (v.value !== 0) { + let it = v; + let offset; // javascript and modulo... what a nightmare! + if (v.value > 0) offset = v.value % (this.length - 1); + if (v.value < 0) offset = ((v.value * -1) % (this.length - 1)) * -1; + if (offset !==0) { + v.right.left = v.left; + v.left.right = v.right; + if (offset < 0) { + for (; offset < 0; ++offset) { + it = it.left; + } + v.right = it; + v.left = it.left; + v.left.right = v; + v.right.left = v; + } else { + for (; offset > 0; --offset) { + it = it.right; + } + v.right = it.right; + v.left = it; + v.left.right = v; + v.right.left = v; + } + } + } + }); + } + print() { + let it = this.head; + for (let offset = this.length; offset > 0; --offset) { + console.log(it.value); + it = it.right; + } + console.log("---"); + } +} + +function load(filename) { + return new File( + fs.readFileSync(filename, "utf8") + .trim() + .split("\n") + .map(line => parseInt(line)) + ); +} + +let example = load("example"); +let input = load("input"); + +function solve(input) { + input.mix(); + return input.get(1000) + input.get(2000) + input.get(3000); +} + +const exampleOutput = solve(example); +if (exampleOutput !== 3) { + console.log("Example failed with " + exampleOutput); + process.exit(1); // eslint-disable-line +} + +console.log(solve(input)); |