-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path16.js
121 lines (115 loc) · 2.65 KB
/
16.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
'use strict';
/**
* @param {string[]} fields
*/
function processFields(fields) {
const regex = /([^:]+): (\d+)-(\d+) or (\d+)-(\d+)/;
const processed = [];
fields.forEach(e=>{
const match = regex.exec(e);
processed.push([
match[1],
+match[2],
+match[3],
+match[4],
+match[5],
[],
]);
});
return processed;
}
/**
* @param {string} d
*/
const part1 = async d => {
const data = d.split('\n\n').map(e=>e.split('\n'));
data[0] = processFields(data[0]);
data[2].shift(); // Don't need the header
// convert tickets to number values
data[1] = data[1][1].split(',').map(e=>+e);
data[2] = data[2].map(e=>e.split(',').map(e=>+e));
const ret = data[2].reduce((p, e)=>{
const validIndexes = new Set();
e.forEach((e, i)=>{
data[0].forEach((f)=>{
if ((e >= f[1] && e <= f[2]) || (e >= f[3] && e <= f[4])) {
validIndexes.add(i);
}
});
});
validIndexes.forEach(i=>{
e[i] = 0;
});
return p + e.reduce((p, v) => p + v);
}, 0);
return ret;
};
/**
* @param {string} d
*/
const part2 = async d => {
const data = d.split('\n\n').map(e=>e.split('\n'));
data[0] = processFields(data[0]);
data[2].shift(); // Don't need the header
// convert tickets to number values
data[1] = data[1][1].split(',').map(e=>+e);
data[2] = data[2].map(e=>e.split(',').map(e=>+e)).filter((e)=>{
const f = e.slice(0);
const validIndexes = new Set();
f.forEach((e, i)=>{
data[0].forEach((f)=>{
if ((e >= f[1] && e <= f[2]) || (e >= f[3] && e <= f[4])) {
validIndexes.add(i);
}
});
});
validIndexes.forEach(i=>{
f[i] = 0;
});
return !f.reduce((p, v) => p + v, 0);
});
// Add our ticket to the list
data[2].push(data[1]);
// We only have valid tickets in our set now
// Go through and add possible list of items
data[0].forEach((e, i) => {
for (let x = 0; x < data[0].length; x++) {
data[0][i][5].push(x);
}
});
for (let i = 0; i < data[0].length; i++) {
let col = -1;
while (data[0][i][5].length > 0) {
const x = data[0][i][5].pop();
let valid = true;
for (let y = 0; valid && y < data[2].length; y++) {
if (!(
(data[2][y][x] >= data[0][i][1] && data[2][y][x] <= data[0][i][2]) ||
(data[2][y][x] >= data[0][i][3] && data[2][y][x] <= data[0][i][4])
)) {
// invalid, just toss it
valid = false;
break;
}
}
if (valid) {
col = x;
}
}
data[0][i][5] = col;
}
// Columns found! Time to get the answer for Part 2
let sum = 1;
for (let i = 0; i < data[0].length; i++) {
if (/^departure/.test(data[0][i][0])) {
sum *= data[1][data[0][i][5]];
}
}
// 213044139619 too low
// 6611856250609 too high
return sum;
};
module.exports = {
part1,
part2
};