Skip to content

Commit 3ab24d3

Browse files
committed
2025 02.2
1 parent 9f5e1fa commit 3ab24d3

File tree

1 file changed

+40
-8
lines changed

1 file changed

+40
-8
lines changed

src/aoc/y2025/day02.rs

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,25 @@ use std::ops::RangeInclusive;
1212
use itertools::Itertools;
1313
use num::Integer;
1414

15-
use crate::AoCError;
15+
use crate::{AoCError, AoCResult};
1616

17-
pub fn part_1(data: crate::DataIn) -> crate::AoCResult<String> {
17+
fn rangify(data: crate::DataIn) -> AoCResult<Vec<RangeInclusive<u64>>> {
1818
// damn references
1919
let lines = data.collect_vec();
20-
let ranges: Vec<RangeInclusive<u64>> = lines
20+
lines
2121
.iter()
2222
.flat_map(|line| line.split(','))
2323
.map(|raw| {
2424
raw.split_once('-')
2525
.ok_or_else(|| AoCError::new(format!("Line {raw} is missing a -!")))
2626
.and_then(|(start, end)| Ok((start.parse()?)..=(end.parse()?)))
2727
})
28-
.try_collect()?;
29-
30-
log::debug!("Collected ranges: {ranges:?}");
28+
.try_collect()
29+
.inspect(|ranges| log::debug!("Collected ranges: {ranges:?}"))
30+
}
3131

32-
let ret: u64 = ranges
32+
pub fn part_1(data: crate::DataIn) -> crate::AoCResult<String> {
33+
let ret: u64 = rangify(data)?
3334
.into_iter()
3435
.flat_map(|range| {
3536
range.filter(|num| {
@@ -50,12 +51,43 @@ pub fn part_1(data: crate::DataIn) -> crate::AoCResult<String> {
5051
Ok(ret.to_string())
5152
}
5253

54+
pub fn part_2(data: crate::DataIn) -> crate::AoCResult<String> {
55+
let ret: u64 = rangify(data)?
56+
.into_iter()
57+
.flat_map(|range| {
58+
range.filter(|num| {
59+
// safety: this string is made of numbers which are all going to be ascii
60+
// characters unless something has gone catastrophically wrong
61+
let numstr = num.to_string();
62+
let len = numstr.len();
63+
let max_len = len / 2;
64+
65+
// This takes 6 seconds but whatever 😭
66+
(1..=max_len).any(|size| {
67+
let substr = &numstr[0..size];
68+
numstr
69+
.chars()
70+
.chunks(size)
71+
.into_iter()
72+
.all(|window| window.collect::<String>() == substr)
73+
})
74+
})
75+
})
76+
.inspect(|serial| log::debug!("Found invalid serial number {serial}"))
77+
.sum();
78+
79+
Ok(ret.to_string())
80+
}
81+
5382
inventory::submit!(crate::AoCDay {
5483
year: "2025",
5584
day: "2",
5685
part_1: crate::AoCPart {
5786
main: part_1,
5887
example: part_1
5988
},
60-
part_2: None
89+
part_2: Some(crate::AoCPart {
90+
main: part_2,
91+
example: part_2
92+
})
6193
});

0 commit comments

Comments
 (0)