This is a solution to Advent of Code 2024 day 12, written in Raku.
https://adventofcode.com/2024/day/12
TODO Part One
What is the total price of fencing all regions on your map?
use Test;
sub day-twelve($file, $size) {
my @grid[$size;$size] = $file.IO.lines>>.comb;
class Region {
has $.area is rw;
has $.fence is rw;
has $.plots = SetHash.new;
}
my %regions;
sub put($r, :$fence, :$area) {
if not %regions{$r}:exists {
%regions{$r} = [ Region.new ];
}
%regions{$r}.fence += $fence if $fence;
%regions{$r}.area += $area if $area;
}
for ^$size -> $y {
my $prev;
for ^$size -> $x {
my $r = @grid[$y;$x];
if $x == 0 {
put($r, fence => 1, area => 1);
} else {
put($r, area => 1);
if $r ne $prev {
put($prev, fence => 1);
put($r, fence => 1);
}
}
$prev = $r;
}
put($prev, fence => 1);
}
for ^$size -> $x {
my $prev;
for ^$size -> $y {
my $r = @grid[$y;$x];
if $y == 0 {
put($r, fence => 1);
} else {
if $r ne $prev {
put($prev, fence => 1);
put($r, fence => 1);
}
}
$prev = $r;
}
put($prev, fence => 1);
}
for %regions.kv -> $k, $v {
say "{$k} => {$v.raku}";
}
[+] %regions.values.map(-> $r { $r.area * $r.fence });
}
say day-twelve('test-12.txt', 10);
F => Region.new(area => 10, fence => 18) J => Region.new(area => 11, fence => 20) M => Region.new(area => 5, fence => 12) C => Region.new(area => 15, fence => 32) S => Region.new(area => 3, fence => 8) V => Region.new(area => 13, fence => 20) I => Region.new(area => 18, fence => 30) R => Region.new(area => 12, fence => 18) E => Region.new(area => 13, fence => 18) 2214