]> www.fi.muni.cz Git - aoc2021.git/blob - 49.pl
Day 25: pretty straightforward
[aoc2021.git] / 49.pl
1 #!/usr/bin/perl -w
2
3 use v5.16;
4
5 my @m = map { chomp; [ split // ] } <>;
6
7 my $xmax = @{ $m[0] };
8 my $ymax = @m;
9
10 sub print_map {
11         my $m = shift;
12         for my $row (@m) {
13                 say join('', @$row);
14         }
15         say "";
16 }
17
18 my $step;
19 my $moved;
20 do {
21         $moved = 0;
22         my @m1;
23         for my $y (0 .. $ymax-1) {
24                 for my $x (0 .. $xmax-1) {
25                         if ($m[$y][$x] eq '>') {
26                                 my $nx = $x+1;
27                                 $nx = 0 if $nx >= $xmax;
28                                 if ($m[$y][$nx] eq '.') {
29                                         $m1[$y][$nx] = '>';
30                                         $m1[$y][$x] = '.';
31                                         $moved++;
32                                 } else {
33                                         $m1[$y][$x] = $m[$y][$x];
34                                 }
35                         } else {
36                                 if (!defined $m1[$y][$x]) {
37                                         $m1[$y][$x] = $m[$y][$x];
38                                 }
39                         }
40                 }
41         }
42         @m = @m1;
43         @m1 = ();
44
45         for my $y (0 .. $ymax-1) {
46                 for my $x (0 .. $xmax-1) {
47                         if ($m[$y][$x] eq 'v') {
48                                 my $ny = $y+1;
49                                 $ny = 0 if $ny >= $ymax;
50                                 if ($m[$ny][$x] eq '.') {
51                                         $m1[$ny][$x] = 'v';
52                                         $m1[$y][$x] = '.';
53                                         $moved++;
54                                 } else {
55                                         $m1[$y][$x] = $m[$y][$x];
56                                 }
57                         } else {
58                                 if (!defined $m1[$y][$x]) {
59                                         $m1[$y][$x] = $m[$y][$x];
60                                 }
61                         }
62                 }
63         }
64         @m = @m1;
65         $step++;
66         print_map(\@m);
67 } while ($moved);
68
69 say "$step steps";
70