From 0b87cdfa2accc269e594bf1fd25a7f123808f93a Mon Sep 17 00:00:00 2001 From: alex <> Date: Thu, 5 Dec 2024 09:25:08 +0100 Subject: [PATCH] Day05 - part 1 --- src/day05.rs | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 2 + 2 files changed, 129 insertions(+) create mode 100644 src/day05.rs diff --git a/src/day05.rs b/src/day05.rs new file mode 100644 index 0000000..d7fd970 --- /dev/null +++ b/src/day05.rs @@ -0,0 +1,127 @@ +use std::error::Error; +use std::path::Path; +use std::collections::{HashMap, HashSet}; + +struct Puzzle { + order: HashMap>, + lines: Vec>, +} + +impl Puzzle { + pub fn new(input: &str) -> Self { + let (o, l) = input.split_once("\n\n").unwrap(); + + let mut order: HashMap> = HashMap::new(); + o.lines().for_each(|l| { + let o = l.split("|") + .map(|v| v.parse::().unwrap()) + .collect::>(); + let (before, after) = (o[0], o[1]); + order.entry(before).and_modify(|s| {s.insert(after);}).or_insert({ + let mut s = HashSet::new(); + s.insert(after); + s + }); + }); + + let lines = l.lines().map(|v| { + v.split(",").map(|x| x.parse::().unwrap()).collect::>() + }).collect::>>(); + + Self { + order, + lines, + } + } + + pub fn is_ordered(self: &Self, line: &[u32]) -> bool { + for i in 1..line.len() { + let v = &line[i]; + for before in &line[0..i] { + if self.order.get(v).is_some() && self.order.get(v).unwrap().contains(before) { + return false + } + } + } + true + } +} + +fn run_part1(input: &str) -> Result> { + println!("Running {} - part 1", get_day()); + + let puzzle = Puzzle::new(input); + + let res = puzzle.lines.iter() + .filter(|l| puzzle.is_ordered(l)) + .map(|l| l[l.len()/2]) + .sum(); + + Ok(res) +} + +fn run_part2(input: &str) -> Result> { + println!("Running {} - part 2", get_day()); + + Ok(0) +} + +pub fn run(input: &str) -> Result<(), Box> { + 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() +} + +#[cfg(test)] +mod tests { + use super::*; + + static TEXT_INPUT: &str = "\ +47|53 +97|13 +97|61 +97|47 +75|29 +61|13 +75|53 +29|13 +97|29 +53|29 +61|53 +97|53 +61|29 +47|13 +75|47 +97|75 +47|61 +75|61 +47|29 +75|13 +53|13 + +75,47,61,53,29 +97,61,53,29,13 +75,29,13 +75,97,47,61,53 +61,13,29 +97,13,75,29,47"; + + #[test] + fn test_part1() { + assert_eq!(143, run_part1(TEXT_INPUT).unwrap()); + } + + #[test] + fn test_part2() { + assert_eq!(0, run_part2(TEXT_INPUT).unwrap()); + } +} diff --git a/src/main.rs b/src/main.rs index 0a828f0..9760d8f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,7 @@ pub mod day01; pub mod day02; pub mod day03; pub mod day04; +pub mod day05; fn main() { let args: Vec = env::args().collect(); @@ -34,6 +35,7 @@ fn run(day: &str, input_file: &str) -> Result<(), Box> { "day02" => day02::run(&input)?, "day03" => day03::run(&input)?, "day04" => day04::run(&input)?, + "day05" => day05::run(&input)?, _ => return Err(format!("unknown or unimplemented day \"{day}\"").into()), } Ok(()) -- 2.39.5