diff options
| author | nekineki <nekineki@nekineki.net> | 2023-12-19 21:43:07 +0100 |
|---|---|---|
| committer | nekineki <nekineki@nekineki.net> | 2023-12-19 21:43:39 +0100 |
| commit | 244165cd3c023b446abe1b1ea0c0e7f1c3402fef (patch) | |
| tree | 11f5984d3693758bebc3a789eaab5e3260d74946 /2023 | |
| parent | 51be0c6e3868c3341b15a7c32c07f3ddde103262 (diff) | |
day12 mal prevec
Diffstat (limited to '2023')
| -rw-r--r-- | 2023/day12.rs | 128 |
1 files changed, 119 insertions, 9 deletions
diff --git a/2023/day12.rs b/2023/day12.rs index 0fe4b97..8719952 100644 --- a/2023/day12.rs +++ b/2023/day12.rs @@ -1,15 +1,26 @@ #![allow(dead_code)] #![allow(unused_variables)] #![allow(unused_mut)] +use std::fmt; use std::fs::File; use std::io::Read; -#[derive(Eq, Debug, PartialEq, Clone, Copy)] +#[derive(Eq, PartialEq, Clone, Copy)] enum State { Ok, Nok, Unk, } +impl std::fmt::Debug for State { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let a = match self { + State::Ok => '.', + State::Nok => '#', + State::Unk => '?', + }; + write!(f, "{}", a) + } +} type Line = (Vec<State>, Vec<usize>); @@ -27,14 +38,14 @@ fn rec(l: Line) -> usize { } } - if is_valid(l) { + if is_valid(&l) { return 1; } else { return 0; } } -fn is_valid(l: Line) -> bool { +fn is_valid(l: &Line) -> bool { let mut a: Vec<usize> = Vec::new(); let mut prev = State::Ok; @@ -57,9 +68,89 @@ fn is_valid(l: Line) -> bool { ret } +fn rec2(mut s: &[State], mut arr: &[usize], depth: u32) -> usize { + // println!("{} {:?} {:?}", depth, s, arr); + + if arr.len() == 0 { + // println!("ret 1"); + return 1; + } + if s.len() == 0 { + // println!("ret 0"); + return 0; + } + + if s.len() < arr.iter().fold(0, |x, y| x + y) + arr.len() - 1 { + // println!("ret 0"); + return 0; + } + + let n = arr[0]; + let arr = &arr[1..]; + + let mut ret = 0; + for i in 0..(s.len() - n) { + let mut all = true; + // check before first # + for ii in 0..i { + if s[ii] == State::Nok { + all = false; + } + } + // check if # * n + for ii in 0..n { + if s[i + ii] == State::Ok { + all = false; + } + } + // check if next is not # + if s[i + n] == State::Nok { + all = false; + } + + if all { + ret += rec2(&s[i + n + 1..], arr, depth + 1); + } + } + if s.len() == n { + let mut all = true; + for ii in 0..n { + if s[ii] == State::Ok { + all = false; + } + } + if all { + // println!("ret 1"); + return 1; + } + } + + // handle last digit and last place + if arr.len() == 0 { + let mut all = true; + for i in 0..(s.len() - n) { + // check before first # + if s[i] == State::Nok { + all = false; + } + } + for i in (s.len() - n)..s.len() { + // check if # * n + if s[i] == State::Ok { + all = false; + } + } + if all { + ret += 1; + } + } + + ret +} + fn main() { - // let filename = "in/day12.ref"; - let filename = "in/day12.pzl"; + 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(); @@ -88,10 +179,29 @@ fn main() { let mut res1 = 0; let mut res2 = 0; - for l in ls { - let a = rec(l); - // println!("{}", a); - res1 += a; + // for l in ls { + // let a = rec(l); + // // println!("{}", a); + // res1 += a; + // } + + let mut ls2: Vec<Line> = Vec::new(); + for i in 0..ls.len() { + let mut l2: Line = Default::default(); + for _ in 0..5 { + l2.0.append(&mut ls[i].0.clone()); + l2.0.push(State::Unk); + l2.1.append(&mut ls[i].1.clone()); + } + ls2.push(l2); + } + + // for l in [ls2[0].clone()] { + // for l in [ls[5].clone()] { + for l in ls2 { + let a = rec2(&l.0, &l.1, 0); + println!("{}", a); + res2 += a; } println!("res1: {}", res1); |
