-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday2.ts
73 lines (61 loc) · 1.55 KB
/
day2.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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import { input } from './input';
const reps = input.split('\n').map((r) => {
return r.split(' ').map((n) => Number.parseInt(n));
});
// The levels are either all increasing or all decreasing.
// Any two adjacent levels differ by at least one and at most three.
function part1(reports: number[][]) {
let unSafeCount: number = 0;
for (let r of reports) {
const a = r[0];
const b = r[1];
const inc = b > a;
for (let i = 1; i < r.length; i++) {
const diff = (inc ? -1 : 1) * (r[i - 1] - r[i]);
if (diff < 1 || diff > 3) {
unSafeCount++;
break;
}
}
}
return reports.length - unSafeCount;
}
function part2(reports: number[][]) {
function check(
row: number[],
inc: boolean,
prev: number,
cur: number,
hasFix: boolean,
): boolean {
if (cur > row.length) {
return true;
}
const diff = (inc ? -1 : 1) * (row[prev] - row[cur]);
if (diff < 1 || diff > 3) {
if (hasFix) {
return false;
}
return (
// skip current or skip previous
check(row, inc, prev, cur + 1, true) ||
check(row, inc, prev - 1, cur, true)
);
}
return check(row, inc, cur, cur + 1, hasFix);
}
let unSafeCount: number = 0;
for (let r of reports) {
if (
!check(r, true, 0, 1, false) &&
!check(r, false, 0, 1, false) &&
!check(r, true, 1, 2, true) &&
!check(r, false, 1, 2, true)
) {
unSafeCount++;
}
}
return reports.length - unSafeCount;
}
console.log(part1(reps));
console.log(part2(reps));