From 03b22627ca28abaa8ce34877efb425721c331e63 Mon Sep 17 00:00:00 2001 From: Jonni Liljamo Date: Tue, 2 Dec 2025 12:43:27 +0200 Subject: [PATCH] feat: day1 part two --- crates/day1/src/main.rs | 102 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/crates/day1/src/main.rs b/crates/day1/src/main.rs index 947f601..9812bcd 100644 --- a/crates/day1/src/main.rs +++ b/crates/day1/src/main.rs @@ -47,6 +47,36 @@ fn one(input: &str) -> u16 { zeros } +fn two(input: &str) -> u16 { + let mut zeros: u16 = 0; + let mut pos: i16 = 50; + for ins in input.split("\n") { + // Last entry is all unused bytes. + if ins.len() > 10 { + continue; + } + + let (direction, amount_s) = ins.split_at(1); + let mut amount = amount_s.parse::().unwrap(); + + match direction { + "R" => {} + "L" => amount = -amount, + _ => unreachable!(), + } + + pos += amount; + if pos <= 0 && amount != pos { + zeros += 1; + } + let overflows = pos.abs() / 100; + zeros += overflows as u16; + pos = pos.rem_euclid(100); + } + + zeros +} + #[cfg(test)] mod test { use super::*; @@ -65,5 +95,77 @@ L82"#; #[test] fn example() { assert_eq!(one(EXAMPLE_INPUT), 3); + assert_eq!(two(EXAMPLE_INPUT), 6); + } + + #[test] + fn two_1000() { + assert_eq!(two("R1000"), 10); + } + + #[test] + fn two_basics() { + // Move to zero (!), move one left, should be at 99. + assert_eq!(two("L50\nL1"), 1); + // Move to 99, move one right, should be at zero (!). + assert_eq!(two("R49\nR1"), 1); + // Move to 5, move ten left (!), should be at 95, move 5 right, should be at zero (!). + assert_eq!(two("L45\nL10\nR5"), 2); + } + + #[test] + fn two_a() { + let input = r#"R50 +L1"#; + + assert_eq!(two(input), 1); + } + + #[test] + fn two_b() { + assert_eq!(two("L100"), 1); + } + + #[test] + fn two_c() { + assert_eq!(two("L120"), 1); + } + + #[test] + fn two_d() { + let input = r#"R250 +L1"#; + + assert_eq!(two(input), 3); + } + + #[test] + fn two_e() { + let input = r#"R400"#; + + assert_eq!(two(input), 4); + } + + #[test] + fn two_f() { + let input = r#"L250"#; + + assert_eq!(two(input), 3); + } + + #[test] + fn two_g() { + let input = r#"L50 +R200"#; + + assert_eq!(two(input), 3); + } + + #[test] + fn two_h() { + let input = r#"R38 +R17"#; + + assert_eq!(two(input), 1); } } -- 2.44.1