aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2021-02-21 21:46:45 +0000
committerGitHub <noreply@github.com>2021-02-21 21:46:45 +0000
commit56dbad75bc66bb4adbd24f2b3c7bd141fffed25a (patch)
treee53a8c077a337264f41003b9559c9de8274a6864
parent6fad749d5248417b46bdf5b05124855893a1d246 (diff)
parent909a2be53b8c0d138795655b9d28ce38d0b5aa8b (diff)
downloadperlweeklychallenge-club-56dbad75bc66bb4adbd24f2b3c7bd141fffed25a.tar.gz
perlweeklychallenge-club-56dbad75bc66bb4adbd24f2b3c7bd141fffed25a.tar.bz2
perlweeklychallenge-club-56dbad75bc66bb4adbd24f2b3c7bd141fffed25a.zip
Merge pull request #3596 from PerlBoy1967/branch-for-challenge-100
Task 1 & 2
-rwxr-xr-xchallenge-100/perlboy1967/perl/ch-1.pl24
-rwxr-xr-xchallenge-100/perlboy1967/perl/ch-2.pl92
2 files changed, 116 insertions, 0 deletions
diff --git a/challenge-100/perlboy1967/perl/ch-1.pl b/challenge-100/perlboy1967/perl/ch-1.pl
new file mode 100755
index 0000000000..7b9b85611f
--- /dev/null
+++ b/challenge-100/perlboy1967/perl/ch-1.pl
@@ -0,0 +1,24 @@
+#!/usr/bin/perl
+
+# Perl Weekly Challenge - 100
+# - https://perlweeklychallenge.org/blog/perl-weekly-challenge-100/
+#
+# Task 1 - Fun Time
+#
+# Author: Niels 'PerlBoy' van Dijke
+
+use v5.16;
+use strict;
+use warnings;
+
+@ARGV = ('05:15 pm', '19:15', '12:01', '0:05', '2:03AM')
+ unless scalar(@ARGV);
+
+foreach my $time (@ARGV) {
+ printf "Input: '%s'\n", $time;
+
+ # 'One liner' ;-)
+ $time =~ s#\A(\d+)(:\d+)\s*(AM|PM)?\Z#sprintf('%02d%s%s',$1%12+(!$3?($1%12?0:12):uc($3)eq'PM'?12:0),$2,$3?'':$1<12?' AM':' PM')#ie;
+
+ printf "Output: '%s'\n\n", $time;
+}
diff --git a/challenge-100/perlboy1967/perl/ch-2.pl b/challenge-100/perlboy1967/perl/ch-2.pl
new file mode 100755
index 0000000000..a747a58bb0
--- /dev/null
+++ b/challenge-100/perlboy1967/perl/ch-2.pl
@@ -0,0 +1,92 @@
+#!/usr/bin/perl
+
+# Perl Weekly Challenge - 100
+# - https://perlweeklychallenge.org/blog/perl-weekly-challenge-100/
+#
+# Task 1 - Triangle Sum
+#
+# Author: Niels 'PerlBoy' van Dijke
+
+use v5.16;
+use strict;
+use warnings;
+
+use List::Util qw(sum min);
+
+# Prototypes
+sub getTriangleSumPaths(\@$$\@\%);
+sub printTriangleFlat(\@);
+sub printTriangle2D(\@;\@);
+sub printTrianglePath(\@\@);
+
+
+my @T = ([1], [4,2], [2,4,9], [5,5,7,5], [9,2,2,4,8]);
+my @P;
+my %PP;
+
+getTriangleSumPaths(@T, 0, 0, @P, %PP);
+my $min = min(keys %PP);
+my @solutions = @{$PP{$min}};
+
+printf "Input: Triangle = \n";
+printf "\n";
+printf "%s\n", printTriangle2D(@T);
+printf "\n";
+printf "Output: %d\n", $min;
+printf "\n";
+printf "Number of solutions: %d\n", scalar(@solutions);
+printf "\n";
+
+my $nSol = 1;
+foreach my $arP (@solutions) {
+ printf "Solution %d:\n", $nSol++;
+ printf "================\n";
+ printf "The minimum path sum from top to bottom: %s = %d\n", printTrianglePath(@T,@$arP), $min;
+ printf "\n";
+ printf "Explanation:\n";
+ printf "\n";
+ printf "%s\n", printTriangle2D(@T,@$arP);
+ printf "\n";
+}
+
+
+sub getTriangleSumPaths(\@$$\@\%) {
+ my ($arT, $l, $i, $arP, $hrSP) = @_;
+
+ push(@$arP, $i);
+ foreach my $arL ($arT->[$l]) {
+ if (defined $arT->[$l+1]) {
+ getTriangleSumPaths(@$arT, $l + 1, $i, @$arP, %$hrSP);
+ getTriangleSumPaths(@$arT, $l + 1, $i + 1, @$arP, %$hrSP);
+ } else {
+ my @i = (0 .. scalar(@$arP) - 1);
+ my $sum = sum(map { $arT->[$_][$arP->[$_]] } @i);
+ push(@{$hrSP->{$sum}}, [@$arP]);
+ }
+ }
+ pop(@$arP);
+}
+
+sub printTriangle2D(\@;\@) {
+ my ($arT, $arI) = @_;
+
+ my @out;
+ my $maxLen = 0;
+ for (my $l = 0; $l < scalar(@$arT); $l++) {
+ my $i = 0;
+
+ push(@out, join(' ',
+ map { (defined $arI and $arI->[$l] == $i++) ? "[$_]" : $_
+ } @{$arT->[$l]}));
+ $maxLen = length($out[-1])
+ if (length($out[-1]) > $maxLen);
+ }
+
+ return join("\n", map { "\t" . ' ' x (($maxLen - length($_))/2) . $_} @out);
+}
+
+
+sub printTrianglePath(\@\@) {
+ my $lIdx = 0;
+ join(' + ', map { $_->[$_[1]->[$lIdx++]] } @{$_[0]});
+}