y2024d13 gonna be honest here, I was too lazy to do part2 by myself. I could have done it but it wold have taken some time as I have to remember how to solve linear equations

This commit is contained in:
Fabian Schmidt 2024-12-13 14:01:07 +01:00
parent 548f1b3d73
commit fa842890ce
5 changed files with 1460 additions and 1 deletions

View File

@ -45,7 +45,7 @@ pub fn process_part1(input: &str, grid_size: (usize, usize)) -> i32 {
.sum()
}
pub fn process_part2(input: &str) -> i32 {
pub fn process_part2(_input: &str) -> i32 {
0
}

1279
y2024/resources/13_input.txt Normal file

File diff suppressed because it is too large Load Diff

27
y2024/src/bin/d13.rs Normal file
View File

@ -0,0 +1,27 @@
use std::{fs, time::Instant};
use utils::time::get_elapsed_string;
use y2024::days::d13;
fn main() {
let now = Instant::now();
println!("Part 1:");
part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
}
fn part1() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/13_input.txt")).unwrap();
println!("{}", d13::process_part1(&content));
}
fn part2() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/13_input.txt")).unwrap();
println!("{}", d13::process_part2(&content));
}

151
y2024/src/days/d13.rs Normal file
View File

@ -0,0 +1,151 @@
use core::panic;
#[derive(Debug, Clone, Copy)]
struct ClawMachine {
button_a: (i64, i64),
button_b: (i64, i64),
prize: (i64, i64),
}
impl ClawMachine {
fn parse(s: &str) -> Self {
let mut button_a = (0, 0);
let mut button_b = (0, 0);
let mut prize = (0, 0);
s.lines().for_each(|line| {
let (field, coords) = line.split_once(": ").unwrap();
if field == "Button A" {
let (x, y) = coords.split_once(", ").unwrap();
let x: i64 = x.split_once("+").unwrap().1.parse().unwrap();
let y: i64 = y.split_once("+").unwrap().1.parse().unwrap();
button_a = (x, y);
} else if field == "Button B" {
let (x, y) = coords.split_once(", ").unwrap();
let x: i64 = x.split_once("+").unwrap().1.parse().unwrap();
let y: i64 = y.split_once("+").unwrap().1.parse().unwrap();
button_b = (x, y);
} else if field == "Prize" {
let (x, y) = coords.split_once(", ").unwrap();
let x: i64 = x.split_once("=").unwrap().1.parse().unwrap();
let y: i64 = y.split_once("=").unwrap().1.parse().unwrap();
prize = (x, y);
} else {
panic!("Unknown machine information {line}");
}
});
Self {
button_a,
button_b,
prize,
}
}
fn correct(&mut self) {
self.prize.0 += 10000000000000;
self.prize.1 += 10000000000000;
}
fn parse_all(input: &str) -> Vec<Self> {
input.split("\n\n").map(Self::parse).collect()
}
//fn get_moves(&self) -> Option<(i64, i64)> {
// if self.prize.0 % self.button_b.0 == 0
// && self.prize.1 % self.button_b.1 == 0
// && self.prize.0 / self.button_b.0 == self.prize.1 / self.button_b.1
// {
// let b_moves = self.prize.0 / self.button_b.0;
// return Some((0, b_moves));
// }
// for b_presses in (1..=100).rev() {
// let after_b_moves = (self.button_b.0 * b_presses, self.button_b.1 * b_presses);
// if after_b_moves.0 < self.prize.0 && after_b_moves.1 < self.prize.1 {
// for a_presses in 1..=100 {
// let after_a_moves = (
// after_b_moves.0 + a_presses * self.button_a.0,
// after_b_moves.1 + a_presses * self.button_a.1,
// );
// if after_a_moves == self.prize {
// return Some((a_presses, b_presses));
// }
// }
// }
// }
// None
//}
}
pub fn process_part1(input: &str) -> i64 {
let machines = ClawMachine::parse_all(input);
machines
.iter()
.map(|machine| {
let p = machine.prize;
let a = machine.button_a;
let b = machine.button_b;
let bm = (p.1 * a.0 - p.0 * a.1) / (b.1 * a.0 - b.0 * a.1);
let am = (p.0 - bm * b.0) / a.0;
if p.0 != am * a.0 + bm * b.0 || p.1 != am * a.1 + bm * b.1 {
0
} else {
am * 3 + bm
}
})
.sum()
}
pub fn process_part2(input: &str) -> i64 {
let mut machines = ClawMachine::parse_all(input);
for machine in machines.iter_mut() {
machine.correct();
}
machines
.iter()
.map(|machine| {
let p = machine.prize;
let a = machine.button_a;
let b = machine.button_b;
let bm = (p.1 * a.0 - p.0 * a.1) / (b.1 * a.0 - b.0 * a.1);
let am = (p.0 - bm * b.0) / a.0;
if p.0 != am * a.0 + bm * b.0 || p.1 != am * a.1 + bm * b.1 {
0
} else {
am * 3 + bm
}
})
.sum()
}
#[cfg(test)]
mod tests {
use super::*;
const 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 part1() {
let result = process_part1(INPUT);
assert_eq!(result, 480);
}
#[test]
fn part2() {
let result = process_part2(INPUT);
assert_eq!(result, 0);
}
}

View File

@ -13,3 +13,5 @@ pub mod d10;
pub mod d11;
pub mod d12;
pub mod d13;