From b7a31cc6887bd15769bfdf75f36003869b2561a5 Mon Sep 17 00:00:00 2001 From: Julien Dessaux Date: Sat, 31 Dec 2022 01:15:20 +0100 Subject: 2022-20 in js --- 2022/20-Grove-Positioning-System/second.js | 90 ++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 2022/20-Grove-Positioning-System/second.js (limited to '2022/20-Grove-Positioning-System/second.js') diff --git a/2022/20-Grove-Positioning-System/second.js b/2022/20-Grove-Positioning-System/second.js new file mode 100644 index 0000000..a01acc4 --- /dev/null +++ b/2022/20-Grove-Positioning-System/second.js @@ -0,0 +1,90 @@ +import * as fs from "fs"; + +class File { + constructor(line) { + this.length = line.length; + this.data = line.map(v => ({value: v * 811589153})); // 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 { 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) { + for (let i=0; i<10; ++i) { + input.mix(); + } + return input.get(1000) + input.get(2000) + input.get(3000); +} + +const exampleOutput = solve(example); +if (exampleOutput !== 1623178306) { + console.log("Example failed with " + exampleOutput); + process.exit(1); // eslint-disable-line +} + +console.log(solve(input)); -- cgit v1.2.3