diff options
| author | nekineki <nekineki@nekineki.net> | 2023-12-20 11:32:58 +0100 |
|---|---|---|
| committer | nekineki <nekineki@nekineki.net> | 2023-12-20 11:32:58 +0100 |
| commit | 23d0915b239bef4234c5b9326eb2ecbdd4fb7a75 (patch) | |
| tree | e1681faae868e31dd64b15b1af074b237442a6fa /2023 | |
| parent | cf07a9e62ac5c37809d34db21c80688407293215 (diff) | |
day12 dela pravilno ampak prepocas
Diffstat (limited to '2023')
| -rw-r--r-- | 2023/day12.rs | 90 |
1 files changed, 34 insertions, 56 deletions
diff --git a/2023/day12.rs b/2023/day12.rs index 8719952..2f2bd0b 100644 --- a/2023/day12.rs +++ b/2023/day12.rs @@ -72,8 +72,19 @@ fn rec2(mut s: &[State], mut arr: &[usize], depth: u32) -> usize { // println!("{} {:?} {:?}", depth, s, arr); if arr.len() == 0 { - // println!("ret 1"); - return 1; + let mut all = true; + for i in 0..s.len() { + if s[i] == State::Nok { + all = false; + } + } + if all { + // println!("ret 1"); + return 1; + } else { + // println!("ret 0"); + return 0; + } } if s.len() == 0 { // println!("ret 0"); @@ -88,60 +99,27 @@ fn rec2(mut s: &[State], mut arr: &[usize], depth: u32) -> usize { let n = arr[0]; let arr = &arr[1..]; + let start = if depth == 0 { 0 } else { 1 }; + let mut ret = 0; - for i in 0..(s.len() - n) { + // println!("nok_s {} {}", start, s.len() - n); + for nok_s in start..=(s.len() - n) { let mut all = true; // check before first # - for ii in 0..i { + for ii in 0..nok_s { 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 { + if s[nok_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 += rec2(&s[nok_s + n..], arr, depth + 1); } } @@ -149,8 +127,8 @@ fn rec2(mut s: &[State], mut arr: &[usize], depth: u32) -> usize { } 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(); @@ -179,28 +157,28 @@ fn main() { let mut res1 = 0; let mut res2 = 0; - // for l in ls { - // let a = rec(l); - // // println!("{}", a); + // for (i,l) in ls.iter().enumerate() { + // let a = rec(l.clone()); + // println!("{} {}", i+1, 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()); - } + l2.0 = vec![ls[i].0.clone(); 5].join(&State::Unk); + l2.1 = vec![ls[i].1.clone(); 5] + .into_iter() + .flat_map(|s| s) + .collect::<Vec<usize>>(); ls2.push(l2); } - // for l in [ls2[0].clone()] { - // for l in [ls[5].clone()] { - for l in ls2 { + // for (i,l) in [ls[998].clone()].into_iter().enumerate() { + for (i, l) in ls2.iter().enumerate() { let a = rec2(&l.0, &l.1, 0); - println!("{}", a); + // println!("{:?} {:?}", &l.0, &l.1); + println!("{} {}", i + 1, a); res2 += a; } |
