X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=2023%2F47.pl;fp=2023%2F47.pl;h=4a96dfae9f1c15109f0faa8a0fea55c8da292af1;hb=2f3400900f836b8b0b781bc3b0c9a380dd999b6d;hp=0000000000000000000000000000000000000000;hpb=cb7662a16eca1ff55e28338ef8ea7161224ac078;p=aoc.git 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;