-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path09.js
83 lines (79 loc) · 1.66 KB
/
09.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
'use strict';
/**
* @param {string} d
*/
const part1 = async d => {
const data = d.split('\n').map(e => +e);
const preamble = 25;
const previousNumbers = data.slice(0, preamble);
let pos = preamble;
while (pos < data.length) {
let valid = false;
const sum = data[pos];
pos++;
for (let i = 0; i < previousNumbers.length - 1; i++) {
for (let j = i + 1; j < previousNumbers.length; j++) {
if (previousNumbers[i] + previousNumbers[j] == sum) {
valid = true;
}
}
}
if (!valid) {
return sum;
}
previousNumbers.push(sum);
previousNumbers.shift();
}
return null;
};
/**
* @param {string} d
*/
const part2 = async d => {
const data = d.split('\n').map(e => +e);
const preamble = 25;
const previousNumbers = data.slice(0, preamble);
let pos = preamble;
let invalid = 0;
while (pos < data.length) {
let valid = false;
const sum = data[pos];
for (let i = 0; i < previousNumbers.length - 1; i++) {
for (let j = i + 1; j < previousNumbers.length; j++) {
if (previousNumbers[i] + previousNumbers[j] == sum) {
valid = true;
}
}
}
if (!valid) {
invalid = sum;
break;
}
pos++;
previousNumbers.push(sum);
previousNumbers.shift();
}
// Find range for set that equals invalid value
let start = 0;
let end = 1;
let sum = data[start];
while (sum != invalid && end < pos) {
sum += data[end++];
if (sum > invalid) {
start++;
end = start + 1;
sum = data[start];
}
}
// Find min/max values
sum = data.slice(start, end).reduce((p,c) => {
p[0] = Math.min(p[0], c);
p[1] = Math.max(p[1], c);
return p;
}, [invalid,0]).reduce((p,c)=> p + c, 0);
return sum;
};
module.exports = {
part1,
part2
};