]> www.fi.muni.cz Git - aoc.git/blob - 2022/30.pl
Day 25: examining the input
[aoc.git] / 2022 / 30.pl
1 #!/usr/bin/perl -w
2
3 use v5.36;
4 use strict;
5 use experimental 'multidimensional';
6
7 my $max = 4000000;
8
9 my @input = map {
10         my ($x, $y, $cx, $cy) = /(-?\d+)/g;
11         [ $x, $y, abs($x-$cx) + abs($y-$cy) ]
12 } <>;
13
14 sub compute_row($row) {
15         my @ints;
16
17         for (@input) {
18                 my ($sx, $sy, $r) = @$_;
19                 my $dist = abs($sy - $row);
20                 next if $dist > $r;
21
22                 my ($left, $right) = ($sx - ($r - $dist), $sx + ($r - $dist));
23                 next if $right < 0 || $left > $max;
24                 $left = 0 if $left < 0;
25                 $right = $max if $right > $max;
26                 push @ints, [$left, $right];
27         }
28
29         @ints = sort { $a->[0] <=> $b->[0] } @ints;
30         my $prev = (shift @ints)->[1];
31
32         for my $int (@ints) {
33                 next if $int->[1] <= $prev;
34                 if ($int->[0] > $prev+1) {
35                         say "at ", $prev+1, " $row: ",
36                                 4000000*($prev+1)+$row;
37                         exit 0;
38                 }
39                 $prev = $int->[1];
40         }
41 }
42
43 for (0 .. $max) {
44         compute_row($_);
45         say "row $_" if $_ % 10_000 == 0;
46 }
47