--- /dev/null
+#!/usr/bin/perl -w
+
+use v5.38;
+use experimental 'for_list';
+
+my @map = map { chomp; [ split // ] } <>;
+my $xmax = $#{ $map[0] };
+my $ymax = $#map;
+
+my $sum;
+for my $y (0 .. $ymax) {
+ for my $x (0 .. $xmax) {
+ walk($x, $y, {}) if !$map[$y][$x];
+ }
+}
+say $sum;
+
+sub walk {
+ my ($x, $y, $seen) = @_;
+ return if $seen->{"$x,$y"}++;
+
+ my $now = $map[$y][$x];
+ if ($now == 9) {
+ $sum++;
+ return;
+ }
+
+ for my ($dx, $dy) (
+ -1, 0,
+ 1, 0,
+ 0, -1,
+ 0, 1,
+ ) {
+ my ($nx, $ny) = ($x+$dx, $y+$dy);
+ next if $nx < 0 || $nx > $xmax || $ny < 0 || $ny > $ymax;
+ next if $map[$ny][$nx] != $now + 1;
+ walk($nx, $ny, $seen);
+ }
+}
--- /dev/null
+#!/usr/bin/perl -w
+
+use v5.38;
+use experimental 'for_list';
+
+my @map = map { chomp; [ split // ] } <>;
+my $xmax = $#{ $map[0] };
+my $ymax = $#map;
+
+my $sum;
+for my $y (0 .. $ymax) {
+ for my $x (0 .. $xmax) {
+ walk($x, $y) if !$map[$y][$x];
+ }
+}
+say $sum;
+
+sub walk {
+ my ($x, $y) = @_;
+
+ my $now = $map[$y][$x];
+ if ($now == 9) {
+ $sum++;
+ return;
+ }
+
+ for my ($dx, $dy) (
+ -1, 0,
+ 1, 0,
+ 0, -1,
+ 0, 1,
+ ) {
+ my ($nx, $ny) = ($x+$dx, $y+$dy);
+ next if $nx < 0 || $nx > $xmax || $ny < 0 || $ny > $ymax;
+ next if $map[$ny][$nx] != $now + 1;
+ walk($nx, $ny);
+ }
+}