diff options
| author | nekineki <nekineki@nekineki.net> | 2024-01-22 12:20:56 +0100 |
|---|---|---|
| committer | nekineki <nekineki@nekineki.net> | 2024-01-22 12:20:56 +0100 |
| commit | 68c88b6a738bbec01f1fe498c33b9372139b02cc (patch) | |
| tree | b62f3a204ced576085e5818a40ff7cc374f26f69 | |
| parent | 33d5d754150d0cf23a949706f471e495c41c0412 (diff) | |
day12 part2 (resi v 18dneh)
| -rw-r--r-- | 2023/day12.rs | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/2023/day12.rs b/2023/day12.rs index 2f2bd0b..85d7a77 100644 --- a/2023/day12.rs +++ b/2023/day12.rs @@ -24,7 +24,7 @@ impl std::fmt::Debug for State { type Line = (Vec<State>, Vec<usize>); -fn rec(l: Line) -> usize { +fn rec(l: Line) -> u64 { for i in 0..l.0.len() { if l.0[i] == State::Unk { let mut sum = 0; @@ -68,7 +68,7 @@ fn is_valid(l: &Line) -> bool { ret } -fn rec2(mut s: &[State], mut arr: &[usize], depth: u32) -> usize { +fn rec2(mut s: &[State], mut arr: &[usize], depth: u32) -> u64 { // println!("{} {:?} {:?}", depth, s, arr); if arr.len() == 0 { @@ -91,10 +91,19 @@ fn rec2(mut s: &[State], mut arr: &[usize], depth: u32) -> usize { return 0; } - if s.len() < arr.iter().fold(0, |x, y| x + y) + arr.len() - 1 { + let nok_count = arr.iter().fold(0, |x, y| x + y); + let ok_count_min = arr.len() - 1; + if s.len() < nok_count + ok_count_min { // println!("ret 0"); return 0; } + if nok_count > s.iter().filter(|&&x| x != State::Ok).fold(0, |x, _| x + 1) { + return 0; + } + + if ok_count_min > s.iter().filter(|&&x| x != State::Nok).fold(0, |x, _| x + 1) { + return 0; + } let n = arr[0]; let arr = &arr[1..]; @@ -155,13 +164,15 @@ fn main() { } let mut res1 = 0; - let mut res2 = 0; - // for (i,l) in ls.iter().enumerate() { - // let a = rec(l.clone()); - // println!("{} {}", i+1, a); - // res1 += a; - // } + for (i, l) in ls.iter().enumerate() { + // let a = rec(l.clone()); + let a = rec2(&l.0, &l.1, 0); + println!("{} {}", i + 1, a); + res1 += a; + } + + let mut res2 = 0; let mut ls2: Vec<Line> = Vec::new(); for i in 0..ls.len() { @@ -174,14 +185,17 @@ fn main() { ls2.push(l2); } - // for (i,l) in [ls[998].clone()].into_iter().enumerate() { + // !!! za part2 rabi 1562090s (18dni) !!! + // it to z --release ter -C target-cpu=native + // TODO: make faster for (i, l) in ls2.iter().enumerate() { let a = rec2(&l.0, &l.1, 0); - // println!("{:?} {:?}", &l.0, &l.1); println!("{} {}", i + 1, a); res2 += a; } println!("res1: {}", res1); println!("res2: {}", res2); + assert_eq!(res1, 7084); + assert_eq!(res2, 8414003326821); } |
