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();