13 for my $c (split //) {
14 $m{$x,$y}++ if $c eq '#';
24 return $gcd{$n1,$n2} //=
26 : $n1 > $n2 ? gcd($n2, $n1-$n2)
33 return (0, 1) if $x == 0 && $y > 0;
34 return (0,-1) if $x == 0 && $y < 0;
35 return (1, 0) if $y == 0 && $x > 0;
36 return (-1,0) if $y == 0 && $x < 0;
37 my $g = gcd(abs($x), abs($y));
38 return ($x/$g, $y/$g);
43 $dir{$x,$y} //= [ dir1($x,$y) ];
44 return @{ $dir{$x,$y} };
49 my ($x,$y) = split /,/;
52 my ($ax, $ay) = split /,/;
53 next if $ax == $x && $ay == $y;
54 say "testing $ax,$ay from $x,$y";
55 my ($dx, $dy) = dir($ax-$x, $ay-$y);
56 # next if $tried_dir{$dx,$dy}++;
58 my ($x0, $y0) = ($x+$dx, $y+$dy);
59 while ($x0 != $ax || $y0 != $ay) {
62 say "$ax,$ay cannot be seen from $x,$y because of $x0,$y0";
65 $x0 += $dx; $y0 += $dy;
67 say "$ax,$ay CAN be seen from $x,$y";
72 my @s = sort { $sum{$b} <=> $sum{$a} } keys %sum;
73 say $s[0], '=', $sum{$s[0]};