--- /dev/null
+#!/usr/bin/perl -w
+
+use v5.42;
+
+my @map = map { chomp; [ split // ] } <>;
+my $xmax = $#{ $map[0] };
+my $ymax = $#map;
+
+my $sum;
+
+for my $y (0 .. $ymax) {
+ for my $x (0 .. $xmax) {
+ next if $map[$y][$x] ne '@';
+ my $c = 0;
+ for my $dy (-1 .. 1) {
+ my $ny = $y + $dy;
+ next if $ny < 0 || $ny > $ymax;
+ for my $dx (-1 .. 1) {
+ next if $dy == 0 && $dx == 0;
+ my $nx = $x + $dx;
+ next if $nx < 0 || $nx > $xmax;
+ $c++ if $map[$ny][$nx] eq '@';
+ }
+ }
+ $sum++ if $c < 4;
+ }
+}
+
+say $sum;
--- /dev/null
+#!/usr/bin/perl -w
+
+use v5.42;
+
+my @map = map { chomp; [ split // ] } <>;
+my $xmax = $#{ $map[0] };
+my $ymax = $#map;
+
+my $sum;
+
+while (1) {
+ my @to_remove;
+ for my $y (0 .. $ymax) {
+ for my $x (0 .. $xmax) {
+ next if $map[$y][$x] ne '@';
+ my $c = 0;
+ for my $dy (-1 .. 1) {
+ my $ny = $y + $dy;
+ next if $ny < 0 || $ny > $ymax;
+ for my $dx (-1 .. 1) {
+ next if $dy == 0 && $dx == 0;
+ my $nx = $x + $dx;
+ next if $nx < 0 || $nx > $xmax;
+ $c++ if $map[$ny][$nx] eq '@';
+ }
+ }
+ push @to_remove, [$x, $y] if $c < 4;
+ }
+ }
+ last if !@to_remove;
+ for my $p (@to_remove) {
+ $map[$p->[1]][$p->[0]] = '.';
+ $sum++;
+ }
+}
+
+say $sum;