aoc2021

Advent of Code 2021 solutions in Perl.
git clone git://git.samirparikh.com/aoc2021
Log | Files | Refs | README

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 );