aboutsummaryrefslogtreecommitdiff
path: root/2022/20-Grove-Positioning-System/second.js
diff options
context:
space:
mode:
authorJulien Dessaux2022-12-31 01:15:20 +0100
committerJulien Dessaux2022-12-31 01:15:20 +0100
commitb7a31cc6887bd15769bfdf75f36003869b2561a5 (patch)
tree46f551bc7e3631aa49f10b8518297fcd1f20a099 /2022/20-Grove-Positioning-System/second.js
parent2022-19 in js (diff)
downloadadvent-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/second.js90
1 files changed, 90 insertions, 0 deletions
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<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) {
+ 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));