]> www.fi.muni.cz Git - aoc.git/blob - 2019/24.pl
Day 25: examining the input
[aoc.git] / 2019 / 24.pl
1 #!/usr/bin/perl -w
2
3 use v5.16;
4 use Data::Dumper;
5
6 my (@m, @v);
7 while (<>) {
8         my @row = /-?\d+/g;
9         push @m, [ @row ];
10         push @v, [ 0, 0, 0];
11 }
12
13 my @states;
14 my $rep = 0;
15 my @reps;
16 my $i = 0;
17 while (1) {
18         for my $m1 (0 .. $#m) {
19         for my $m2 (0 .. $#m) {
20                 next if $m1 == $m2;
21                 for my $c (0 .. 2) {
22                         $v[$m1][$c]++ if $m[$m1][$c] < $m[$m2][$c];
23                         $v[$m1][$c]-- if $m[$m1][$c] > $m[$m2][$c];
24                 }
25         } }
26         for my $m1 (0 .. $#m) {
27                 for my $c (0 .. 2) {
28                         $m[$m1][$c] += $v[$m1][$c];
29                 }
30         }
31         for my $c (0 .. 2) {
32                 next if $reps[$c];
33                 my $state = join(',', (map { $_->[$c] } @m), (map { $_->[$c] } @v));
34                 next unless $states[$c]->{$state}++;
35                 $reps[$c] = $i;
36                 $rep++;
37         }
38         last if $rep > 2;
39         $i++;
40 }
41
42 sub gcd {
43         my ($n1, $n2) = @_;
44         while ($n1 != $n2) {
45                 ($n1, $n2) = ($n2, $n1) if $n1 < $n2;
46                 $n1 -= $n2;
47         }
48         return $n1;
49 }
50
51 say "reps: ", join(',', @reps);
52 my $m = $reps[0]*$reps[1]/gcd($reps[0], $reps[1]);
53 $m = $m*$reps[2]/gcd($m, $reps[2]);
54 say $m;
55
56 my $sum;
57 for my $m1 (0 .. $#m) {
58         my ($pot, $kin);
59         for my $c (0 .. 2) {
60                 $pot += abs($m[$m1][$c]);
61                 $kin += abs($v[$m1][$c]);
62         }
63         $sum += $pot*$kin;
64 }
65
66 say $sum;
67                 
68
69