From 43bf93773fdafe60bf7192e6811772acf4e277df Mon Sep 17 00:00:00 2001 From: Johannes Date: Fri, 13 Dec 2024 13:26:52 +0100 Subject: [PATCH] day 13 part 1 --- src/day13.rs | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + src/main.rs | 1 + 3 files changed, 74 insertions(+) create mode 100644 src/day13.rs diff --git a/src/day13.rs b/src/day13.rs new file mode 100644 index 0000000..30988c5 --- /dev/null +++ b/src/day13.rs @@ -0,0 +1,72 @@ +use std::{borrow::Borrow, fs::read_to_string}; + +use itertools::Itertools; +use regex::Regex; + +pub fn day_main() { + let input = read_to_string("input/day13.txt").unwrap(); + let input = input.trim(); + println!(" part1: {}", part1(input)); + println!(" part2: {}", part2(input)); +} + +type RiddleResult = u64; + +fn part1(input: &str) -> RiddleResult { + // Button A: X+30, Y+84 + // Button B: X+74, Y+60 + // Prize: X=2358, Y=2628 + let r = Regex::new( + r"Button A: X\+(\d+), Y\+(\d+) +Button B: X\+(\d+), Y\+(\d+) +Prize: X=(\d+), Y=(\d+)", + ) + .unwrap(); + r.captures_iter(input) + .map(|block| { + let (ax, ay, bx, by, px, py) = block + .iter() + .skip(1) + .map(|it| it.unwrap().as_str().parse::().unwrap()) + .collect_tuple() + .unwrap(); + let mut solution = None; + for a in 0..=100 { + for b in 0..=100 { + if a * ax + b * bx == px && a * ay + b * by == py { + let s = 3 * a + b; + if let Some(old) = solution { + if old > s { + solution = Some(s); + } + } else { + solution = Some(s); + } + } + } + } + solution.unwrap_or(0) + }) + .sum() +} + +fn part2(_input: &str) -> RiddleResult { + 0 +} + +#[cfg(test)] +mod test { + use super::{part1, part2}; + + const TEST_INPUT: &str = r""; + + #[test] + fn test1() { + assert_eq!(part1(TEST_INPUT), 0); + } + + #[test] + fn test2() { + assert_eq!(part2(TEST_INPUT), 0); + } +} diff --git a/src/lib.rs b/src/lib.rs index 1fd7d50..d4f41a6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,5 +10,6 @@ pub mod day09; pub mod day10; pub mod day11; pub mod day12; +pub mod day13; // PLACEHOLDER pub mod utils; diff --git a/src/main.rs b/src/main.rs index 71345d0..f1ac698 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,6 +17,7 @@ fn main() { (10, day10::day_main), (11, day11::day_main), (12, day12::day_main), + (13, day13::day_main), // PLACEHOLDER ]); let day: Option = args().nth(1).and_then(|a| a.parse().ok());