|
1 | 1 | pub fn solve_part1(input: &str) -> i32 {
|
2 |
| - let reports = input.lines(); |
3 |
| - |
4 |
| - let mut safe_reports = 0; |
5 |
| - for report in reports { |
6 |
| - let levels = extract_levels_from(report); |
7 |
| - if is_safe(&levels) { |
8 |
| - safe_reports += 1; |
9 |
| - } |
10 |
| - } |
11 |
| - |
12 |
| - safe_reports |
| 2 | + input |
| 3 | + .lines() |
| 4 | + .filter(|report| is_safe(&parse_levels(report))) |
| 5 | + .count() as i32 |
13 | 6 | }
|
14 | 7 |
|
15 | 8 | pub fn solve_part2(input: &str) -> i32 {
|
16 |
| - let reports = input.lines(); |
17 |
| - |
18 |
| - let mut safe_reports = 0; |
19 |
| - for report in reports { |
20 |
| - let levels = extract_levels_from(report); |
21 |
| - if is_safe(&levels) { |
22 |
| - safe_reports += 1; |
23 |
| - continue; |
24 |
| - } |
25 |
| - |
26 |
| - for i in 0..levels.len() { |
27 |
| - if is_safe(&[&levels[..i], &levels[i + 1..]].concat()) { |
28 |
| - safe_reports += 1; |
29 |
| - break; |
| 9 | + input |
| 10 | + .lines() |
| 11 | + .filter(|report| { |
| 12 | + let levels = parse_levels(report); |
| 13 | + if is_safe(&levels) { |
| 14 | + return true; |
30 | 15 | }
|
31 |
| - } |
32 |
| - } |
33 | 16 |
|
34 |
| - safe_reports |
| 17 | + // Check if removing one element results in a safe sequence |
| 18 | + (0..levels.len()).any(|i| { |
| 19 | + let (left, right) = levels.split_at(i); |
| 20 | + is_safe(&[left, &right[1..]].concat()) //always leave out first element from right |
| 21 | + }) |
| 22 | + }) |
| 23 | + .count() as i32 |
35 | 24 | }
|
36 | 25 |
|
37 | 26 | fn is_safe(levels: &[i32]) -> bool {
|
@@ -67,14 +56,15 @@ fn is_safe(levels: &[i32]) -> bool {
|
67 | 56 | is_safe
|
68 | 57 | }
|
69 | 58 |
|
70 |
| -fn extract_levels_from(report: &str) -> Vec<i32> { |
| 59 | +fn parse_levels(report: &str) -> Vec<i32> { |
71 | 60 | let levels: Vec<i32> = report
|
72 | 61 | .split(" ")
|
73 | 62 | .map(|s| s.parse::<i32>().unwrap_or(0))
|
74 | 63 | .collect();
|
75 | 64 | levels
|
76 | 65 | }
|
77 | 66 |
|
| 67 | +#[derive(Debug)] |
78 | 68 | enum Direction {
|
79 | 69 | Inc,
|
80 | 70 | Dec,
|
|
0 commit comments