summaryrefslogtreecommitdiffstats
path: root/day23/day23-2.js
diff options
context:
space:
mode:
Diffstat (limited to 'day23/day23-2.js')
-rw-r--r--day23/day23-2.js57
1 files changed, 57 insertions, 0 deletions
diff --git a/day23/day23-2.js b/day23/day23-2.js
new file mode 100644
index 0000000..536e3c3
--- /dev/null
+++ b/day23/day23-2.js
@@ -0,0 +1,57 @@
+const data = require('./data')
+const numbers = data.split('').map((n) => parseInt(n, 10))
+const min = Math.min(...numbers)
+const max = Math.max(...numbers)
+const start = numbers[0]
+const cupsLength = 1000000
+const cups = {}
+let current = numbers[0]
+
+numbers.forEach((n, i) => {
+ cups[n] = {
+ prev: numbers[(i + (numbers.length - 1)) % numbers.length],
+ next: numbers[(i + 1) % numbers.length],
+ }
+})
+
+for (let i = max + 1; i <= cupsLength; i++) {
+ cups[i] = {
+ prev: i - 1,
+ next: i + 1,
+ }
+}
+
+cups[start].prev = cupsLength
+cups[numbers[numbers.length - 1]].next = max + 1
+cups[max + 1].prev = numbers[numbers.length - 1]
+cups[cupsLength].next = start
+
+for (let i = 0; i < 10000000; i++) {
+ let destination = current - 1
+ const first = cups[current].next
+ const second = cups[first].next
+ const third = cups[second].next
+ const fourth = cups[third].next
+ cups[current].next = fourth
+
+ while (
+ destination < min
+ || destination === first
+ || destination === second
+ || destination === third
+ ) {
+ destination--
+ if (destination < min) { destination = cupsLength }
+ }
+
+ const afterDestination = cups[destination].next
+ cups[destination].next = first
+ cups[third].next = afterDestination
+ current = cups[current].next
+}
+
+const res1 = cups[1].next
+const res2 = cups[res1].next
+
+console.log('Answer: ', res1 * res2)
+