45 lines
1.2 KiB
Rust
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
|
|
}
|
|
}
|
|
}
|