-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday02.rs
64 lines (55 loc) · 1.5 KB
/
day02.rs
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
type Report = Vec<i64>;
pub fn parse(input_data: String) -> Vec<Report> {
input_data
.lines()
.map(|line| {
line.trim()
.split_whitespace()
.map(|level| level.parse::<i64>().expect("Invalid input data."))
.collect()
})
.collect()
}
fn is_report_safe(report: &Report) -> bool {
let mut increasing = None;
report
.windows(2)
.map(|pair| (pair[0], pair[1]))
.all(|pair| {
let (current, next) = pair;
let diff = next - current;
if diff.abs() > 3 || diff == 0 {
return false;
}
if let Some(increasing) = increasing {
if increasing != (diff > 0) {
return false;
}
} else {
increasing = Some(diff > 0)
}
true
})
}
pub fn part_1(reports: &[Report]) -> i64 {
reports
.iter()
.filter(|report| is_report_safe(report))
.count() as i64
}
pub fn part_2(reports: &[Report]) -> i64 {
reports
.iter()
.filter(|&report| {
if is_report_safe(report) {
true
} else {
report.iter().enumerate().any(|(i, _)| {
let mut new_report = report.clone();
new_report.remove(i);
is_report_safe(&new_report)
})
}
})
.count() as i64
}