-
Notifications
You must be signed in to change notification settings - Fork 0
/
day11.js
121 lines (105 loc) · 2.52 KB
/
day11.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
let fs = require("fs");
let inputFile = "./inputs/day11.txt";
let log = console.log;
function parse() {
return fs
.readFileSync(inputFile)
.toString()
.trim()
.split("\n")
.reduce((sevens, line, i) => {
if (i % 7 === 0) {
sevens.push([]);
}
sevens[sevens.length - 1].push(line);
return sevens;
}, [])
.map((seven) => {
let items = Array.from(seven[1].matchAll(/\d+/g)).map((m) =>
parseInt(m[0])
);
let op = {
op: seven[2].match(/[+*]/)[0],
val: parseInt(seven[2].match(/(old|\d+)$/)[0]),
};
let test = {
divisor: parseInt(seven[3].match(/\d+/)[0]),
pass: parseInt(seven[4].match(/\d+/)[0]),
fail: parseInt(seven[5].match(/\d+/)[0]),
};
return {
items,
op,
test,
business: 0,
};
});
}
const runInspect = (old, op) => {
let val = isNaN(op.val) ? old : op.val;
if (op.op === "*") {
return old * val;
} else {
// +
return old + val;
}
};
const releif = (item) => {
return Math.floor(item / 3);
};
const getNext = (item, test) => {
if (item % test.divisor) {
return test.fail;
}
return test.pass;
};
const getAns = (monkeys) => {
let [m1, m2] = monkeys.sort((a, b) => b.business - a.business);
return m1.business * m2.business;
};
function part1() {
let monkeys = parse();
for (let i = 0; i < 20; i++) {
monkeys.forEach((monkey) => {
while (monkey.items.length) {
let old = monkey.items.shift();
let item = runInspect(old, monkey.op);
monkey.business += 1;
item = releif(item);
let next = getNext(item, monkey.test);
monkeys[next].items.push(item);
}
});
}
log("part1", getAns(monkeys));
}
// lets get some code from stack overflow
function gcd(a,b){
var t = 0;
a < b && (t = b, b = a, a = t); // swap them if a < b
t = a%b;
return t ? gcd(b,t) : b;
}
function lcm(a,b){
return a/gcd(a,b)*b;
}
function part2() {
let monkeys = parse();
let rounds = 10000;
let LCM = monkeys.map(m => m.test.divisor).reduce((acc, item) => lcm(acc, item))
for (let i = 0; i < rounds; i++) {
monkeys.forEach((monkey) => {
while (monkey.items.length) {
let old = monkey.items.shift();
let item = runInspect(old, monkey.op);
monkey.business += 1;
item = item % LCM
let next = getNext(item, monkey.test);
monkeys[next].items.push(item);
}
});
}
log("part2", getAns(monkeys));
}
// part1()
part2();