Skip to content

Commit fc92504

Browse files
committed
Implement solutions for Day 13
1 parent 15929f5 commit fc92504

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

data/examples/13.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
Button A: X+94, Y+34
2+
Button B: X+22, Y+67
3+
Prize: X=8400, Y=5400
4+
5+
Button A: X+26, Y+66
6+
Button B: X+67, Y+21
7+
Prize: X=12748, Y=12176
8+
9+
Button A: X+17, Y+86
10+
Button B: X+84, Y+37
11+
Prize: X=7870, Y=6450
12+
13+
Button A: X+69, Y+23
14+
Button B: X+27, Y+71
15+
Prize: X=18641, Y=10279

src/bin/13.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
use regex::Regex;
2+
3+
advent_of_code::solution!(13);
4+
5+
#[rustfmt::skip]
6+
pub fn part_one(input: &str) -> Option<u64> {
7+
Some(input.split("\n\n").map(|machine|{Regex::new(r"(?s)(\d+).+\+(\d+).+\+(\d+).+\+(\d+).+=(\d+).+=(\d+)").unwrap().captures(machine).unwrap().iter().skip(1).map(|n|n.unwrap().as_str().parse::<f64>().unwrap()).collect::<Vec<_>>()}).map(|m|{let b=(m[5]*m[0]-m[4]*m[1])/(m[0]*m[3]-m[2]*m[1]);if b.fract()==0.0{let a=(m[4]-b*m[2])/m[0];return if a.fract()==0.0{(3.0*a+b)as u64}else{0}}0}).sum())
8+
}
9+
10+
const D: f64 = 10000000000000.0;
11+
12+
#[rustfmt::skip]
13+
pub fn part_two(input: &str) -> Option<u64> {
14+
Some(input.split("\n\n").map(|machine|{Regex::new(r"(?s)(\d+).+\+(\d+).+\+(\d+).+\+(\d+).+=(\d+).+=(\d+)").unwrap().captures(machine).unwrap().iter().skip(1).map(|n|n.unwrap().as_str().parse::<f64>().unwrap()).collect::<Vec<_>>()}).map(|m|{let b=((D+m[5])*m[0]-(D+m[4])*m[1])/(m[0]*m[3]-m[2]*m[1]);if b.fract()==0.0{let a=((D+m[4])-b*m[2])/m[0];return if a.fract()==0.0{(3.0*a+b)as u64}else{0}}0}).sum())
15+
}
16+
17+
#[cfg(test)]
18+
mod tests {
19+
use super::*;
20+
21+
#[test]
22+
fn test_part_one() {
23+
let result = part_one(&advent_of_code::template::read_file("examples", DAY));
24+
assert_eq!(result, Some(480));
25+
}
26+
27+
#[test]
28+
fn test_part_two() {
29+
let result = part_two(&advent_of_code::template::read_file("examples", DAY));
30+
assert_eq!(result, Some(875318608908));
31+
}
32+
}

0 commit comments

Comments
 (0)