From ac6993466760572a65da71768361631bb8c2fd9c Mon Sep 17 00:00:00 2001 From: Johannes Date: Thu, 5 Dec 2024 09:34:20 +0100 Subject: [PATCH] day 5 part 1 --- src/day05.rs | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + src/main.rs | 1 + 3 files changed, 96 insertions(+) create mode 100644 src/day05.rs diff --git a/src/day05.rs b/src/day05.rs new file mode 100644 index 0000000..1b03fb7 --- /dev/null +++ b/src/day05.rs @@ -0,0 +1,94 @@ +use itertools::Itertools; +use std::fs::read_to_string; + +pub fn day_main() { + let input = read_to_string("input/day05.txt").unwrap(); + let input = input.trim(); + println!(" part1: {}", part1(input)); + println!(" part2: {}", part2(input)); +} + +type RiddleResult = usize; + +fn part1(input: &str) -> RiddleResult { + let (rules, books) = parse(input); + books.iter().filter(|book| { + valid_book(book, &rules) + }) + .inspect(|v| println!("{v:?}")) + .map(|book| book[book.len() / 2].parse::().unwrap()) + .inspect(|v| println!("{v:?}")) + .sum() +} + +fn valid_book(book: &[&str], rules: &[(&str, &str)]) -> bool { + for (i, a) in book.iter().enumerate() { + for b in book.iter().skip(i + 1) { + if rules.contains(&(b, a)) { + return false; + } + } + } + true +} + +fn parse(input: &str) -> (Vec<(&str, &str)>, Vec>) { + let (a, b) = input.split_once("\n\n").unwrap(); + let rules = a.lines().map(|line| line.split_once("|").unwrap()).collect_vec(); + let books = b.lines().map(|line| line.split(",").collect_vec()).collect_vec(); + + (rules, books) +} + +fn part2(input: &str) -> RiddleResult { + 0 +} + +#[cfg(test)] +mod test { + use crate::day05::valid_book; + + use super::{part1, part2}; + + const TEST_INPUT: &str = r"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 test1() { + assert!(valid_book(&vec!["97", "5", "13"], &vec![("97", "13")])); + assert!(!valid_book(&vec!["13", "5", "97"], &vec![("97", "13")])); + assert_eq!(part1(TEST_INPUT), 143); + } + + #[test] + fn test2() { +// assert_eq!(part2(TEST_INPUT), 9); + } +} diff --git a/src/lib.rs b/src/lib.rs index e051fbd..f290640 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,3 +2,4 @@ pub mod day01; pub mod day02; pub mod day03; pub mod day04; +pub mod day05; diff --git a/src/main.rs b/src/main.rs index 8c163e1..3e5c848 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,6 +9,7 @@ fn main() { (2, day02::day_main), (3, day03::day_main), (4, day04::day_main), + (5, day05::day_main), ]); let day: Option = args().nth(1).and_then(|a| a.parse().ok()); let Some(day) = day else {