#![allow(dead_code)] #![allow(unused_variables)] #![allow(unused_mut)] use std::fs::File; use std::io::Read; #[derive(Eq, Debug, PartialEq, Clone, Copy)] enum State { Ok, Nok, Unk, } type Line = (Vec, Vec); fn rec(l: Line) -> usize { for i in 0..l.0.len() { if l.0[i] == State::Unk { let mut sum = 0; let mut l1 = l.clone(); let mut l2 = l.clone(); l1.0[i] = State::Ok; l2.0[i] = State::Nok; sum += rec(l1); sum += rec(l2); return sum; } } if is_valid(l) { return 1; } else { return 0; } } fn is_valid(l: Line) -> bool { let mut a: Vec = Vec::new(); let mut prev = State::Ok; let mut count = 0; for i in 0..l.0.len() { if l.0[i] == State::Nok { count += 1; } else if l.0[i] == State::Ok && prev == State::Nok { a.push(count); count = 0; } prev = l.0[i]; } if count != 0 { a.push(count); } let ret = a == l.1; ret } fn main() { // let filename = "in/day12.ref"; let filename = "in/day12.pzl"; 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 ls: Vec = Vec::new(); for line in lines { let (a, b) = line.split_once(' ').unwrap(); let mut l: Line = (Vec::new(), Vec::new()); for c in a.chars() { let s = match c { '.' => State::Ok, '#' => State::Nok, '?' => State::Unk, _ => panic!(), }; l.0.push(s); } for c in b.split(',') { l.1.push(c.parse().unwrap()); } ls.push(l); } let mut res1 = 0; let mut res2 = 0; for l in ls { let a = rec(l); // println!("{}", a); res1 += a; } println!("res1: {}", res1); println!("res2: {}", res2); }