-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path04.ts
53 lines (46 loc) · 1.6 KB
/
04.ts
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
import { getFileContent, getDataAsArray } from './utils.js';
interface Section {
firstFrom: number;
firstTo: number;
secondFrom: number;
secondTo: number;
}
const parseInput = (arr: string[]): Section[] => {
const regex = /(?<firstFrom>\d+)\-(?<firstTo>\d+),(?<secondFrom>\d+)\-(?<secondTo>\d+)/;
return arr.map(line => {
const { firstFrom, firstTo, secondFrom, secondTo } = line.match(regex)?.groups!;
return {
firstFrom: parseInt(firstFrom),
firstTo: parseInt(firstTo),
secondFrom: parseInt(secondFrom),
secondTo: parseInt(secondTo),
}
});
}
const isFullyContained = (pair: Section) => {
const firstLength = pair.firstTo - pair.firstFrom;
const secondLength = pair.secondTo - pair.secondFrom;
if(firstLength >= secondLength) {
return pair.firstFrom <= pair.secondFrom && pair.secondTo <= pair.firstTo;
}
return pair.secondFrom <= pair.firstFrom && pair.firstTo <= pair.secondTo;
}
const isPartiallyContained = (pair: Section) => {
if(pair.firstFrom <= pair.secondFrom) {
return pair.firstTo >= pair.secondFrom
}
return pair.secondTo >= pair.firstFrom
}
const first = (arr: Section[]) => {
const result = arr.filter(pair => isFullyContained(pair)).length;
console.log(result);
return result;
};
const second = (arr: Section[]) => {
const result = arr.filter(pair => isPartiallyContained(pair)).length;
console.log(result);
return result;
};
const data = parseInput(getDataAsArray(getFileContent('input.txt')));
console.assert(first(data) === 582, 'Not matching first part');
console.assert(second(data) === 893, 'Not matching second part');