Skip to content

Commit 1d37fa3

Browse files
Day 2
1 parent 09701e3 commit 1d37fa3

File tree

3 files changed

+91
-0
lines changed

3 files changed

+91
-0
lines changed

data/examples/02.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
7 6 4 2 1
2+
1 2 7 8 9
3+
9 7 6 2 1
4+
1 3 2 4 5
5+
8 6 4 4 1
6+
1 3 6 7 9

src/bin/02.rs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
use advent_of_code::template::parse::splitn;
2+
3+
advent_of_code::solution!(2);
4+
5+
pub fn part_one(input: &str) -> Option<u32> {
6+
Some(
7+
splitn::<u32>(input)
8+
.map(|report| {
9+
if report.len() < 2 {
10+
1
11+
} else {
12+
let increase = report[0] < report[1];
13+
if report
14+
.iter()
15+
.zip(report[1..].iter())
16+
.all(|(&a, &b)| (1..=3).contains(&a.abs_diff(b)) && (a < b) == increase)
17+
{
18+
1
19+
} else {
20+
0
21+
}
22+
}
23+
})
24+
.sum(),
25+
)
26+
}
27+
28+
pub fn part_two(input: &str) -> Option<u32> {
29+
Some(
30+
splitn::<u32>(input)
31+
.map(|report| {
32+
if report.len() < 3 {
33+
1
34+
} else {
35+
let mut sub = vec![];
36+
if (0..report.len()).any(|bad_idx| {
37+
sub.clear();
38+
sub.extend_from_slice(&report[..bad_idx]);
39+
sub.extend_from_slice(&report[(bad_idx + 1)..]);
40+
let increase = sub[0] < sub[1];
41+
sub.iter()
42+
.zip(sub[1..].iter())
43+
.all(|(&a, &b)| (1..=3).contains(&a.abs_diff(b)) && (a < b) == increase)
44+
}) {
45+
1
46+
} else {
47+
0
48+
}
49+
}
50+
})
51+
.sum(),
52+
)
53+
}
54+
55+
#[cfg(test)]
56+
mod tests {
57+
use super::*;
58+
59+
#[test]
60+
fn test_part_one() {
61+
let result = part_one(&advent_of_code::template::read_file("examples", DAY));
62+
assert_eq!(result, Some(2));
63+
}
64+
65+
#[test]
66+
fn test_part_two() {
67+
let result = part_two(&advent_of_code::template::read_file("examples", DAY));
68+
assert_eq!(result, Some(4));
69+
}
70+
}

src/template/parse.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,21 @@ pub fn split5<
148148
})
149149
}
150150

151+
/// Parse some number items from each line, separated by ASCII whitespace
152+
pub fn splitn<'a, T: MyFromStr<'a>>(input: &'a str) -> impl 'a + Iterator<Item = Vec<T>> {
153+
lines(input).filter_map(|line| {
154+
let mut parts = line.split_ascii_whitespace();
155+
let Some(part0) = parts.next() else {
156+
// skip blank lines
157+
cold();
158+
return None;
159+
};
160+
let mut vec = vec![part0.my_parse().unwrap()];
161+
vec.extend(parts.map(|part| part.my_parse().unwrap()));
162+
Some(vec)
163+
})
164+
}
165+
151166
#[cfg(test)]
152167
mod tests {
153168
use super::*;

0 commit comments

Comments
 (0)