miserable brute force of 12p1

This commit is contained in:
Spectre 2023-12-12 17:05:00 +01:00
parent e7f87ee6d7
commit 83ec12e183
3 changed files with 63 additions and 3 deletions

View file

@ -5,6 +5,8 @@
<sourceFolder url="file://$MODULE_DIR$/aoc2023/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/shared/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/examples" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />

View file

@ -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::<Vec<&str>>();
let groups: Vec<Vec<i32>> = input.lines()
.map(|x| x.split_once(' ').unwrap().1.split(',').map(|y| y.parse::<i32>().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<i32>) -> Vec<Regex> {
let uncertain: i32 = len_of_str - groups.iter().sum::<i32>() - groups.len() as i32 + 1;
let mut patterns: Vec<Regex> = 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<Vec<i32>> {
if total == 0 { return vec![vec![0; parts as usize]] }
else if parts == 1 { return vec![vec![total]] }
let mut out: Vec<Vec<i32>> = vec![];
for i in 0..=total {
for mut sub in get_gaps(total - i, parts - 1) {
out.push({ sub.push(i); sub });
}
}
out
}

View file

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