main
Yanick Champoux 2021-12-05 11:45:13 -05:00
parent 1bd00d8e73
commit fdee8edce1
4 changed files with 114 additions and 0 deletions

52
2021/05/part1.pm Normal file
View File

@ -0,0 +1,52 @@
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;

26
2021/05/part2.pm Normal file
View File

@ -0,0 +1,26 @@
package part2;
use 5.20.0;
use warnings;
use experimental 'signatures';
use List::AllUtils qw/ /;
require './part1.pm';
use experimental qw/ signatures postderef /;
use List::AllUtils qw/ any min max sum zip pairmap /;
sub solution(@sample) {
my %grid;
for my $line (@sample) {
for my $step ( part1::steps(@$line) ) {
$grid{$step->[0]}{$step->[1]}++;
}
}
return part1::score(%grid);
}
1;

10
2021/05/sample Normal file
View File

@ -0,0 +1,10 @@
0,9 -> 5,9
8,0 -> 0,8
9,4 -> 3,4
2,2 -> 2,1
7,0 -> 7,4
6,4 -> 2,0
0,9 -> 2,9
3,4 -> 1,4
0,0 -> 8,8
5,5 -> 8,2

26
2021/05/test.t Normal file
View File

@ -0,0 +1,26 @@
use 5.34.0;
use Test2::V0;
use Path::Tiny;
require './part1.pm';
require './part2.pm';
my @sample = part1::readFile('./sample');
my @input = part1::readFile('./input');
use DDP;
subtest part1 => sub {
is [part1::steps([1,1],[3,3])] => [ [ 1,1 ],[2,2],[3,3] ];
is [part1::steps([3,3],[1,1])] => [ [ 3,3 ],[2,2],[1,1] ];
is [part1::steps([1,3],[1,1])] => [ [ 1,3 ],[1,2],[1,1] ];
is part1::solution(@sample ) => 5;
is part1::solution(@input ) => 5576;
};
subtest part2 => sub {
is part2::solution(@sample ) => 12;
is part2::solution(@input ) => 18144;
};