aboutsummaryrefslogtreecommitdiff
path: root/challenge-077/abigail/Part2/solution.pl
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-077/abigail/Part2/solution.pl')
-rw-r--r--challenge-077/abigail/Part2/solution.pl56
1 files changed, 56 insertions, 0 deletions
diff --git a/challenge-077/abigail/Part2/solution.pl b/challenge-077/abigail/Part2/solution.pl
new file mode 100644
index 0000000000..784f4cd662
--- /dev/null
+++ b/challenge-077/abigail/Part2/solution.pl
@@ -0,0 +1,56 @@
+#!/opt/perl/bin/perl
+
+#
+# Exercise:
+# You are given m x n character matrix consists of O and X only.
+# Write a script to count the total number of X surrounded by O only.
+# Print 0 if none found.
+#
+
+use 5.032;
+
+use strict;
+use warnings;
+no warnings 'syntax';
+
+use experimental 'signatures';
+use experimental 'lexical_subs';
+
+#
+# Read in the board. Use 1 for an X, and 0 for an 0. Add a band
+# of 0's around the board.
+#
+
+my @board = map {[0, map ({/O/ ? 0 : 1} /[OX]/g), 0]} <>;
+push @board => [(0) x @{$board [0]}];
+unshift @board => [(0) x @{$board [0]}];
+
+my $count = 0;
+
+#
+# Iterate over the cells of the board board, skipping cells on the edge
+# (as we added them). For each 1, check the 8 cells surrounding the cell
+# (this will never be outside of the board). If one of the neighbouring
+# cells is a 1, move on the next cell. If no neighbouring cell is 1,
+# we add 1 to the count.
+#
+for (my $x = 1; $x < @board - 1; $x ++) {
+ ELEMENT:
+ for (my $y = 1; $y < @{$board [$x]} - 1; $y ++) {
+ next unless $board [$x] [$y];
+ foreach my $dx (-1 .. 1) {
+ foreach my $dy (-1 .. 1) {
+ next unless $dx || $dy;
+ next ELEMENT if $board [$x + $dx] [$y + $dy];
+ }
+ }
+ $count ++;
+ }
+}
+
+#
+# Print solution.
+#
+say $count;
+
+__END__