#!/usr/bin/perl use v5.35.0; # Parse map to make a hash, keyed by antenna frequency code, # whose values are references to lists of antennas, each # represented as a row,column coordinate pair. Note that the # lists end up ordered by row, then by column. my %antennas; my ($r, $c) = (0, 0); while (<>) { chomp; $c = 0; for (split //) { push @{$antennas{$_}}, "$r,$c" if (/[0-9A-Za-z]/); ++$c; } ++$r; } my ($height, $width) = ($r, $c); # Walk the hash to locate the antinodes. my %antinodes; for my $freq (keys %antennas) { my @list = @{$antennas{$freq}}; for my $i (0 .. $#list) { my ($ri,$ci) = split /,/, $list[$i]; for my $j ($i + 1 .. $#list) { my ($rj,$cj) = split /,/, $list[$j]; my ($rd,$cd) = ($rj - $ri, $cj - $ci); for ( my ($r,$c) = ($ri,$ci); 0 <= $r && 0 <= $c < $width; $r -= $rd, $c -= $cd ) { $antinodes{"$r,$c"} = 1; } for ( my ($r,$c) = ($rj,$cj); $r < $height && 0 <= $c < $width; $r += $rd, $c += $cd ) { $antinodes{"$r,$c"} = 1; } } } } say scalar keys %antinodes;