-
Notifications
You must be signed in to change notification settings - Fork 0
/
part-1.js
67 lines (53 loc) · 1.76 KB
/
part-1.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
/*
Start by determining which nearby tickets are completely invalid; these are
tickets that contain values which aren't valid for any field.
Adding together all of the invalid values produces your ticket scanning error
rate. What is your ticket scanning error rate?
*/
import readFile from '../read-file.js';
const parseFieldRange = (rangeText) => {
const [low, high] = rangeText.split('-').map(Number);
return { low, high };
};
const parseFieldRule = (line) => {
const [name, rangesText] = line.split(': ');
const ranges = rangesText.split(' or ').map(parseFieldRange);
return { name, ranges };
};
const parseTicket = (line) => line.split(',').map(Number);
const fieldRules = [];
// let myTicket;
const nearbyTickets = [];
let parseMode = 'field rule';
await readFile(new URL('./input.txt', import.meta.url), (line) => {
switch (parseMode) {
case 'field rule':
if (line.length > 0) fieldRules.push(parseFieldRule(line));
else parseMode = 'your ticket label';
break;
case 'your ticket label':
parseMode = 'your ticket';
break;
case 'your ticket':
// if (line.length > 0) myTicket = parseTicket(line);
// else parseMode = 'nearby tickets label';
if (line.length === 0) parseMode = 'nearby tickets label';
break;
case 'nearby tickets label':
parseMode = 'nearby tickets';
break;
case 'nearby tickets':
nearbyTickets.push(parseTicket(line));
break;
// no default
}
});
const isValueValidForAnyRule = (value) =>
fieldRules.some((rule) =>
rule.ranges.some((range) => value >= range.low && value <= range.high)
);
const result = nearbyTickets
.flat()
.filter((value) => !isValueValidForAnyRule(value))
.reduce((acc, value) => acc + value);
console.log(result);