diff --git a/.idea/AdventOfCode.iml b/.idea/AdventOfCode.iml
index a1dbddc..4661634 100644
--- a/.idea/AdventOfCode.iml
+++ b/.idea/AdventOfCode.iml
@@ -5,6 +5,8 @@
+
+
diff --git a/aoc2023/src/day12.rs b/aoc2023/src/day12.rs
index c82f532..fefbcfe 100644
--- a/aoc2023/src/day12.rs
+++ b/aoc2023/src/day12.rs
@@ -1,13 +1,71 @@
+use std::fmt::format;
+use std::iter::zip;
+use std::net::Shutdown::Read;
+use itertools::Itertools;
use shared::{Solution, Answer};
+use regex::Regex;
+use shared::Answer::String;
pub struct Day12;
impl Solution for Day12 {
fn part_1(&self, input: &str) -> Answer {
- Answer::Unimplemented
+ let lines = input.lines()
+ .map(|x| x.split_once(' ').unwrap().0)
+ .collect::>();
+ let groups: Vec> = input.lines()
+ .map(|x| x.split_once(' ').unwrap().1.split(',').map(|y| y.parse::().unwrap()).collect())
+ .collect();
+
+ let mut out = 0;
+
+ for (line, group) in zip(lines, groups) {
+ for pattern in generate_patterns(line.len() as i32, &group) {
+ if pattern.is_match(line) {
+ out += 1;
+ }
+ }
+ println!("{out}");
+ }
+
+ Answer::from(out)
}
fn part_2(&self, input: &str) -> Answer {
Answer::Unimplemented
}
}
+
+
+fn generate_patterns(len_of_str: i32, groups: &Vec) -> Vec {
+ let uncertain: i32 = len_of_str - groups.iter().sum::() - groups.len() as i32 + 1;
+
+ let mut patterns: Vec = vec![];
+ let possible_gaps = get_gaps(uncertain, groups.len() as i32 + 1);
+
+ for gaps in possible_gaps {
+ let mut pattern = format!("^[.?]{{{}}}[#?]{{{}}}", gaps.first().unwrap(), groups.first().unwrap());
+ for i in 1..groups.len() {
+ pattern.push_str(format!(r"[.?]{{{}}}[#?]{{{}}}", gaps[i] + 1, groups[i]).as_str())
+ }
+ pattern.push_str(format!("[.?]{{{}}}$", gaps.last().unwrap()).as_str());
+ patterns.push(Regex::new(pattern.as_str()).unwrap())
+ }
+
+ patterns
+}
+
+fn get_gaps(total: i32, parts: i32) -> Vec> {
+ if total == 0 { return vec![vec![0; parts as usize]] }
+ else if parts == 1 { return vec![vec![total]] }
+
+ let mut out: Vec> = vec![];
+
+ for i in 0..=total {
+ for mut sub in get_gaps(total - i, parts - 1) {
+ out.push({ sub.push(i); sub });
+ }
+ }
+
+ out
+}
diff --git a/src/main.rs b/src/main.rs
index cacd3a9..84cd62c 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -8,10 +8,10 @@ use std::time::Instant;
fn main() {
let now = Instant::now();
- let Ok(data) = load_actual(2023, 11)
+ let Ok(data) = load_actual(2023, 12)
else { panic!("No Input Data"); };
- let result = aoc2023::day11::Day11.part_2(&data);
+ let result = aoc2023::day12::Day12.part_1(&data);
let elapsed = now.elapsed();