package part1;

use 5.34.0;
use warnings;
use experimental 'signatures';

use Path::Tiny;
use List::AllUtils qw/ any min max sum zip pairmap/;
use Math::Vector::Real;

sub score(%grid) {
    return sum map { $_ > 1 ? 1 : 0 } map { values %$_ } values %grid;
}

sub delta($from,$to) {
    $from == $to ? 0 : $from < $to ? 1 : -1;
}

sub steps($pa,$pb) {
    my $incr = V( pairmap { delta($a,$b) } zip @$pa, @$pb );

    my @steps = ( V(@$pa) );
    my $dest = V(@$pb);
    while( $steps[-1] != $dest) {
        push @steps, V($steps[-1]->@*) + $incr;
    }

    return @steps;

}

sub readFile ($filename) {
    return map {
        [ map { [split ',' ] } split ' -> ' ]
    } path($filename)->lines;
}

sub solution (@sample) {
    my %grid;

    for my $line (@sample) {
        next unless any { $line->[0][$_] == $line->[1][$_] } 0 .. 1;
        for my $step ( steps(@$line) ) {
            $grid{$step->[0]}{$step->[1]}++;
        }
    }

    return score(%grid);

}

1;