Files
adventofcode24/day-07-rust/src/task1.rs
2024-12-07 11:46:54 +01:00

45 lines
1.2 KiB
Rust

use crate::common;
use crate::common::Number;
use std::io::{BufReader, Read};
use std::ops::Rem;
pub(crate) fn run<R: Read>(read: R) {
let mut reader = BufReader::new(read).bytes().peekable();
let mut total = 0;
while let Some((result, parts)) = common::read_input_line(&mut reader) {
if let Some(ops) = brute(result, &parts) {
println!("{:?} & {:?} => {}", ops, parts, result);
total += result;
}
}
println!("Result: {}", total);
}
fn brute(result: Number, parts: &[Number]) -> Option<Vec<char>> {
match parts.split_last() {
None => None,
Some((last, [])) => {
if result == *last {
Some(vec![])
} else {
None
}
}
Some((cur, parts)) => {
let test_result = result - cur;
if let Some(mut ops) = brute(test_result, parts) {
ops.push('+');
return Some(ops);
}
let test_result = result / cur;
if result.rem(cur) == 0 && let Some(mut ops) = brute(test_result, parts) {
ops.push('*');
return Some(ops);
}
None
}
}
}