--- /dev/null
+#!/usr/bin/perl -w
+
+use v5.40;
+
+my @map = map { chomp; [ split // ] } <>;
+my $xmax = $#{ $map[0] };
+my $ymax = $#map;
+
+my $count;
+for my $y (0 .. $ymax) {
+ for my $x (0 .. $xmax) {
+ for my $dx (-1 .. 1) {
+ DIR:
+ for my $dy (-1 .. 1) {
+ next if $dx == 0 && $dy == 0;
+ for my $off (0 .. 3) {
+ my ($x1, $y1) = ($x + $dx*$off, $y + $dy*$off);
+ next DIR if $x1 < 0 || $x1 > $xmax;
+ next DIR if $y1 < 0 || $y1 > $ymax;
+ next DIR if $map[$y1][$x1] ne qw(X M A S)[$off];
+ }
+ $count++;
+ }
+ }
+ }
+}
+
+say $count;
+
--- /dev/null
+#!/usr/bin/perl -w
+
+use v5.40;
+
+my @map = map { chomp; [ split // ] } <>;
+my $xmax = $#{ $map[0] };
+my $ymax = $#map;
+
+my $count;
+for my $y (0 .. $ymax) {
+ for my $x (0 .. $xmax) {
+ for my $dx1 (-1 .. 1) {
+ for my $dy1 (-1 .. 1) {
+ next if $dx1 == 0 || $dy1 == 0;
+ DIR:
+ for my ($dx2, $dy2) ($dy1, -$dx1, -$dy1, $dx1) {
+ for my $off (-1 .. 1) {
+ my ($x1, $y1) = ($x + $dx1*$off, $y + $dy1*$off);
+ my ($x2, $y2) = ($x + $dx2*$off, $y + $dy2*$off);
+ next DIR if $x1 < 0 || $x1 > $xmax;
+ next DIR if $y1 < 0 || $y1 > $ymax;
+ next DIR if $x2 < 0 || $x2 > $xmax;
+ next DIR if $y2 < 0 || $y2 > $ymax;
+ next DIR if $map[$y1][$x1] ne qw(M A S)[$off+1];
+ next DIR if $map[$y2][$x2] ne qw(M A S)[$off+1];
+ }
+ $count++;
+ }
+ }
+ }
+ }
+}
+
+say $count/2;
+