diff options
author | Toby Vincent <tobyv13@gmail.com> | 2022-12-06 15:02:14 -0600 |
---|---|---|
committer | Toby Vincent <tobyv13@gmail.com> | 2022-12-06 15:02:14 -0600 |
commit | 275fbb45b53225f4c456a9dc88c184fdd0568ff2 (patch) | |
tree | 996f48b074abb7f33372da86fe2c87340ce8fad8 /src/day_6.rs | |
parent | 889c5ff8d2c259865ddd60cd5cb0610b99e201a6 (diff) |
feat: impl day 6
Diffstat (limited to 'src/day_6.rs')
-rw-r--r-- | src/day_6.rs | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/day_6.rs b/src/day_6.rs new file mode 100644 index 0000000..f8f624f --- /dev/null +++ b/src/day_6.rs @@ -0,0 +1,75 @@ +use std::collections::HashSet; + +use anyhow::Result; + +const DAY: u8 = 6; +const INPUT: &str = include_str!("../input/day_6.txt"); + +fn get_window_pos(input: &str, win_size: usize) -> Option<usize> { + input + .as_bytes() + .windows(win_size) + .position(|set| { + let mut h = HashSet::new(); + for &c in set { + if !h.insert(c) { + return false; + } + } + true + }) + .map(|i| i + win_size) +} + +pub fn solve() -> Result<()> { + println!("day {}", DAY); + println!("part 1: {}", part_1(INPUT)?); + println!("part 2: {}", part_2(INPUT)?); + + Ok(()) +} + +pub fn part_1(input: &str) -> Result<usize> { + get_window_pos(input, 4).ok_or_else(|| anyhow::anyhow!("Failed to find item")) +} + +pub fn part_2(input: &str) -> Result<usize> { + get_window_pos(input, 14).ok_or_else(|| anyhow::anyhow!("Failed to find item")) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_part_1_example() -> Result<()> { + let tests = vec![ + ("mjqjpqmgbljsphdztnvjfqwrcgsmlb", 7), + ("bvwbjplbgvbhsrlpgdmjqwftvncz", 5), + ("nppdvjthqldpwncqszvftbrmjlhg", 6), + ("nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg", 10), + ("zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw", 11), + ]; + for test in tests { + assert_eq!(test.1, part_1(test.0)?); + } + + Ok(()) + } + + #[test] + fn test_part_2_example() -> Result<()> { + let tests = vec![ + ("mjqjpqmgbljsphdztnvjfqwrcgsmlb", 19), + ("bvwbjplbgvbhsrlpgdmjqwftvncz", 23), + ("nppdvjthqldpwncqszvftbrmjlhg", 23), + ("nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg", 29), + ("zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw", 26), + ]; + for test in tests { + assert_eq!(test.1, part_2(test.0)?); + } + + Ok(()) + } +} |