summaryrefslogtreecommitdiffstats
path: root/src/day_6.rs
diff options
context:
space:
mode:
authorToby Vincent <tobyv13@gmail.com>2022-12-06 15:02:14 -0600
committerToby Vincent <tobyv13@gmail.com>2022-12-06 15:02:14 -0600
commit275fbb45b53225f4c456a9dc88c184fdd0568ff2 (patch)
tree996f48b074abb7f33372da86fe2c87340ce8fad8 /src/day_6.rs
parent889c5ff8d2c259865ddd60cd5cb0610b99e201a6 (diff)
feat: impl day 6
Diffstat (limited to 'src/day_6.rs')
-rw-r--r--src/day_6.rs75
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(())
+ }
+}