use crate::common; use crate::common::Number; use std::io::{BufReader, Read}; use std::ops::Rem; pub(crate) fn run(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> { 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 } } }