aboutsummaryrefslogtreecommitdiff
path: root/challenge-084/juliodcs
diff options
context:
space:
mode:
authorjuliodcs <julio.dcs@gmail.com>2020-10-27 19:37:39 +0100
committerjuliodcs <julio.dcs@gmail.com>2020-10-27 19:37:39 +0100
commitbb4198a23850af2c2031d924d2ef39c60ed6ee69 (patch)
treeb656c3be7952a1ebf9e7399fa03177de80f1422d /challenge-084/juliodcs
parentcbf73c5afb3183f2b6c35746368aa1372e5c6c88 (diff)
downloadperlweeklychallenge-club-bb4198a23850af2c2031d924d2ef39c60ed6ee69.tar.gz
perlweeklychallenge-club-bb4198a23850af2c2031d924d2ef39c60ed6ee69.tar.bz2
perlweeklychallenge-club-bb4198a23850af2c2031d924d2ef39c60ed6ee69.zip
juliodcs-week78
Diffstat (limited to 'challenge-084/juliodcs')
-rw-r--r--challenge-084/juliodcs/perl/ch-2-recursive.pl39
-rw-r--r--challenge-084/juliodcs/perl/ch-2.pl20
-rw-r--r--challenge-084/juliodcs/raku/ch-2-recursive.raku46
-rw-r--r--challenge-084/juliodcs/raku/ch-2.raku20
4 files changed, 105 insertions, 20 deletions
diff --git a/challenge-084/juliodcs/perl/ch-2-recursive.pl b/challenge-084/juliodcs/perl/ch-2-recursive.pl
new file mode 100644
index 0000000000..0f54c32d50
--- /dev/null
+++ b/challenge-084/juliodcs/perl/ch-2-recursive.pl
@@ -0,0 +1,39 @@
+use strict;
+use warnings;
+use feature qw(say state);
+use experimental 'signatures';
+
+sub count_squares($matrix) {
+ my $h = @{ $matrix };
+ my $w = @{ $matrix->[0] };
+ my $sq_size = $h < $w ? $h : $w;
+
+ my $_all_ones = sub($y, $x, $size) {
+ return $matrix->[$y ][$x ]
+ && $matrix->[$y+$size-1][$x ]
+ && $matrix->[$y ][$x+$size-1]
+ && $matrix->[$y+$size-1][$x+$size-1] ? 1 : 0;
+ };
+
+ my $_count_squares;
+ $_count_squares = sub($size, $y, $x, $acc) {
+ return $size > $sq_size ? $acc
+ : $y > $h - $size ? $_count_squares->($size + 1, 0, 0, $acc)
+ : $x > $w - $size ? $_count_squares->($size, $y + 1, 0, $acc)
+ : $_count_squares->($size, $y, $x + 1, $acc + $_all_ones->($y, $x, $size));
+ };
+
+ return $_count_squares->(2, 0, 0, 0);
+}
+
+use Test::More;
+
+is count_squares([[1, 1], [1, 1]]), 1, 'Simple matrix';
+is count_squares([[1, 1], [1, 0]]), 0, 'Simple matrix, incomplete';
+is count_squares([[1, 1], [1, 0], [1, 1], [1, 1]]), 1, 'Simple (w != h) matrix';
+is count_squares([[1, 1], [1, 1], [1, 1], [1, 1]]), 3, 'Simple (w != h) matrix, all complete';
+is count_squares([[0, 1, 0, 1], [0, 0, 1, 0], [1, 1, 0, 1], [1, 0, 0, 1]]), 1, 'Example test 1';
+is count_squares([[1, 1, 0, 1], [1, 1, 0, 0], [0, 1, 1, 1], [1, 0, 1, 1]]), 4, 'Example test 2';
+is count_squares([[0, 1, 0, 1], [1, 0, 1, 0], [0, 1, 0, 0], [1, 0, 0, 1]]), 0, 'Example test 3';
+
+done_testing;
diff --git a/challenge-084/juliodcs/perl/ch-2.pl b/challenge-084/juliodcs/perl/ch-2.pl
index 0ae90bd8ed..3eb35f9009 100644
--- a/challenge-084/juliodcs/perl/ch-2.pl
+++ b/challenge-084/juliodcs/perl/ch-2.pl
@@ -3,11 +3,11 @@ use warnings;
use feature 'say';
use experimental 'signatures';
-sub all_ones($matrix, $x, $y, $size) {
- return $matrix->[$x ][$y ]
- && $matrix->[$x+$size-1][$y ]
- && $matrix->[$x ][$y+$size-1]
- && $matrix->[$x+$size-1][$y+$size-1];
+sub all_ones($matrix, $y, $x, $size) {
+ return $matrix->[$y ][$x ]
+ && $matrix->[$y+$size-1][$x ]
+ && $matrix->[$y ][$x+$size-1]
+ && $matrix->[$y+$size-1][$x+$size-1];
}
sub count_squares($matrix) {
@@ -15,12 +15,12 @@ sub count_squares($matrix) {
my $h = @{ $matrix };
my $w = @{ $matrix->[0] };
- my $max = $h > $w ? $h : $w;
+ my $square_size = $h < $w ? $h : $w;
- for my $s (2 .. $max) {
- for my $y (0 .. $w - $s) {
- for my $x (0 .. $h - $s) {
- $count++ if all_ones($matrix, $x, $y, $s);
+ for my $s (2 .. $square_size) {
+ for my $y (0 .. $h - $s) {
+ for my $x (0 .. $w - $s) {
+ $count++ if all_ones($matrix, $y, $x, $s);
}
}
}
diff --git a/challenge-084/juliodcs/raku/ch-2-recursive.raku b/challenge-084/juliodcs/raku/ch-2-recursive.raku
new file mode 100644
index 0000000000..45aabcc457
--- /dev/null
+++ b/challenge-084/juliodcs/raku/ch-2-recursive.raku
@@ -0,0 +1,46 @@
+#! /usr/bin/raku
+
+sub count-squares(\matrix where matrix.elems > 1 && matrix.head.elems > 1) {
+ my \height = matrix.elems;
+ my \width = matrix.head.elems;
+ my \max-square-size = min height, width;
+
+ sub all-ones(\y, \x, \size) {
+ matrix[ y ; x ]
+ && matrix[ y + size.pred ; x ]
+ && matrix[ y ; x + size.pred ]
+ && matrix[ y + size.pred ; x + size.pred ]
+ }
+
+ multi count-squares(\size where * > max-square-size, \y, \x, \count) {
+ count
+ }
+
+ multi count-squares(\size, \y where * > height - size, \x, \count) {
+ count-squares size.succ, 0, 0, count
+ }
+
+ multi count-squares(\size, \y, \x where * > width - size, \count) {
+ count-squares size, y.succ, 0, count
+ }
+
+ multi count-squares(\size, \y, \x, \count) {
+ count-squares size, y, x.succ, count + all-ones y, x, size
+ }
+
+ count-squares 2, 0, 0, 0
+}
+
+#############################################################################
+
+use Test;
+
+is count-squares([[1, 1], [1, 1]]), 1, 'Simple matrix';
+is count-squares([[1, 1], [1, 0]]), 0, 'Simple matrix, incomplete';
+is count-squares([[1, 1], [1, 0], [1, 1], [1, 1]]), 1, 'Simple (w != h) matrix';
+is count-squares([[1, 1], [1, 1], [1, 1], [1, 1]]), 3, 'Simple (w != h) matrix, all complete';
+is count-squares([[0, 1, 0, 1], [0, 0, 1, 0], [1, 1, 0, 1], [1, 0, 0, 1]]), 1, 'Example test 1';
+is count-squares([[1, 1, 0, 1], [1, 1, 0, 0], [0, 1, 1, 1], [1, 0, 1, 1]]), 4, 'Example test 2';
+is count-squares([[0, 1, 0, 1], [1, 0, 1, 0], [0, 1, 0, 0], [1, 0, 0, 1]]), 0, 'Example test 3';
+
+done-testing;
diff --git a/challenge-084/juliodcs/raku/ch-2.raku b/challenge-084/juliodcs/raku/ch-2.raku
index 62752c57a9..10c1fde7c2 100644
--- a/challenge-084/juliodcs/raku/ch-2.raku
+++ b/challenge-084/juliodcs/raku/ch-2.raku
@@ -1,21 +1,21 @@
#! /usr/bin/raku
-sub count-squares(\matrix) {
- sub all-ones(\x, \y, \size) {
- matrix[ x ; y ]
- && matrix[ x + size.pred ; y ]
- && matrix[ x ; y + size.pred ]
- && matrix[ x + size.pred ; y + size.pred ]
+sub count-squares(\matrix where matrix.elems > 1 && matrix.head.elems > 1) {
+ sub all-ones(\y, \x, \size) {
+ matrix[ y ; x ]
+ && matrix[ y + size.pred ; x ]
+ && matrix[ y ; x + size.pred ]
+ && matrix[ y + size.pred ; x + size.pred ]
}
my \h = matrix.elems;
my \w = matrix.head.elems;
my $count = 0;
- for 2 .. max h, w -> \s {
- for 0 .. w - s -> \y {
- for 0 .. h - s -> \x {
- $count++ if all-ones x, y, s;
+ for 2 .. min h, w -> \s {
+ for 0 .. h - s -> \y {
+ for 0 .. w - s -> \x {
+ $count++ if all-ones y, x, s;
}
}
}