summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornekineki <nekineki@nekineki.net>2024-01-22 12:20:56 +0100
committernekineki <nekineki@nekineki.net>2024-01-22 12:20:56 +0100
commit68c88b6a738bbec01f1fe498c33b9372139b02cc (patch)
treeb62f3a204ced576085e5818a40ff7cc374f26f69
parent33d5d754150d0cf23a949706f471e495c41c0412 (diff)
day12 part2 (resi v 18dneh)
-rw-r--r--2023/day12.rs36
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);
}