aboutsummaryrefslogtreecommitdiff
path: root/challenge-084
diff options
context:
space:
mode:
authorE7-87-83 <fungcheokyin@gmail.com>2020-11-02 15:51:43 +0800
committerE7-87-83 <fungcheokyin@gmail.com>2020-11-02 15:51:43 +0800
commit3cb26cb56ed1a6981e06ba31b35f8e566ca422d4 (patch)
tree0238b8d60c8e4b6ab4970c3d00be72617db784f1 /challenge-084
parent6358c68fd8d05e51ee0c4d7777dbf5fef7c7cb18 (diff)
downloadperlweeklychallenge-club-3cb26cb56ed1a6981e06ba31b35f8e566ca422d4.tar.gz
perlweeklychallenge-club-3cb26cb56ed1a6981e06ba31b35f8e566ca422d4.tar.bz2
perlweeklychallenge-club-3cb26cb56ed1a6981e06ba31b35f8e566ca422d4.zip
So sad, have forgetten to upload for #084; be an early bird for #085
Diffstat (limited to 'challenge-084')
-rw-r--r--challenge-084/cheok-yin-fung/perl/ch-1.pl72
-rw-r--r--challenge-084/cheok-yin-fung/perl/ch-2.pl80
2 files changed, 152 insertions, 0 deletions
diff --git a/challenge-084/cheok-yin-fung/perl/ch-1.pl b/challenge-084/cheok-yin-fung/perl/ch-1.pl
new file mode 100644
index 0000000000..0abed1ccf2
--- /dev/null
+++ b/challenge-084/cheok-yin-fung/perl/ch-1.pl
@@ -0,0 +1,72 @@
+#!/usr/bin/perl
+# The Weekly challenge - Perl & Raku Week 084
+# Task 1 Reverse Integer
+#
+# Description: The number 2,147,483,647 is the
+# maximum positive value for a 32-bit signed binary integer in computing.
+#
+# additional info from books:
+# minimum value for a 32-bigt signed binary integer: -2147483648
+
+use strict;
+use warnings;
+#use Test::More tests => 4;
+
+# 8463847412
+# 2147483648
+# 9876543210
+
+my @r_MAXPOS = split "", "2147483647";
+my @r_MAXNEG_WO_SIGN = split "", "2147483648";
+
+if ($ARGV[0] ne "") {
+ print(ri($ARGV[0]), "\n");
+}
+else {
+ print -1_000_000, "\n";
+ print(ri(-1_000_000) ,"\n") ; #should it be -000_000_1 or -1 ?
+}
+
+sub compare_digits {
+ my @indvar = @{$_[0]};
+ my @bigbro = @{$_[1]};
+ return 0 if scalar @indvar > 10;
+ return 1 if scalar @indvar < 10;
+ for (0..9) {
+ return 0 if $indvar[$_] > $bigbro[$_];
+ }
+ return 1;
+}
+
+
+sub ri {
+ my @arr = split "" , $_[0];
+ my $sgn = "+";
+ $sgn = shift @arr if $arr[0] eq '-' ;
+ my @r_arr = reverse @arr;
+ if ($sgn eq '+') {
+ if (compare_digits([@r_arr], [@r_MAXPOS])) {
+ return join "", @r_arr;
+ }
+ else {
+ return 0;
+ }
+ }
+ else {
+ if (compare_digits([@r_arr], [@r_MAXNEG_WO_SIGN])) {
+ return '-'.(join "", @r_arr);
+ }
+ else {
+ return 0;
+ }
+ }
+
+}
+
+=pod
+ok ri(1234) == 4321, "example 1";
+ok ri(-1234) == -4321, "example 2";
+ok ri(1231230512) == 0, "example 3";
+ok ri(7_463_847_412) == 2_147_483_647, "max 32-bit integer";
+=cut
+
diff --git a/challenge-084/cheok-yin-fung/perl/ch-2.pl b/challenge-084/cheok-yin-fung/perl/ch-2.pl
new file mode 100644
index 0000000000..c3b70696d6
--- /dev/null
+++ b/challenge-084/cheok-yin-fung/perl/ch-2.pl
@@ -0,0 +1,80 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+#use Test::More tests => 4;
+#use Data::Dumper;
+
+if ($ARGV[0]) {
+ my @f = @ARGV;
+ my $M = shift @f;
+ my $N = shift @f;
+ my @matrix = ();
+ die "Input Parameters Error" unless scalar @f == $M*$N;
+ for my $counter (0..$M-1) {
+ push @matrix , [ @f[$N*$counter..$N*$counter+$N-1] ];
+ }
+
+# print Dumper(@matrix);
+ print_matrix([@matrix]);
+ print 'ans: ', find_sq([@matrix]), "\n";
+}
+else {
+ for(1..3) {
+ print "[1,1,1,1]";
+ print "\n";
+ }
+ print 'ans: ', find_sq([[1,1,1,1],[1,1,1,1],[1,1,1,1]]), "\n";
+ #all 1s, should be 8
+}
+
+
+sub print_matrix {
+ my @mat = @{$_[0]};
+ my $M = scalar @mat;
+ my $N = scalar @{$mat[0]};
+ for my $i (0..$M-1) {
+ print "[", join(", ", @{$mat[$i]}), "]" ;
+ print "\n";
+ }
+}
+
+sub find_sq {
+ my @mat = @{$_[0]};
+ my $nsq = 0;
+ my $M = scalar @mat;
+ my $N = scalar @{$mat[0]};
+
+ for my $i (0..$M-2) {
+ for my $j (0..$N-2) {
+ my $max_len_sq = $M-$i < $N-$j ? $M-$i : $N-$j; #sign of the ineq
+ for my $k (2..$max_len_sq) {
+ $nsq++ if bool_contain_sq([@mat], $i, $j, $k);
+ }
+ }
+ }
+
+ return $nsq;
+
+}
+
+sub bool_contain_sq {
+ my @mat = @{$_[0]};
+ my $r = $_[1];
+ my $c = $_[2];
+ my $len_side = $_[3];
+
+ return (${$mat[$r]}[$c] && ${$mat[$r+$len_side-1]}[$c] &&
+ ${$mat[$r]}[$c+$len_side-1] && ${$mat[$r+$len_side-1]}[$c+$len_side-1] );
+}
+
+
+=pod
+ok(find_sq([[ 0,1,0,1 ], [ 0, 0, 1,0 ], [ 1, 1 ,0 ,1],[1, 0, 0, 1 ]] )== 1,
+ "Example 1");
+ok(find_sq([[ 1 ,1, 0, 1 ], [ 1, 1 ,0 ,0 ], [ 0, 1, 1 ,1 ], [ 1, 0, 1, 1 ]]
+ )== 4, "Example 2");
+ok(find_sq([[ 0 ,1 ,0 ,1 ], [ 1, 0 ,1 ,0 ], [ 0 ,1 ,0 ,0 ], [ 1, 0 ,0 ,1 ]]
+ ) == 0, "Example 3");
+ok(find_sq([[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]
+ ) == 14, "a 4x4 matrix with every entry being 1");
+=cut