--- /dev/null
+#!/usr/bin/perl -w
+
+use v5.40;
+
+my %ant;
+
+my ($w, $h);
+while (<>) {
+ chomp;
+ $w //= length()-1;
+ push @{ $ant{$&} }, [ $. - 1, pos()-1 ] while /\w/g;
+}
+$h = $.-1;
+
+my %seen;
+for my $freq (keys %ant) {
+ my @ants = $ant{$freq}->@*;
+ for my $i1 (0 .. $#ants-1) {
+ my $a1 = $ants[$i1];
+ for my $i2 ($i1+1 .. $#ants) {
+ my $a2 = $ants[$i2];
+ my ($dx, $dy) = (
+ $a1->[0] - $a2->[0],
+ $a1->[1] - $a2->[1],
+ );
+ for my ($x, $y) (
+ $a2->[0]-$dx, $a2->[1]-$dy,
+ $a1->[0]+$dx, $a1->[1]+$dy,
+ ) {
+ $seen{"$x,$y"}++
+ if $x >= 0 && $x <= $w
+ && $y >= 0 && $y <= $h;
+ }
+ }
+ }
+}
+say scalar keys %seen;
--- /dev/null
+#!/usr/bin/perl -w
+
+use v5.40;
+
+my %ant;
+my ($w, $h);
+while (<>) {
+ chomp;
+ $w //= length()-1;
+ push @{ $ant{$&} }, [ $. - 1, pos()-1 ]
+ while /\w/g;
+}
+$h = $.-1;
+
+sub gcd($a, $b) {
+ ($a, $b) = ($b, $a) if $a < $b;
+ ($a, $b) = ($b, $a % $b) while $b;
+ return $a;
+}
+
+my %seen;
+for my $freq (keys %ant) {
+ my @ants = $ant{$freq}->@*;
+ for my $i1 (0 .. $#ants-1) {
+ my $a1 = $ants[$i1];
+
+ for my $i2 ($i1+1 .. $#ants) {
+ my $a2 = $ants[$i2];
+
+ my ($dx, $dy) = (
+ $a1->[0] - $a2->[0],
+ $a1->[1] - $a2->[1],
+ );
+ my $g = gcd(abs($dx), abs($dy));
+ $dx /= $g; $dy /= $g;
+
+ for my $dir (-1, 1) {
+ my $t = 0;
+ while (1) {
+ my $x = $a1->[0]+$dir*$t*$dx;
+ my $y = $a1->[1]+$dir*$t*$dy;
+ last if $x < 0 || $x > $w
+ || $y < 0 || $y > $h;
+ $seen{"$x,$y"}++;
+ $t++;
+ }
+ }
+ }
+ }
+}
+
+say scalar keys %seen;