Skip to content

Commit 22b1d4f

Browse files
committed
some sort of infinite loop...
1 parent 7eb1f1b commit 22b1d4f

File tree

3 files changed

+126
-1
lines changed

3 files changed

+126
-1
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
resolver = "2"
33
members = [
44
"utils",
5-
"aoc_derive", "day1", "day2", "day3", "day4", "day5", "day6", "day7", "day8", "day9", "day10", "day11",
5+
"aoc_derive", "day1", "day2", "day3", "day4", "day5", "day6", "day7", "day8", "day9", "day10", "day11", "day12",
66
]
77

88
[workspace.dependencies]

day12/Cargo.toml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[package]
2+
name = "day12"
3+
version = "0.1.0"
4+
edition = "2024"
5+
6+
[dependencies]
7+
aoc_derive.path = '../aoc_derive'
8+
utils.path = '../utils'
9+
derive_more.workspace = true
10+
itertools.workspace = true
11+
lazy-regex.workspace = true
12+
parse-display.workspace = true
13+
rayon.workspace = true
14+
regex.workspace = true
15+
num.workspace = true
16+
17+
[dev-dependencies]
18+
pretty_assertions.workspace = true

day12/src/main.rs

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
use std::collections::HashSet;
2+
3+
use aoc_derive::aoc_main;
4+
use graphs::floodfill;
5+
use itertools::Itertools;
6+
use lazy_regex::regex;
7+
use math::Vec2D;
8+
use utils::ParseInput;
9+
use utils::*;
10+
11+
#[aoc_main]
12+
fn solve(input: Input) -> impl Into<Solution> {
13+
let mut regions = Vec::<(char, HashSet<Vec2D>)>::new();
14+
15+
let map = input.char_grid();
16+
17+
let mut visited = HashSet::new();
18+
for (pos, &c) in map.iter() {
19+
if !visited.contains(&pos) {
20+
println!("new region {c}");
21+
22+
let mut new_region = HashSet::new();
23+
let mut next = vec![pos];
24+
loop {
25+
for p in &next {
26+
new_region.insert(*p);
27+
}
28+
29+
next = next
30+
.into_iter()
31+
.flat_map(|n| {
32+
map.orthogonal_neighbors(&n)
33+
.filter(|neighb| map[*neighb] == c && !new_region.contains(neighb))
34+
.collect_vec()
35+
.into_iter()
36+
})
37+
.collect();
38+
39+
if next.is_empty() {
40+
break;
41+
}
42+
43+
dbg!(next.len());
44+
}
45+
46+
visited.extend(new_region.clone());
47+
48+
regions.push((c, new_region));
49+
}
50+
}
51+
52+
let part1 = regions
53+
.iter()
54+
.map(|(c, region)| {
55+
let area = region.len();
56+
let perimeter = region
57+
.iter()
58+
.map(|pos| pos.orthogonal_neighbors().filter(|n| map.get(*n) != Some(c)).count())
59+
.sum_usize();
60+
61+
//println!("Region {c} has area {area} and perimeter {perimeter}");
62+
63+
area * perimeter
64+
})
65+
.sum_usize();
66+
67+
(part1)
68+
}
69+
70+
#[cfg(test)]
71+
mod tests {
72+
use super::*;
73+
#[test]
74+
fn test_examples() {
75+
use utils::assert_example;
76+
assert_example!(
77+
r#"AAAA
78+
BBCD
79+
BBCC
80+
EEEC"#,
81+
"140"
82+
);
83+
84+
assert_example!(
85+
"OOOOO
86+
OXOXO
87+
OOOOO
88+
OXOXO
89+
OOOOO",
90+
772
91+
);
92+
93+
assert_example!(
94+
"RRRRIICCFF
95+
RRRRIICCCF
96+
VVRRRCCFFF
97+
VVRCCCJFFF
98+
VVVVCJJCFE
99+
VVIVCCJJEE
100+
VVIIICJJEE
101+
MIIIIIJJEE
102+
MIIISIJEEE
103+
MMMISSJEEE",
104+
1930
105+
);
106+
}
107+
}

0 commit comments

Comments
 (0)