]> www.fi.muni.cz Git - aoc.git/blob - 2018/33.pl
Day 25: examining the input
[aoc.git] / 2018 / 33.pl
1 #!/usr/bin/perl -w
2
3 use v5.30;
4 use strict;
5
6 my %map;
7
8 my ($ymin, $ymax, $xmin, $xmax);
9
10 while (<>) {
11         chomp;
12         my ($c1n, $c1, $c2min, $c2max) = /\A(.)=(\d+), .=(\d+)\.\.(\d+)/;
13
14         for my $c2 ($c2min .. $c2max) {
15                 if ($c1n eq 'x') {
16                         $map{$c1}{$c2} = '#';
17                         $ymin = $c2 if !defined $ymin || $ymin > $c2;
18                         $ymax = $c2 if !defined $ymax || $ymax < $c2;
19                         $xmin = $c1 if !defined $xmin || $xmin > $c1;
20                         $xmax = $c1 if !defined $xmax || $xmax < $c1;
21                 } else {
22                         $map{$c2}{$c1} = '#';
23                         $ymin = $c1 if !defined $ymin || $ymin > $c1;
24                         $ymax = $c1 if !defined $ymax || $ymax < $c1;
25                         $xmin = $c2 if !defined $xmin || $xmin > $c2;
26                         $xmax = $c2 if !defined $xmax || $xmax < $c2;
27                 }
28         }
29 }
30 $xmin--;
31 $xmax++;
32
33 say "y=$ymin .. $ymax";
34
35 my $iter = 0;
36 sub dump_map {
37         return if $iter++ % 1000;
38         my $total = 0;
39         for my $y (0 .. $ymax) {
40                 for my $x ($xmin .. $xmax) {
41                         print $map{$x}{$y} // ' ';
42                         $total++ if defined $map{$x}{$y}
43                                 && $map{$x}{$y} =~ /[~0]/;
44                 }
45                 print "\n";
46         }
47         say "total=$total";
48         return $total;
49 }
50
51 dump_map();
52
53 my $total = 0;
54
55 sub explore {
56         my ($x, $y) = @_;
57         return 0 if $y > $ymax;
58         $map{$x}{$y} //= 0;
59         my $was_change;
60         while (1) {
61                 $was_change = 0;
62                 say "explore $x, $y";
63                 dump_map();
64                 my $xp = $x;
65                 while ($map{$xp}{$y+1}) {
66                         last if $map{$xp+1}{$y};
67                         $xp++;
68                         $map{$xp}{$y} //= 0;
69                 }
70                 my $xm = $x;
71                 while ($map{$xm}{$y+1}) {
72                         last if $map{$xm-1}{$y};
73                         $xm--;
74                         $map{$xm}{$y} //= 0;
75                 }
76
77                 say "$xm .. $xp";
78                 if (!$map{$xp}{$y+1} && $y < $ymax) {
79                         $map{$xp}{$y} //= 0;
80                         if (!defined $map{$xp}{$y+1}) {
81                                 say "calling to $xp, $y+1";
82                                 $was_change += explore($xp, $y+1);
83                         }
84                 }
85
86                 if (!$map{$xm}{$y+1} && $y < $ymax) {
87                         $map{$xm}{$y} //= 0;
88                         if (!defined $map{$xm}{$y+1}) {
89                                 say "calling to $xm, $y+1";
90                                 $was_change += explore($xm, $y+1);
91                         }
92                 }
93                 say "was_change = $was_change";
94                 
95                 next if $was_change;
96
97                 if ($map{$xp+1}{$y} && $map{$xm-1}{$y}) {
98                         for my $x0 ($xm .. $xp) {
99                                 $map{$x0}{$y} = '~';
100                         }
101                         return 1;
102                 }
103                 last;
104         }
105         say "$x,$y returning $was_change";
106         return $was_change;
107 }
108
109 explore(500, $ymin);
110
111 $iter = 0;
112 dump_map();
113