summaryrefslogtreecommitdiff
path: root/2023
diff options
context:
space:
mode:
authornekineki <nekineki@nekineki.net>2023-12-19 21:43:07 +0100
committernekineki <nekineki@nekineki.net>2023-12-19 21:43:39 +0100
commit244165cd3c023b446abe1b1ea0c0e7f1c3402fef (patch)
tree11f5984d3693758bebc3a789eaab5e3260d74946 /2023
parent51be0c6e3868c3341b15a7c32c07f3ddde103262 (diff)
day12 mal prevec
Diffstat (limited to '2023')
-rw-r--r--2023/day12.rs128
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);