day05-2.pl (1440B) - raw
1 #!/usr/bin/env perl 2 3 use strict; 4 use warnings; 5 use v5.22; 6 use List::Util qw( max ); 7 8 sub draw_matrix { 9 my ($matrix) = shift; 10 my $answer; 11 foreach my $y (@$matrix) { 12 foreach my $x (@$y) { 13 $answer++ if (defined( $x) && ($x > 1)); 14 } 15 } 16 return $answer; 17 } 18 19 if (@ARGV !=1) { 20 die "Usage: $0 [input-filename]"; 21 } 22 23 my $input_filename = $ARGV[0]; 24 open my $filehandle, '<', $input_filename or 25 die "Could not open input file $input_filename: $!"; 26 27 chomp( my @input = ( <$filehandle> ) ); 28 my $wait; 29 my @matrix = (); 30 my ($rows, $columns) = (0, 0); 31 foreach (@input) { 32 my ($x1, $y1, $x2, $y2) = ( /(\d+),(\d+) -> (\d+),(\d+)/ ); 33 if ($x1 == $x2) { # line is vertical 34 ($y1, $y2) = ($y2, $y1) if ($y1 > $y2); # swap so that $y1 < $y2 35 for (my $y = $y1; $y <= $y2; $y++) { 36 $matrix[$y][$x1]++; 37 } 38 } 39 elsif ($y1 == $y2) { # line is horizontal 40 ($x1, $x2) = ($x2, $x1) if ($x1 > $x2); # swap so that $x1 < $x2 41 for (my $x = $x1; $x <= $x2; $x++) { 42 $matrix[$y1][$x]++; 43 } 44 } 45 else { # line is diagonal 46 my $dx = ($x2 > $x1) ? 1 : -1; 47 my $dy = ($y2 > $y1) ? 1 : -1; 48 for (my $x = $x1, my $y = $y1; $x!=$x2 && $y!=$y2; $x+=$dx, $y+=$dy) { 49 $matrix[$y][$x]++; 50 } 51 $matrix[$y2][$x2]++; # for loop above stops just before reaching 2nd point 52 } 53 } 54 55 say draw_matrix( \@matrix );