]> www.fi.muni.cz Git - aoc.git/commitdiff
Day 24: Maple
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Sun, 24 Dec 2023 08:21:23 +0000 (09:21 +0100)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Sun, 24 Dec 2023 08:21:23 +0000 (09:21 +0100)
2023/47.pl [new file with mode: 0755]
2023/48.pl [new file with mode: 0755]

diff --git a/2023/47.pl b/2023/47.pl
new file mode 100755 (executable)
index 0000000..4a96dfa
--- /dev/null
@@ -0,0 +1,52 @@
+#!/usr/bin/perl -w
+
+use v5.38;
+
+my @stones = map { chomp; [ /-?\d+/g ] } <>;
+my ($min, $max) = (200000000000000, 400000000000000);
+# my ($min, $max) = (7, 27);
+
+sub from_param {
+       my ($x0, $y0, $z0, $xs, $ys, $zs) = @_;
+       return ($ys/$xs, $y0-($ys*$x0/$xs));
+}
+
+sub to_time {
+       my ($x, $xs, $x0) = @_;
+       return ($x-$x0)/$xs;
+}
+
+my $sum;
+for my $s1 (0 .. $#stones-1) {
+       my @st1 = @{ $stones[$s1] };
+       my ($a, $b) = from_param(@st1);
+       say "y=$a*x + $b";
+
+       for my $s2 ($s1+1 .. $#stones) {
+               my @st2 = @{ $stones[$s2] };
+               my ($c, $d) = from_param(@st2);
+               say "  y=$c*x + $d";
+               if ($a == $c) {
+                       if ($b == $d) {
+                               die "two same lines";
+                       }
+                       next;
+               }
+               my $xi = ($d-$b)/($a-$c);
+               my $yi = $a*$xi + $b;
+               my $t0 = to_time($xi, $st1[3], $st1[0]);
+               my $t1 = to_time($xi, $st2[3], $st2[0]);
+               say "  intersection at $xi, $yi at $t0 $t1";
+               if ($xi < $min || $xi > $max || $yi < $min || $yi > $max) {
+                       say "  outside";
+                       next;
+               }
+               if ($t0 < 0 || $t1 < 0) {
+                       say "  in the past";
+                       next;
+               }
+               $sum++;
+       }
+}
+
+say $sum;
diff --git a/2023/48.pl b/2023/48.pl
new file mode 100755 (executable)
index 0000000..89bd982
--- /dev/null
@@ -0,0 +1,23 @@
+#!/usr/bin/perl -w
+
+use v5.38;
+
+my @stones = map { chomp; [ /-?\d+/g ] } <>;
+
+my @eq;
+for my $stone (0 .. 2) {
+       my @st = @{ $stones[$stone] };
+       for my $co (0 .. 2) {
+               my $c = $st[$co+3];
+               my $d = $st[$co];
+               push @eq, "a$co * t$stone + b$co = $c*t$stone + $d";
+       }
+}
+my @vars;
+push @vars, "a$_", "b$_", "t$_" for 0 .. 2;
+
+# Maple:
+say "res := solve({\n\t", join(",\n\t", @eq), "\n},";
+say "\t[", join(", ", @vars), " ]";
+say ");";
+say "res[1][2]+res[1][5]+res[1][8];";