2024 AoC Day 12 – Garden Groups

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

Part Two

raku