From 2f3400900f836b8b0b781bc3b0c9a380dd999b6d Mon Sep 17 00:00:00 2001 From: "Jan \"Yenya\" Kasprzak" Date: Sun, 24 Dec 2023 09:21:23 +0100 Subject: [PATCH] Day 24: Maple --- 2023/47.pl | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2023/48.pl | 23 +++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100755 2023/47.pl create mode 100755 2023/48.pl diff --git a/2023/47.pl b/2023/47.pl new file mode 100755 index 0000000..4a96dfa --- /dev/null +++ b/2023/47.pl @@ -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 index 0000000..89bd982 --- /dev/null +++ b/2023/48.pl @@ -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];"; -- 2.43.0