]> www.fi.muni.cz Git - aoc.git/blob - 2023/36.pl
Day 25: examining the input
[aoc.git] / 2023 / 36.pl
1 #!/usr/bin/perl -w
2
3 use v5.38;
4
5 my ($x, $y) = (20_000_000, 20_000_000);
6 my %dir = (
7         0 => [ 1,  0 ],
8         1 => [ 0,  1 ],
9         2 => [ -1, 0 ],
10         3 => [ 0, -1 ],
11 );
12
13 my %map;
14 my %dirs;
15 while (<>) {
16         my ($len, $dir) = /\(\#(\w+)(\w)\)/;
17         $len = hex $len;
18         $map{$y}{$x} |= (1 << $dir);
19         $x += $len * $dir{$dir}->[0];
20         $y += $len * $dir{$dir}->[1];
21         $map{$y}{$x} |= (1 << ($dir ^ 2));
22         say "at $x,$y dir $dir len $len";
23 }
24
25 sub sum_int {
26         my @pts = @_;
27         my $sum = 0;
28         my $in;
29         my $prev;
30         for my $pt (@pts) {
31                 if (defined $prev && $in) {
32                         $sum += $pt - $prev + 1;
33                 }
34                 $prev = $pt;
35                 $in = !$in;
36         }
37         return $sum;
38 }
39
40 my @pts;
41 my $y0;
42 my $sum;
43 for my $y1 (sort { $a <=> $b } keys %map) {
44         say "y $y1";
45         my $in;
46         my $x0;
47         my @nx;
48         my @tx;
49         my $rowsum;
50         if (defined $y0) {
51                 my $psum = sum_int(@pts);
52                 $sum += ($y1-$y0-1) * $psum;
53         }
54
55         for my $x1 (sort { $a <=> $b } (@pts, keys %{ $map{$y1} })) {
56                 next if $x0 && $x1 == $x0;
57                 my $d = $map{$y1}{$x1};
58                 my $d0 = $map{$y1}{$x0} if defined $x0;
59                 say " at $x1,$y1 ", $d // "|";
60                 push @nx, $x1
61                         if !defined $d || ($d & 2);
62                 if (!defined $d) {
63                         push @tx, $x1;
64                 } elsif ($d & 4) {
65                         if (@tx & 1) {
66                                 if (($d0 == 9 && $d == 6) || ($d0 == 3 && $d == 12)) {
67                                         push @tx, $x1;
68                                 }
69                         } else {
70                                 push @tx, $x0;
71                                 if (($d0 == 9 && $d == 12) || ($d0 == 3 && $d == 6)) {
72                                         push @tx, $x1;
73                                 }
74                         }
75                 }
76
77                 if (defined $x0) {
78                         say "   int $x0 .. $x1";
79                         
80                         $in = !$in;
81                         if ($in) {
82                                 $rowsum += $x1 - $x0 + 1;
83                         }
84                 }
85                 $x0 = $x1;
86         }
87         $sum += sum_int(@tx);
88         say " tx=@tx sum ", sum_int(@tx);
89         say " nx=@nx sum ", sum_int(@nx);
90         @pts = @nx;
91         $y0 = $y1;
92 }
93
94 say $sum;
95