diff --git a/src/day5.rs b/src/day5.rs index 5fdb276..a8fb47c 100644 --- a/src/day5.rs +++ b/src/day5.rs @@ -54,3 +54,31 @@ pub fn solve_d5_p1(input: &[u8]) -> SeatId { .max() .unwrap() } + +#[aoc(day5, part2)] +pub fn solve_d5_p2(input: &[u8]) -> SeatId { + #[derive(Debug)] + struct MinMaxSum { + min: u16, + max: u16, + sum: u32, + } + let MinMaxSum { min, max, sum } = input + .split(|&b| b == b'\n') + .map(|i| SeatId::parse(i).unwrap()) + .fold( + MinMaxSum { + min: u16::MAX, + max: 0, + sum: 0, + }, + |MinMaxSum { min, max, sum }, seatid| MinMaxSum { + min: std::cmp::min(min, seatid.0), + max: std::cmp::max(max, seatid.0), + sum: sum + seatid.0 as u32, + }, + ); + let num_seats = max as u32 - min as u32 + 1; + let expected_sum = (max + min) as u32 * num_seats / 2; + SeatId((expected_sum - sum) as u16) +}