From fdee8edce1351f53de35049a89d9ce4bdaac1071 Mon Sep 17 00:00:00 2001 From: Yanick Champoux Date: Sun, 5 Dec 2021 11:45:13 -0500 Subject: [PATCH] 2021-05 --- 2021/05/part1.pm | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ 2021/05/part2.pm | 26 ++++++++++++++++++++++++ 2021/05/sample | 10 ++++++++++ 2021/05/test.t | 26 ++++++++++++++++++++++++ 4 files changed, 114 insertions(+) create mode 100644 2021/05/part1.pm create mode 100644 2021/05/part2.pm create mode 100644 2021/05/sample create mode 100644 2021/05/test.t diff --git a/2021/05/part1.pm b/2021/05/part1.pm new file mode 100644 index 0000000..2b47fe4 --- /dev/null +++ b/2021/05/part1.pm @@ -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; diff --git a/2021/05/part2.pm b/2021/05/part2.pm new file mode 100644 index 0000000..7039742 --- /dev/null +++ b/2021/05/part2.pm @@ -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; diff --git a/2021/05/sample b/2021/05/sample new file mode 100644 index 0000000..b258f68 --- /dev/null +++ b/2021/05/sample @@ -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 diff --git a/2021/05/test.t b/2021/05/test.t new file mode 100644 index 0000000..7ed1830 --- /dev/null +++ b/2021/05/test.t @@ -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; +};