From 15117b94410f53379957bd29d3953f7ed96ba774 Mon Sep 17 00:00:00 2001 From: nekineki Date: Sat, 7 Dec 2024 21:52:36 +0100 Subject: day07 --- 2024/day07.rs | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 2024/day07.rs (limited to '2024/day07.rs') diff --git a/2024/day07.rs b/2024/day07.rs new file mode 100644 index 0000000..e113c27 --- /dev/null +++ b/2024/day07.rs @@ -0,0 +1,78 @@ +#![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); +} -- cgit v1.2.3