diff --git a/data/examples/01.txt b/data/examples/01.txt new file mode 100644 index 0000000..5b04997 --- /dev/null +++ b/data/examples/01.txt @@ -0,0 +1,11 @@ +L68 +L30 +R48 +L5 +R60 +L55 +L1 +L99 +R14 +L82 + diff --git a/src/bin/01.rs b/src/bin/01.rs new file mode 100644 index 0000000..542b455 --- /dev/null +++ b/src/bin/01.rs @@ -0,0 +1,70 @@ +advent_of_code::solution!(1); + +pub fn part_one(input: &str) -> Option { + let mut rot = 50; + let mut num = 0; + input.lines().for_each(|l| { + let mut mult = 1; + if l.contains("L") { + mult = -1; + } + let mut chars = l.chars(); + chars.next(); + let curr = chars.as_str().parse().unwrap_or(0); + rot += mult * curr; + while rot >= 100 { + rot -= 100; + } + while rot < 0 { + rot += 100; + } + if rot == 0 { + num += 1; + } + }); + Some(num) +} + +pub fn part_two(input: &str) -> Option { + let mut new_lines = vec![]; + input.lines().for_each(|l| { + let mut chars = l.chars(); + let start = chars.next(); + let curr = chars.as_str().parse().unwrap_or(0); + if let Some(start_char) = start { + for _ in 0..curr { + new_lines.push(format!("{start_char}1")); + } + } + }); + part_one(&new_lines.join("\n")) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_part_one() { + let result = part_one(&advent_of_code::template::read_file("examples", DAY)); + assert_eq!(result, Some(3)); + } + + #[test] + fn test_part_two() { + let mut result = part_two(&advent_of_code::template::read_file("examples", DAY)); + assert_eq!(result, Some(6)); + + result = part_two("L1000"); + assert_eq!(result, Some(10)); + + result = part_two("L50"); + assert_eq!(result, Some(1)); + result = part_two("R50\nR50"); + assert_eq!(result, Some(1)); + result = part_two("R50\nL50"); + assert_eq!(result, Some(1)); + result = part_two("L50\nL50"); + assert_eq!(result, Some(1)); + } +}