diff options
Diffstat (limited to '2019/day3/wires.pl')
| -rw-r--r-- | 2019/day3/wires.pl | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/2019/day3/wires.pl b/2019/day3/wires.pl new file mode 100644 index 0000000..fa4ddf1 --- /dev/null +++ b/2019/day3/wires.pl | |||
| @@ -0,0 +1,68 @@ | |||
| 1 | #!/usr/bin/env perl | ||
| 2 | use strict; | ||
| 3 | use warnings; | ||
| 4 | |||
| 5 | use List::Util 'min'; | ||
| 6 | # use Smart::Comments; | ||
| 7 | use Data::Dumper; | ||
| 8 | |||
| 9 | sub manhattan_distance { | ||
| 10 | my $ref = shift; | ||
| 11 | my ($x, $y) = @{$ref}; | ||
| 12 | |||
| 13 | return abs(0 - $x) + abs(0 - $y); | ||
| 14 | } | ||
| 15 | |||
| 16 | sub pedometer { | ||
| 17 | my $ref = shift; | ||
| 18 | my ($x, $y, $step_1, $step_2) = @{$ref}; | ||
| 19 | return $step_1 + $step_2; | ||
| 20 | } | ||
| 21 | |||
| 22 | my %directions = ( | ||
| 23 | 'U' => [0, 1], | ||
| 24 | 'D' => [0,-1], | ||
| 25 | 'R' => [1, 0], | ||
| 26 | 'L' => [-1,0] | ||
| 27 | ); | ||
| 28 | |||
| 29 | my $turn = 0; | ||
| 30 | my @intersections = (); | ||
| 31 | my %map; | ||
| 32 | |||
| 33 | while(<>) { | ||
| 34 | chomp; | ||
| 35 | my @path = split /,/; | ||
| 36 | my @coord = (0,0); # Starting point | ||
| 37 | my $num_steps = 0; | ||
| 38 | |||
| 39 | if (!$turn){ | ||
| 40 | foreach my $way (@path) { | ||
| 41 | my ($dir, $speed) = ($1, $2) if ($way =~ /(\w)(\d+)/) or die "$!"; | ||
| 42 | for (1..$speed) { | ||
| 43 | $coord[0] += @{$directions{$dir}}[0]; | ||
| 44 | $coord[1] += @{$directions{$dir}}[1]; | ||
| 45 | $num_steps++; | ||
| 46 | $map{"$coord[0],$coord[1]"} = $num_steps; | ||
| 47 | } | ||
| 48 | } | ||
| 49 | $turn = !$turn; | ||
| 50 | } else { | ||
| 51 | foreach my $way (@path) { | ||
| 52 | my ($dir, $speed) = ($1, $2) if ($way =~ /(\w)(\d+)/) or die "$!"; | ||
| 53 | for (1..$speed) { | ||
| 54 | $coord[0] += @{$directions{$dir}}[0]; | ||
| 55 | $coord[1] += @{$directions{$dir}}[1]; | ||
| 56 | $num_steps++; | ||
| 57 | if (exists $map{"$coord[0],$coord[1]"}) { | ||
| 58 | push @intersections, [@coord,$num_steps,$map{"$coord[0],$coord[1]"}]; | ||
| 59 | } | ||
| 60 | } | ||
| 61 | } | ||
| 62 | } | ||
| 63 | } | ||
| 64 | |||
| 65 | # print Dumper \@intersections; | ||
| 66 | print(min(map {pedometer($_);} @intersections)); | ||
| 67 | |||
| 68 | |||
