]> www.fi.muni.cz Git - aoc2020.git/blob - 34.pl
Task 9 Perl Golf-style
[aoc2020.git] / 34.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4
5 my $is_active;
6
7 my ($min_x, $min_y, $min_z, $min_q) = (-1, -1, -1, -1);
8 my ($max_x, $max_y, $max_z, $max_q) = (0, 0, 1, 1);
9
10 my $y = 0;
11 while (<>) {
12         chomp;
13         my $x = 0;
14         for (split //) {
15                 $is_active->{"$x,$y,0,0"} = 1
16                         if $_ eq '#';
17                 print "Active $x,$y,0,0\n";
18                 $x++;
19         }
20         $max_x = $x;
21         $y++;
22 }
23 $max_y = $y;
24
25 my $iter = 0;
26 while ($iter < 6) {
27         my $new_active;
28         my ($new_min_x, $new_min_y, $new_min_z, $new_min_q)
29                 = ($max_x, $max_y, $max_z, $max_q);
30         my ($new_max_x, $new_max_y, $new_max_z, $new_max_q)
31                 = ($min_x, $min_y, $min_z, $min_q);
32         print "iter $iter x=$min_x:$max_x, y=$min_y:$max_y, z=$min_z:$max_z, q=$min_q:$max_q\n";
33         for my $q ($min_q .. $max_q) {
34         for my $z ($min_z .. $max_z) {
35         for my $y ($min_y .. $max_y) {
36         for my $x ($min_x .. $max_x) {
37                 # print "Trying $x,$y,$z,$q: ";
38                 my $count = 0;
39                 for my $nx (-1 .. 1) {
40                 for my $ny (-1 .. 1) {
41                 for my $nz (-1 .. 1) {
42                 for my $nq (-1 .. 1) {
43                         next if $nx == 0 && $ny == 0 && $nz == 0 && $nq == 0;
44                         my $mx = $nx + $x;
45                         my $my = $ny + $y;
46                         my $mz = $nz + $z;
47                         my $mq = $nq + $q;
48                         $count++ if $is_active->{"$mx,$my,$mz,$mq"};
49                 } } } }
50                 # print "$count neighbours\n";
51                 if (($is_active->{"$x,$y,$z,$q"} && ($count == 2 || $count == 3))
52                         || (!$is_active->{"$x,$y,$z,$q"} && $count == 3)) {
53                         $new_active->{"$x,$y,$z,$q"} = 1;
54                         # print "new active: $x, $y, $z, $q\n";
55                         $new_min_x = $x if $x < $new_min_x;
56                         $new_min_y = $y if $y < $new_min_y;
57                         $new_min_z = $z if $z < $new_min_z;
58                         $new_min_q = $q if $q < $new_min_q;
59                         $new_max_x = $x if $x > $new_max_x;
60                         $new_max_y = $y if $y > $new_max_y;
61                         $new_max_z = $z if $z > $new_max_z;
62                         $new_max_q = $q if $q > $new_max_q;
63                 }
64         } } } }
65         $min_x = $new_min_x-1;
66         $min_y = $new_min_y-1;
67         $min_z = $new_min_z-1;
68         $min_q = $new_min_q-1;
69         $max_x = $new_max_x+1;
70         $max_y = $new_max_y+1;
71         $max_z = $new_max_z+1;
72         $max_q = $new_max_q+1;
73
74         $is_active = $new_active;
75         $iter++;
76 }
77
78 print "Acive: ", scalar keys %$is_active, "\n";
79