]> www.fi.muni.cz Git - aoc.git/blob - 2023/20.pl
Day 25: examining the input
[aoc.git] / 2023 / 20.pl
1 #!/usr/bin/perl -w
2
3 use v5.38;
4 use experimental 'multidimensional';
5 $; = ';';
6
7 my @map;
8 my ($x, $y);
9
10 while (<>) {
11         chomp;
12         if (/S/g) {
13                 $x = pos;
14                 $y = 1 + @map;
15         }
16         push @map, [ split //, ".$_." ];
17 }
18
19 push    @map, [ ('.') x @{ $map[0] } ];
20 unshift @map, [ ('.') x @{ $map[0] } ];
21
22 my $xmax = $#{$map[0]};
23 my $ymax = $#map;
24
25 # 0=E 1=S 2=W 3=N
26 my %dirs = (
27         '|' => '13',
28         '-' => '02',
29         'J' => '23',
30         'L' => '03',
31         'F' => '01',
32         '7' => '12',
33 );
34 my @dx = (1, 0, -1, 0);
35 my @dy = (0, 1, 0, -1);
36
37 my $dir;
38 for my $d (0 .. 3) {
39         my $revdir = $d ^ 2;
40         my $p = $map[ $y+$dy[$d] ][ $x+$dx[$d] ];
41         $dir .= $d if $dirs{$p} =~ /$revdir/;
42 }
43
44 my %dir2sym = reverse %dirs;
45 $map[$y][$x] = $dir2sym{$dir}; # fill in the start point
46 $dir =~ s/.//; # Take any valid direction
47
48 my %seen;
49 while (1) {
50         $x += $dx[$dir];
51         $y += $dy[$dir];
52         last if $seen{$x,$y}++;
53         $dir ^= 2;
54         ($dir) = $dirs{ $map[$y][$x] } =~ /([^$dir])/;
55 }
56
57 say "loop half: ", (keys %seen)/2;
58
59 my $sum;
60 for my $y (0 .. $ymax) {
61         my $in = 0;
62         for my $x (0 .. $xmax) {
63                 if ($seen{$x,$y}) {
64                         my $pt = $map[$y][$x];
65                         $in += 2 if $pt eq '|';
66                         $in++    if $pt =~ /[L7]/;
67                         $in--    if $pt =~ /[FJ]/;
68                 } elsif ($in % 4 == 2) {
69                         $sum++;
70                 }
71         }
72 }
73
74 say "inside: ", $sum;