This commit is contained in:
Aaron Manning 2024-12-07 18:38:11 +11:00
parent 6f3efd0b26
commit d7fbfa44e1
4 changed files with 92 additions and 0 deletions

7
day-07/Cargo.lock generated Normal file
View File

@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "day-07"
version = "0.1.0"

6
day-07/Cargo.toml Normal file
View File

@ -0,0 +1,6 @@
[package]
name = "day-07"
version = "0.1.0"
edition = "2021"
[dependencies]

78
day-07/src/main.rs Normal file
View File

@ -0,0 +1,78 @@
const INPUT: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/input.txt"));
fn main() {
let eqns = INPUT.lines().map(|line| {
let (test, operands) = line.split_once(':').unwrap();
let test = test.parse::<u64>().unwrap();
let operands = operands
.trim_start_matches(':')
.split_whitespace()
.map(|num| num.parse::<u64>().unwrap())
.collect::<Vec<_>>();
(test, operands)
});
{
let mut total = 0;
for (test, operands) in eqns.clone() {
if let Some((start, rest)) = operands.split_first() {
total += u64::from(check_matches(*start, test, rest, false)) * test;
}
}
println!("Part 1: {}", total);
}
{
let mut total = 0;
for (test, operands) in eqns {
if let Some((start, rest)) = operands.split_first() {
total += u64::from(check_matches(*start, test, rest, true)) * test;
}
}
println!("Part 2: {}", total);
}
}
fn check_matches(curr: u64, test: u64, operands: &[u64], include_concat: bool) -> bool {
match operands.split_first() {
Some((first, rest)) => {
check_matches(curr + first, test, rest, include_concat)
|| check_matches(curr * first, test, rest, include_concat)
|| (include_concat && check_matches(concat(curr, *first), test, rest, include_concat))
}
None => {
curr == test
}
}
}
fn concat(left: u64, right: u64) -> u64 {
left * 10u64.pow(digits(right)) + right
}
pub (crate) fn digits(mut number: u64) -> u32 {
if number < 100 {
if number < 10 {
1
} else {
2
}
} else if number < 1000 {
3
} else if number < 10000 {
4
} else {
number /= 10000;
let mut digits = 4;
while number != 0 {
number /= 10;
digits += 1;
}
digits
}
}

1
day-07/src/out.txt Normal file
View File

@ -0,0 +1 @@
Part 1: 456565678667482