Skip to content

Commit c3877ce

Browse files
committed
refactor: Simplify solution using iterators api for more elegancy
1 parent b5080a6 commit c3877ce

File tree

1 file changed

+19
-29
lines changed

1 file changed

+19
-29
lines changed

src/day02.rs

+19-29
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,26 @@
11
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
136
}
147

158
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;
3015
}
31-
}
32-
}
3316

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
3524
}
3625

3726
fn is_safe(levels: &[i32]) -> bool {
@@ -67,14 +56,15 @@ fn is_safe(levels: &[i32]) -> bool {
6756
is_safe
6857
}
6958

70-
fn extract_levels_from(report: &str) -> Vec<i32> {
59+
fn parse_levels(report: &str) -> Vec<i32> {
7160
let levels: Vec<i32> = report
7261
.split(" ")
7362
.map(|s| s.parse::<i32>().unwrap_or(0))
7463
.collect();
7564
levels
7665
}
7766

67+
#[derive(Debug)]
7868
enum Direction {
7969
Inc,
8070
Dec,

0 commit comments

Comments
 (0)