]> www.fi.muni.cz Git - aoc.git/commitdiff
Day 15: first ugly naive working solution
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Thu, 15 Dec 2022 07:03:38 +0000 (08:03 +0100)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Thu, 15 Dec 2022 07:03:38 +0000 (08:03 +0100)
2022/29.pl [new file with mode: 0755]
2022/30.pl [new file with mode: 0755]

diff --git a/2022/29.pl b/2022/29.pl
new file mode 100755 (executable)
index 0000000..71896f3
--- /dev/null
@@ -0,0 +1,44 @@
+#!/usr/bin/perl -w
+
+use v5.36;
+use strict;
+use experimental 'multidimensional';
+
+my $row = 2000000;
+
+my @ints;
+
+my %corr;
+
+while (<>) {
+       my ($sx, $sy, $cx, $cy) = /(-?\d+)/g;
+       my $r = abs($sx - $cx) + abs($sy - $cy);
+       my $dist = abs($sy - $row);
+       say "dist =$dist";
+       if ($dist < $r) {
+               my $l = abs($dist-$r);
+               push @ints, [ $sx - ($r - $dist), $sx + ($r - $dist) ];
+               say "$ints[-1][0] $ints[-1][1]";
+               $corr{$cx} = 1 if $cy == $row;
+       }
+}
+
+@ints = sort { $a->[0] <=> $b->[0] } @ints;
+my $prev = shift @ints;
+my $sum = $prev->[1] - $prev->[0] + 1;
+
+for my $int (@ints) {
+       if ($int->[0] > $prev->[1]) {
+               $sum += $int->[1] - $int->[0] + 1;
+               $prev = $int;
+       } elsif ($int->[1] <= $prev->[1]) {
+               next;
+       } else {
+               $sum += $int->[1] - $prev->[1];
+               $prev = $int;
+       }
+}
+
+say $sum - keys %corr;
+               
+
diff --git a/2022/30.pl b/2022/30.pl
new file mode 100755 (executable)
index 0000000..3dc0e5f
--- /dev/null
@@ -0,0 +1,57 @@
+#!/usr/bin/perl -w
+
+use v5.36;
+use strict;
+use experimental 'multidimensional';
+
+my $row = 2000000;
+my $max = 4000000;
+
+my @input = <>;
+
+sub compute_row($row) {
+       my @ints;
+       my %corr;
+
+       for (@input) {
+               my ($sx, $sy, $cx, $cy) = /(-?\d+)/g;
+               my $r = abs($sx - $cx) + abs($sy - $cy);
+               my $dist = abs($sy - $row);
+               # say "dist =$dist";
+               if ($dist < $r) {
+                       my ($l, $r) = ($sx - ($r - $dist), $sx + ($r - $dist));
+                       next if $r < 0 || $l > $max;
+                       $l = 0 if $l < 0;
+                       $r = $max if $r > $max;
+                       push @ints, [$l, $r];
+                       # say "$ints[-1][0] $ints[-1][1]";
+                       $corr{$cx} = 1 if $cy == $row;
+               }
+       }
+
+       @ints = sort { $a->[0] <=> $b->[0] } @ints;
+       my $prev = shift @ints;
+       if ($prev->[0]) {
+               say "at 0 $row";
+               exit 0;
+       }
+       my $sum = $prev->[1] - $prev->[0] + 1;
+
+       for my $int (@ints) {
+               if ($int->[0] < $max && $int->[0] > $prev->[1]+1) {
+                       say "at ", $prev->[1]+1, " $row: ", 4000000*($prev->[1]+1)+$row;
+                       exit 0;
+               } elsif ($int->[1] <= $prev->[1]) {
+                       next;
+               } else {
+                       $prev = $int;
+               }
+               last if $prev->[1] > $max;
+       }
+}
+
+for (1 .. $max) {
+       compute_row($_);
+       say "row $_" if $_ % 1000 == 0;
+}
+