]> aoc.elinar.fr Git - aoc_2023/commitdiff
Day04 - part 1
authoralex <null>
Mon, 4 Dec 2023 05:44:53 +0000 (06:44 +0100)
committeralex <null>
Mon, 4 Dec 2023 05:48:15 +0000 (06:48 +0100)
src/day04.rs [new file with mode: 0644]
src/main.rs

diff --git a/src/day04.rs b/src/day04.rs
new file mode 100644 (file)
index 0000000..cccff52
--- /dev/null
@@ -0,0 +1,80 @@
+use std::io::Read;
+use std::error::Error;
+use std::fs::File;
+
+pub fn run(input_file: &str) -> Result<(), Box<dyn Error>> {
+    let mut f = File::open(input_file)?;
+    let mut input = String::new();
+    f.read_to_string(&mut input)?;
+
+    let res = run_part1(&input)?;
+    println!("{res}");
+
+    let res = run_part2(&input)?;
+    println!("{res}");
+
+    Ok(())
+}
+
+fn run_part1(input: &str) -> Result<u32, Box<dyn Error>> {
+    println!("Running day04 - part 1");
+
+    let mut res = 0;
+
+    input.lines()
+        .for_each(|l| {
+            let (numbers, winning) = l.split_once(": ").unwrap().1.split_once(" | ").unwrap();
+            let winning: Vec<&str> = winning.split(' ')
+                .filter(|w| !w.is_empty())
+                .collect();
+            //println!("winning: {:?}", winning);
+            let n_win: u32 = numbers.trim().split(' ')
+                .filter(|n| !n.is_empty() && winning.contains(n))
+                .map(|_| 1)
+                .sum();
+            //println!("n_win: {:?}", n_win);
+            if n_win > 0 {
+                res += 2_u32.pow(n_win - 1);
+            }
+        });
+    Ok(res)
+}
+
+fn run_part2(input: &str) -> Result<u32, Box<dyn Error>> {
+    println!("Running day04 - part 2");
+    let res = 0;
+    Ok(res)
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn day04_part1() {
+        let input = "\
+Card 1: 41 48 83 86 17 | 83 86  6 31 17  9 48 53
+Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19
+Card 3:  1 21 53 59 44 | 69 82 63 72 16 21 14  1
+Card 4: 41 92 73 84 69 | 59 84 76 51 58  5 54 83
+Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36
+Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11";
+        let res = run_part1(&input);
+        assert_eq!(13, res.unwrap());
+    }
+
+    #[test]
+    fn day04_part1_whitespace() {
+        let input = "\
+Card 1: 41 48 83 86  9 17 | 83 86  6 31 17  9 48 53";
+        let res = run_part1(&input);
+        assert_eq!(16, res.unwrap());
+    }
+
+    #[test]
+    fn day04_part2() {
+        let input = "";
+        let res = run_part2(&input);
+        assert_eq!(0, res.unwrap());
+    }
+}
index 2c9b7c0013c6e2fa28f8b256ad2705f7e335a744..2afbdc453a10f9a3ad6736609ef69a3e44109c70 100644 (file)
@@ -6,6 +6,7 @@ pub mod day00;
 pub mod day01;
 pub mod day02;
 pub mod day03;
+pub mod day04;
 
 fn main() {
     let args: Vec<String> = env::args().collect();
@@ -27,6 +28,7 @@ fn run(day: &str, input_file: &str) -> Result<(), Box<dyn Error>> {
         "day01" => day01::run(input_file)?,
         "day02" => day02::run(input_file)?,
         "day03" => day03::run(input_file)?,
+        "day04" => day04::run(input_file)?,
         _ => return Err(format!("unknown day \"{day}\"").into()),
     }
     Ok(())