#![allow(dead_code)] #![allow(unused_variables)] #![allow(unused_mut)] use std::env; use std::fs::File; use std::io::Read; fn rec(val: i64, acc: i64, mut eq: Vec) -> bool { if eq.len() == 0 { if val == acc { return true; } else { return false; } } let a = eq.pop().unwrap(); return rec(val, acc * a, eq.clone()) || rec(val, acc + a, eq.clone()); } fn rec2(val: i64, acc: i64, mut eq: Vec) -> bool { if eq.len() == 0 { if val == acc { return true; } else { return false; } } let a = eq.pop().unwrap(); return rec2(val, a + acc * 10_i64.pow(a.checked_ilog10().unwrap() + 1), eq.clone()) || rec2(val, acc * a, eq.clone()) || rec2(val, acc + a, eq.clone()); } fn main() { let args: Vec = env::args().collect(); let filename = if args.len() == 1 { "in/".to_owned() + args[0].split('/').last().unwrap() + ".pzl" } else { args[1].clone() }; let mut f = File::open(filename).expect("cannot open file"); let mut content = String::new(); f.read_to_string(&mut content).expect("cannot read file"); let lines = content.trim_end().split("\n"); let mut vals: Vec = Vec::new(); let mut eqs: Vec> = Vec::new(); for line in lines { let (c, rest) = line.split_once(": ").unwrap(); vals.push(c.parse().unwrap()); eqs.push( rest.split(" ") .map(|a| a.parse().unwrap()) .collect::>() .into_iter() .rev() .collect(), ); } let mut res1 = 0; let mut res2 = 0; for i in 0..eqs.len() { if rec(vals[i], 0, eqs[i].clone()) { res1 += vals[i]; } if rec2(vals[i], 0, eqs[i].clone()) { res2 += vals[i]; } } println!("res1: {}", res1); println!("res2: {}", res2); assert_eq!(res1, 66343330034722); assert_eq!(res2, 637696070419031); }