]> www.fi.muni.cz Git - aoc.git/blob - 2023/20.pl
c6d299aecd3fe8177ca60591553fb78300f47af6
[aoc.git] / 2023 / 20.pl
1 #!/usr/bin/perl -w
2
3 use v5.38;
4 use experimental 'multidimensional', 'for_list', 'builtin';
5 use builtin 'indexed';
6 use List::Util;
7 use Y::AoC::Task;
8 $; = ';';
9 # t;
10
11 my @map = map { chomp; [ split //, ".$_." ] } <>;
12 push @map, [ ('.') x @{ $map[0]} ];
13 unshift @map, [ ('.') x @{$map[0]} ];
14 my $xmax = $#{$map[0]};
15 my $ymax = $#map;
16
17 my ($sx, $sy);
18 for my $x (0 .. $xmax) {
19 for my $y (0 .. $ymax) {
20         next if $map[$y][$x] ne 'S';
21         $sx = $x; $sy = $y;
22 } }
23
24
25 my %dirs = (
26         '|' => [ 0, -1,  0,  1],
27         '-' => [-1,  0,  1,  0],
28         'J' => [-1,  0,  0, -1],
29         'L' => [ 1,  0,  0, -1],
30         'F' => [ 1,  0,  0,  1],
31         '7' => [-1,  0,  0,  1],
32 );
33
34
35 if ($map[$sy][$sx-1] eq '-' && $map[$sy][$sx+1] eq '-') {
36         $map[$sy][$sx] = '-';
37 } elsif ($map[$sy+1][$sx] eq '|' && $map[$sy-1][$sx] eq '|') {
38         $map[$sy][$sx] = '|';
39 } elsif ($map[$sy][$sx-1] eq '-' && $map[$sy-1][$sx] eq '|') {
40         $map[$sy][$sx] = 'J';
41 } elsif ($map[$sy][$sx-1] eq '-' && $map[$sy+1][$sx] eq '|') {
42         $map[$sy][$sx] = '7';
43 } elsif ($map[$sy][$sx+1] eq '-' && $map[$sy-1][$sx] eq '|') {
44         $map[$sy][$sx] = 'L';
45 } elsif ($map[$sy][$sx+1] eq '-' && $map[$sy+1][$sx] eq '|') {
46         $map[$sy][$sx] = 'F';
47 }
48
49 say "starting at $sx, $sy $map[$sy][$sx]";
50 my %seen;
51 my $len = 0;
52 my ($px, $py);
53 while (!$seen{$sx,$sy}++) {
54         my @d = $dirs{ $map[$sy][$sx] }->@*;
55         if (!defined($px) || ($px != $d[0] || $py != $d[1])) {
56                 $sx += $d[0];
57                 $sy += $d[1];
58                 $px = -$d[0];
59                 $py = -$d[1];
60         } else {
61                 $sx += $d[2];
62                 $sy += $d[3];
63                 $px = -$d[2];
64                 $py = -$d[3];
65         }
66         ++$len;
67 }
68
69 say "loop len ", $len/2;
70
71 my $sum;
72 for my $x (0 .. $xmax) {
73         my $in = 0;
74         my $left = 0;
75         for my $y (0 .. $ymax) {
76                 if ($seen{$x,$y}) {
77                         my $pt = $map[$y][$x];
78                         if ($pt eq '-') {
79                                 $in = !$in;
80                         } elsif ($pt eq '7') {
81                                 $left = 1;
82                         } elsif ($pt eq 'F') {
83                                 $left = -1;
84                         } elsif ($pt eq 'J') {
85                                 if ($left == -1) {
86                                         $in = !$in;
87                                 }
88                         } elsif ($pt eq 'L') {
89                                 if ($left == 1) {
90                                         $in = !$in;
91                                 }
92                         }
93                         say "$x $y in $in left $left";
94                 } elsif ($in) {
95                         say "$x $y inside";
96                         $sum++;
97                 }
98         }
99 }
100
101 say $sum;