]> www.fi.muni.cz Git - aoc.git/blob - 2022/30.pl
Day 15: first ugly naive working solution
[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 $row = 2000000;
8 my $max = 4000000;
9
10 my @input = <>;
11
12 sub compute_row($row) {
13         my @ints;
14         my %corr;
15
16         for (@input) {
17                 my ($sx, $sy, $cx, $cy) = /(-?\d+)/g;
18                 my $r = abs($sx - $cx) + abs($sy - $cy);
19                 my $dist = abs($sy - $row);
20                 # say "dist =$dist";
21                 if ($dist < $r) {
22                         my ($l, $r) = ($sx - ($r - $dist), $sx + ($r - $dist));
23                         next if $r < 0 || $l > $max;
24                         $l = 0 if $l < 0;
25                         $r = $max if $r > $max;
26                         push @ints, [$l, $r];
27                         # say "$ints[-1][0] $ints[-1][1]";
28                         $corr{$cx} = 1 if $cy == $row;
29                 }
30         }
31
32         @ints = sort { $a->[0] <=> $b->[0] } @ints;
33         my $prev = shift @ints;
34         if ($prev->[0]) {
35                 say "at 0 $row";
36                 exit 0;
37         }
38         my $sum = $prev->[1] - $prev->[0] + 1;
39
40         for my $int (@ints) {
41                 if ($int->[0] < $max && $int->[0] > $prev->[1]+1) {
42                         say "at ", $prev->[1]+1, " $row: ", 4000000*($prev->[1]+1)+$row;
43                         exit 0;
44                 } elsif ($int->[1] <= $prev->[1]) {
45                         next;
46                 } else {
47                         $prev = $int;
48                 }
49                 last if $prev->[1] > $max;
50         }
51 }
52
53 for (1 .. $max) {
54         compute_row($_);
55         say "row $_" if $_ % 1000 == 0;
56 }
57