]> aoc.elinar.fr Git - aoc_2024/commitdiff
Day06 - part 1
authoralex <>
Fri, 6 Dec 2024 09:18:07 +0000 (10:18 +0100)
committeralex <>
Fri, 6 Dec 2024 09:18:07 +0000 (10:18 +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..9cd6be8
--- /dev/null
@@ -0,0 +1,114 @@
+use std::error::Error;
+use std::path::Path;
+use std::collections::HashMap;
+
+struct Puzzle {
+    map: HashMap<(isize, isize), char>,
+    start: (isize, isize),
+}
+
+impl Puzzle {
+    pub fn new(input: &str) -> Self {
+        let mut map: HashMap<(isize, isize), char> = HashMap::new();
+        let mut start: (isize, isize) = (-1, -1);
+
+        input.lines()
+            .enumerate()
+            .for_each(|(row, s)| {
+                s.chars()
+                    .enumerate()
+                    .for_each(|(col, c)| {
+                        map.insert((row as isize, col as isize), c);
+                        if c == '^' {
+                            start = (row as isize, col as isize);
+                        }
+                    });
+            });
+
+        Self {
+            map,
+            start,
+        }
+    }
+}
+
+pub fn run(input: &str) -> Result<(), Box<dyn Error>> {
+    let res = run_part1(&input)?;
+    println!("{res}");
+
+    let res = run_part2(&input)?;
+    println!("{res}");
+
+    Ok(())
+}
+
+fn get_day() -> String {
+    let filename = file!();
+    Path::new(filename).file_stem().unwrap().to_str().unwrap().to_string()
+}
+
+fn run_part1(input: &str) -> Result<u32, Box<dyn Error>> {
+    println!("Running {} - part 1", get_day());
+
+    let mut turn_right: HashMap<(isize, isize), (isize, isize)> = HashMap::new();
+    turn_right.insert((-1,0), (0,1));
+    turn_right.insert((0,1), (1,0));
+    turn_right.insert((1,0), (0,-1));
+    turn_right.insert((0,-1), (-1,0));
+
+    let puzzle = Puzzle::new(input);
+
+    let mut map = puzzle.map;
+    let mut pos: (isize, isize) = puzzle.start;
+    let mut dir: (isize, isize) = (-1, 0);
+    while map.contains_key(&pos) {
+        let mut c = map.get_mut(&pos).unwrap();
+        if "^.".contains(*c) {
+            *c = 'X';
+        }
+        if "#".contains(*c) {
+            pos = (pos.0 - dir.0, pos.1 - dir.1);
+            dir = *turn_right.get(&dir).unwrap();
+        }
+        pos = (pos.0 + dir.0, pos.1 + dir.1);
+    }
+
+    let res = map.into_iter()
+        .filter(|(_, c)| *c == 'X')
+        .count() as u32;
+
+    Ok(res)
+}
+
+fn run_part2(input: &str) -> Result<u32, Box<dyn Error>> {
+    println!("Running {} - part 2", get_day());
+
+    Ok(0)
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    static TEXT_INPUT: &str = "\
+....#.....
+.........#
+..........
+..#.......
+.......#..
+..........
+.#..^.....
+........#.
+#.........
+......#...";
+
+    #[test]
+    fn test_part1() {
+        assert_eq!(41, run_part1(TEXT_INPUT).unwrap());
+    }
+
+    #[test]
+    fn test_part2() {
+        assert_eq!(0, run_part2(TEXT_INPUT).unwrap());
+    }
+}
index 9760d8febafe3f4d867f06fca785bb3ec4de5f02..9d5ac55503bd8a5a182a9679710147c69fed1c57 100644 (file)
@@ -9,6 +9,7 @@ pub mod day02;
 pub mod day03;
 pub mod day04;
 pub mod day05;
+pub mod day06;
 
 fn main() {
     let args: Vec<String> = env::args().collect();
@@ -36,6 +37,7 @@ fn run(day: &str, input_file: &str) -> Result<(), Box<dyn Error>> {
         "day03" => day03::run(&input)?,
         "day04" => day04::run(&input)?,
         "day05" => day05::run(&input)?,
+        "day06" => day06::run(&input)?,
         _ => return Err(format!("unknown or unimplemented day \"{day}\"").into()),
     }
     Ok(())