summaryrefslogtreecommitdiff
path: root/2023
diff options
context:
space:
mode:
authornekineki <nekineki@nekineki.net>2023-12-20 11:32:58 +0100
committernekineki <nekineki@nekineki.net>2023-12-20 11:32:58 +0100
commit23d0915b239bef4234c5b9326eb2ecbdd4fb7a75 (patch)
treee1681faae868e31dd64b15b1af074b237442a6fa /2023
parentcf07a9e62ac5c37809d34db21c80688407293215 (diff)
day12 dela pravilno ampak prepocas
Diffstat (limited to '2023')
-rw-r--r--2023/day12.rs90
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;
}