niels 2 年 前
コミット
badc0b576c

+ 54 - 0
src/bin/day6.rs

@@ -0,0 +1,54 @@
+use std::collections::HashMap;
+
+use aoc2022_niels_overkamp::common::{self, AOCResult};
+
+const DAY: &str = "day6";
+
+fn main() -> Result<(), Box<dyn std::error::Error>> {
+    common::run(DAY, &run)
+}
+
+#[inline]
+fn all_unique(c1: u8, c2: u8, c3: u8, c4: u8) -> bool {
+    c1 != c2 && c1 != c3 && c1 != c4 && c2 != c3 && c2 != c4 && c3 != c4
+}
+
+pub fn run(input: &Vec<String>) -> AOCResult {
+    let s = input.get(0).ok_or("Empty imput")?;
+    let mut buf: [u8; 4] = [0,0,0,0];
+    let mut buf_i = 0;
+    let mut res = None;
+    for (c_i, c) in s.bytes().enumerate() {
+        if c_i >= 3 && all_unique(c, buf[(buf_i + 1) % 4], buf[(buf_i + 2) % 4], buf[(buf_i + 3) % 4]) {
+            res = Some(c_i + 1);
+            break
+        }
+        buf[buf_i] = c;
+        buf_i += 1;
+        buf_i %= 4;
+    }
+    let res1 = res.ok_or("No marker found")?;
+
+    let mut hashbuf: HashMap<u8, usize> = HashMap::new();
+    let mut res = None;
+    for (c_i, c) in s.bytes().enumerate() {
+        *hashbuf.entry(c).or_default() += 1;
+        if c_i >= 13 {
+            if hashbuf.values().all(|v| *v <= 1) {
+                res = Some(c_i + 1);
+                break;
+            }
+            let remove_key = s.as_bytes().get(c_i - 13).unwrap();
+            *hashbuf.get_mut(remove_key).unwrap() -= 1;
+        }
+    }
+
+    let res2 = res.ok_or("No message marker found")?;
+
+    Ok([Some(res1.to_string()), Some(res2.to_string())])
+}
+
+#[test]
+pub fn test_day6() {
+    assert!(common::run_test(DAY, &run))
+}

+ 2 - 0
test_inputs/day6-1.txt

@@ -0,0 +1,2 @@
+bvwbjplbgvbhsrlpgdmjqwftvncz
+5$23

+ 2 - 0
test_inputs/day6-2.txt

@@ -0,0 +1,2 @@
+nppdvjthqldpwncqszvftbrmjlhg
+6$23

+ 2 - 0
test_inputs/day6-3.txt

@@ -0,0 +1,2 @@
+nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg
+10$29

+ 2 - 0
test_inputs/day6-4.txt

@@ -0,0 +1,2 @@
+zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw
+11$26

+ 2 - 0
test_inputs/day6.txt

@@ -0,0 +1,2 @@
+mjqjpqmgbljsphdztnvjfqwrcgsmlb
+7$19