]> www.fi.muni.cz Git - aoc.git/blob - 2017/37.pl
The rest of Year 2017
[aoc.git] / 2017 / 37.pl
1 #!/usr/bin/perl
2
3 use v5.30;
4 use strict;
5
6 my @map = map { chomp; [ split // ] } <>;
7
8 my $xmax = @{ $map[0] };
9 my $ymax = @map;
10
11 my $x;
12 for (0 .. $xmax) {
13         if ($map[0][$_] eq '|') {
14                 $x = $_;
15                 last;
16         }
17 }
18 my $y = 0;
19 my $dir = 2; # 0 up, 1 right, 2 down, 3 left
20
21 my $seen = '';
22 while (1) {
23         my $now = $map[$y][$x];
24         say "at $x,$y: '$now'";
25         if ($now =~ /[A-Z]/) {
26                 $seen .= $now;
27         } elsif ($now eq '+') {
28                 my $ndir;
29                 $ndir = 0 if $map[$y-1][$x] ne ' ' && $dir != 2;
30                 $ndir = 1 if $map[$y][$x+1] ne ' ' && $dir != 3;
31                 $ndir = 2 if $map[$y+1][$x] ne ' ' && $dir != 0;
32                 $ndir = 3 if $map[$y][$x-1] ne ' ' && $dir != 1;
33                 $dir = $ndir;
34         }
35         if ($dir == 0) {
36                 $y--;
37         } elsif ($dir == 1) {
38                 $x++;
39         } elsif ($dir == 2) {
40                 $y++;
41         } else {
42                 $x--;
43         }
44         last if $x < 0 || $y < 0 || $x > $xmax || $y > $ymax || $map[$y][$x] eq ' ';
45 }
46
47 say $seen;
48