Day 6
authorGreg Burri <greg.burri@gmail.com>
Tue, 6 Dec 2022 12:29:37 +0000 (13:29 +0100)
committerGreg Burri <greg.burri@gmail.com>
Tue, 6 Dec 2022 12:29:37 +0000 (13:29 +0100)
src/day06.rs [new file with mode: 0644]
src/main.rs

diff --git a/src/day06.rs b/src/day06.rs
new file mode 100644 (file)
index 0000000..5f0556a
--- /dev/null
@@ -0,0 +1,43 @@
+pub fn first_marker_pos(signal: &str, n: usize) -> usize {
+    for (i, c) in signal.chars().collect::<Vec<char>>().windows(n).enumerate() {
+        if !contains_same_char(c) {
+            return i + n;
+        }
+    }
+    0
+}
+
+// Warning: O(n^2).
+fn contains_same_char(chars: &[char]) -> bool {
+    for i in 0..chars.len() {
+        for j in i+1..chars.len() {
+            if chars[i] == chars[j] {
+                return true;
+            }
+        }
+    }
+    false
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn part1() {
+        assert_eq!(first_marker_pos("mjqjpqmgbljsphdztnvjfqwrcgsmlb", 4), 7);
+        assert_eq!(first_marker_pos("bvwbjplbgvbhsrlpgdmjqwftvncz", 4), 5);
+        assert_eq!(first_marker_pos("nppdvjthqldpwncqszvftbrmjlhg", 4), 6);
+        assert_eq!(first_marker_pos("nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg", 4), 10);
+        assert_eq!(first_marker_pos("zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw", 4), 11);
+    }
+
+    #[test]
+    fn part2() {
+        assert_eq!(first_marker_pos("mjqjpqmgbljsphdztnvjfqwrcgsmlb", 14), 19);
+        assert_eq!(first_marker_pos("bvwbjplbgvbhsrlpgdmjqwftvncz", 14), 23);
+        assert_eq!(first_marker_pos("nppdvjthqldpwncqszvftbrmjlhg", 14), 23);
+        assert_eq!(first_marker_pos("nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg", 14), 29);
+        assert_eq!(first_marker_pos("zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw", 14), 26);
+    }
+}
\ No newline at end of file
index 8fbe072..056e7f5 100644 (file)
@@ -6,6 +6,7 @@ mod day02;
 mod day03;
 mod day04;
 mod day05;
+mod day06;
 
 fn day01() -> String {
     let f = fs::File::open("data/day01.input").unwrap();
@@ -39,6 +40,11 @@ fn day05() -> String {
     format!("part1: {}, part2: {}", day05::get_top_as_string(&stacks), day05::get_top_as_string(&stacks2))
 }
 
+fn day06() -> String {
+    let signals = fs::read_to_string("data/day06.input").unwrap();
+    format!("part1: {}, part2: {}", day06::first_marker_pos(&signals, 4), day06::first_marker_pos(&signals, 14))
+}
+
 fn format_micros(t: u128) -> String {
     if t < 10_000 {
         format!("{} μs", t)
@@ -63,6 +69,7 @@ fn main() {
         day03,
         day04,
         day05,
+        day06,
     );
 
     let args: Vec<String> = env::args().skip(1).collect();