diff options
Diffstat (limited to '2024/day07.rs')
| -rw-r--r-- | 2024/day07.rs | 78 |
1 files changed, 78 insertions, 0 deletions
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<i64>) -> 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<i64>) -> 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<String> = 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<i64> = Vec::new(); + let mut eqs: Vec<Vec<i64>> = 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::<Vec<i64>>() + .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); +} |
