From: alex <> Date: Fri, 13 Dec 2024 10:26:20 +0000 (+0100) Subject: Day13 - part 1 X-Git-Url: https://aoc.elinar.fr/?a=commitdiff_plain;h=4448fa4fb96cd763a1342eefdbaf651708de1012;p=aoc_2024 Day13 - part 1 --- diff --git a/src/day13.rs b/src/day13.rs new file mode 100644 index 0000000..0c3aa22 --- /dev/null +++ b/src/day13.rs @@ -0,0 +1,95 @@ +use std::error::Error; +use std::path::Path; + +fn extract_values(line: &str) -> (i32, i32) { + let (_, xy) = line.split_once(":").unwrap(); + let (x, y) = xy.split_once(",").unwrap(); + let x = x[3..x.len()].parse::().unwrap(); + let y = y[3..y.len()].parse::().unwrap(); + (x, y) +} + +fn run_part1(input: &str) -> Result> { + println!("Running {} - part 1", get_day()); + + let res: u32 = input.split("\n\n") + .map(|list| { + let list: Vec<_> = list.lines().collect(); + let (xa, ya) = extract_values(list[0]); + let (xb, yb) = extract_values(list[1]); + let (xp, yp) = extract_values(list[2]); + let det = xa*yb - ya*xb; + match det { + 0 => 0, + _ => { + let an = yb*xp - xb*yp; + let bn = xa*yp - ya*xp; + if an % det !=0 || bn % det !=0 { + 0 + } + else { + let a = an / det; + let b = bn / det; + (a*3 + b) as u32 + } + } + } + }) + .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 = "\ +Button A: X+94, Y+34 +Button B: X+22, Y+67 +Prize: X=8400, Y=5400 + +Button A: X+26, Y+66 +Button B: X+67, Y+21 +Prize: X=12748, Y=12176 + +Button A: X+17, Y+86 +Button B: X+84, Y+37 +Prize: X=7870, Y=6450 + +Button A: X+69, Y+23 +Button B: X+27, Y+71 +Prize: X=18641, Y=10279 +"; + + #[test] + fn test_part1() { + assert_eq!(480, 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 0e0f455..9f925bf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,6 +16,7 @@ pub mod day09; pub mod day10; pub mod day11; pub mod day12; +pub mod day13; fn main() { let args: Vec = env::args().collect(); @@ -50,6 +51,7 @@ fn run(day: &str, input_file: &str) -> Result<(), Box> { "day10" => day10::run(&input)?, "day11" => day11::run(&input)?, "day12" => day12::run(&input)?, + "day13" => day13::run(&input)?, _ => return Err(format!("unknown or unimplemented day \"{day}\"").into()), } Ok(())