From 850c0f8a42f07bb97f68c11fa9cc5ee8ea96ecc7 Mon Sep 17 00:00:00 2001 From: Adrian Groh Date: Thu, 5 Dec 2024 09:48:30 +0100 Subject: [PATCH] Add day5 --- day5/Cargo.lock | 7 +++++ day5/Cargo.toml | 6 +++++ day5/src/main.rs | 67 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 day5/Cargo.lock create mode 100644 day5/Cargo.toml create mode 100644 day5/src/main.rs diff --git a/day5/Cargo.lock b/day5/Cargo.lock new file mode 100644 index 0000000..c640100 --- /dev/null +++ b/day5/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "day5" +version = "0.1.0" diff --git a/day5/Cargo.toml b/day5/Cargo.toml new file mode 100644 index 0000000..49bdb49 --- /dev/null +++ b/day5/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "day5" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/day5/src/main.rs b/day5/src/main.rs new file mode 100644 index 0000000..f98ac3f --- /dev/null +++ b/day5/src/main.rs @@ -0,0 +1,67 @@ +struct ParsedInput { + rules: Vec<(u32, u32)>, + pages: Vec>, +} + +fn parse(input: &str) -> ParsedInput { + let (rules, pages) = input.split_once("\n\n").unwrap(); + ParsedInput { + rules: rules + .lines() + .map(|line| line.split_once('|').unwrap()) + .map(|(n1, n2)| (n1.parse().unwrap(), n2.parse().unwrap())) + .collect(), + pages: pages + .lines() + .map(|line| line.split(',').map(|n| n.parse().unwrap()).collect()) + .collect(), + } +} + +fn all_rules_apply(rules: &[(u32, u32)], page: &[u32]) -> bool { + rules.iter().all(|rule| { + let Some(first) = page.iter().enumerate().find(|(_, e)| e == &&rule.0) else { + return true; + }; + let Some(second) = page.iter().enumerate().find(|(_, e)| e == &&rule.1) else { + return true; + }; + first.0 < second.0 + }) +} + +fn part1(parsed_input: &ParsedInput) -> u32 { + parsed_input + .pages + .iter() + .filter(|page| all_rules_apply(&parsed_input.rules, page)) + .map(|rule| rule[rule.len() / 2]) + .sum() +} + +fn part2(parsed_input: &ParsedInput) -> u32 { + parsed_input + .pages + .iter() + .filter(|page| !all_rules_apply(&parsed_input.rules, page)) + .fold(vec![], |mut acc, curr| { + let mut corrected_page = curr.clone(); + corrected_page.sort_unstable_by(|a, b| { + match all_rules_apply(&parsed_input.rules, &[*a, *b]) { + true => std::cmp::Ordering::Less, + false => std::cmp::Ordering::Greater, + } + }); + acc.push(corrected_page); + acc + }) + .iter() + .map(|rule| rule[rule.len() / 2]) + .sum() +} + +fn main() { + let input = parse(include_str!("../input.txt")); + println!("{}", part1(&input)); + println!("{}", part2(&input)); +}