From c215e809dce25d9d02b295b073843daef89f345e Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 4 Dec 2023 06:44:53 +0100 Subject: [PATCH] Day04 - part 1 --- src/day04.rs | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 2 ++ 2 files changed, 82 insertions(+) create mode 100644 src/day04.rs diff --git a/src/day04.rs b/src/day04.rs new file mode 100644 index 0000000..cccff52 --- /dev/null +++ b/src/day04.rs @@ -0,0 +1,80 @@ +use std::io::Read; +use std::error::Error; +use std::fs::File; + +pub fn run(input_file: &str) -> Result<(), Box> { + 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> { + 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> { + 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()); + } +} diff --git a/src/main.rs b/src/main.rs index 2c9b7c0..2afbdc4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ pub mod day00; pub mod day01; pub mod day02; pub mod day03; +pub mod day04; fn main() { let args: Vec = env::args().collect(); @@ -27,6 +28,7 @@ fn run(day: &str, input_file: &str) -> Result<(), Box> { "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(()) -- 2.39.5