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} };
51 my ($x,$y) = split /,/;
56 my ($ax, $ay) = split /,/;
57 next if $ax == $x && $ay == $y;
58 # say "testing $ax,$ay from $x,$y";
59 my ($dx, $dy) = dir($ax-$x, $ay-$y);
60 # next if $tried_dir{$dx,$dy}++;
61 # say "dx,dy=$dx,$dy";
62 my ($x0, $y0) = ($x+$dx, $y+$dy);
63 while ($x0 != $ax || $y0 != $ay) {
64 # say "x0,y0=$x0,$y0";
66 # say "$ax,$ay cannot be seen from $x,$y because of $x0,$y0";
69 $x0 += $dx; $y0 += $dy;
71 # say "$ax,$ay CAN be seen from $x,$y";
72 push @dirs, [$dx, $dy];
75 if (!defined $max_sum || $max_sum < $sum) {
82 say $max_pos, '=', $max_sum;
85 ($x, $y) = split /,/, $max_pos;
87 (grep { $_->[0] == 0 && $_->[1] < 0 } @max_dirs),
88 (sort { $b->[0]/$b->[1] <=> $a->[0]/$a->[1] }
89 grep { $_->[0] > 0 && $_->[1] < 0 } @max_dirs),
90 (grep { $_->[0] > 0 && $_->[1] == 0 } @max_dirs),
91 (sort { $b->[0]/$b->[1] <=> $a->[0]/$a->[1] }
92 grep { $_->[0] > 0 && $_->[1] > 0 } @max_dirs),
93 (grep { $_->[0] == 0 && $_->[1] > 0 } @max_dirs),
94 (sort { $b->[0]/$b->[1] <=> $a->[0]/$a->[1] }
95 grep { $_->[0] < 0 && $_->[1] > 0 } @max_dirs),
96 (grep { $_->[0] < 0 && $_->[1] == 0 } @max_dirs),
97 (sort { $b->[0]/$b->[1] <=> $a->[0]/$a->[1] }
98 grep { $_->[0] < 0 && $_->[1] < 0 } @max_dirs),
106 for my $dir (@dirs) {
107 my ($dx,$dy) = @$dir;
108 next if $skip_dir{$dx,$dy};
110 my ($x0, $y0) = ($x + $dx, $y + $dy);
111 while ($x0 >= 0 && $y0 >= 0 && $x0 < $maxx && $y0 < $maxy) {
112 if (!$seen{$x0,$y0} && $m{$x0,$y0}) {
114 say ++$count, " at $x0,$y0 dir $dx,$dy (", 100*$x0+$y0, ")";
115 exit 0 if $count == 200;
118 $x0 += $dx; $y0 += $dy;
120 $skip_dir{$dx,$dy}=1;