aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2021-02-20 17:45:31 +0000
committerGitHub <noreply@github.com>2021-02-20 17:45:31 +0000
commitde9117ea0cb0bdc44f7054a3fece8c649623d065 (patch)
tree6abfdf3d763b711c228675d8867822be85a170c0
parent0f80105d3c3b35b3d82a78fcaa45ff666d068aa2 (diff)
parentbbf7d31124440cf3176b12c8e6f9e55e7a2fa6ac (diff)
downloadperlweeklychallenge-club-de9117ea0cb0bdc44f7054a3fece8c649623d065.tar.gz
perlweeklychallenge-club-de9117ea0cb0bdc44f7054a3fece8c649623d065.tar.bz2
perlweeklychallenge-club-de9117ea0cb0bdc44f7054a3fece8c649623d065.zip
Merge pull request #3582 from arnesom/branch-for-challenge-100
Arne Sommer
-rw-r--r--challenge-100/arne-sommer/blog.txt1
-rwxr-xr-xchallenge-100/arne-sommer/perl/ch-1.pl15
-rwxr-xr-xchallenge-100/arne-sommer/perl/ch-2.pl40
-rwxr-xr-xchallenge-100/arne-sommer/perl/fun-time-perl15
-rwxr-xr-xchallenge-100/arne-sommer/perl/triangle-sum-perl40
-rwxr-xr-xchallenge-100/arne-sommer/raku/ch-1.raku12
-rwxr-xr-xchallenge-100/arne-sommer/raku/ch-2.raku26
-rwxr-xr-xchallenge-100/arne-sommer/raku/fun-time12
-rwxr-xr-xchallenge-100/arne-sommer/raku/triangle-sum26
-rwxr-xr-xchallenge-100/arne-sommer/raku/triangle-sum-verbose61
10 files changed, 248 insertions, 0 deletions
diff --git a/challenge-100/arne-sommer/blog.txt b/challenge-100/arne-sommer/blog.txt
new file mode 100644
index 0000000000..a8430e6450
--- /dev/null
+++ b/challenge-100/arne-sommer/blog.txt
@@ -0,0 +1 @@
+https://raku-musings.com/fun-sum-time.html
diff --git a/challenge-100/arne-sommer/perl/ch-1.pl b/challenge-100/arne-sommer/perl/ch-1.pl
new file mode 100755
index 0000000000..0b73acc9e1
--- /dev/null
+++ b/challenge-100/arne-sommer/perl/ch-1.pl
@@ -0,0 +1,15 @@
+#! /usr/bin/env perl
+
+use strict;
+use warnings;
+
+$ARGV[0] =~ /^(\d\d)\:(\d\d)\s?(am|pm)?$/ && length($3)
+ ? ($3 eq "pm"
+ ? print $1 eq '12' ? '12' : $1 + 12, ":$2\n"
+ : print $1 eq '12' ? '00' : $1, ":$2\n"
+ )
+ : ($1 >= 12 && $1 < 24
+ ? print $1 eq '12' ? '12' : sprintf('%02d', $1 - 12), ":$2 pm\n"
+ : print $1 eq '00'|| $1 eq '24' ? '12' : $1, ":$2 am\n"
+ );
+
diff --git a/challenge-100/arne-sommer/perl/ch-2.pl b/challenge-100/arne-sommer/perl/ch-2.pl
new file mode 100755
index 0000000000..f8c1132434
--- /dev/null
+++ b/challenge-100/arne-sommer/perl/ch-2.pl
@@ -0,0 +1,40 @@
+#! /usr/bin/env perl
+
+use strict;
+use warnings;
+use feature 'say';
+use feature 'signatures';
+use String::Util 'trim';
+use List::Util 'min';
+
+no warnings "experimental::signatures";
+
+my $tree = shift(@ARGV) // "1 | 2 4 | 6 4 9 | 5 1 7 2";
+my @tree;
+
+for my $row (split('\|', $tree))
+{
+ my @row = split(/\s+/, trim($row));
+ push(@tree, \@row);
+}
+
+my @solutions;
+
+traverse(0, 0, 0);
+
+sub traverse($row, $col, $sum)
+{
+ $sum += $tree[$row][$col];
+
+ if ($tree[$row+1])
+ {
+ traverse($row+1, $col, $sum);
+ traverse($row+1, $col+1, $sum);
+ }
+ else
+ {
+ push(@solutions, $sum);
+ }
+}
+
+say min(@solutions);
diff --git a/challenge-100/arne-sommer/perl/fun-time-perl b/challenge-100/arne-sommer/perl/fun-time-perl
new file mode 100755
index 0000000000..0b73acc9e1
--- /dev/null
+++ b/challenge-100/arne-sommer/perl/fun-time-perl
@@ -0,0 +1,15 @@
+#! /usr/bin/env perl
+
+use strict;
+use warnings;
+
+$ARGV[0] =~ /^(\d\d)\:(\d\d)\s?(am|pm)?$/ && length($3)
+ ? ($3 eq "pm"
+ ? print $1 eq '12' ? '12' : $1 + 12, ":$2\n"
+ : print $1 eq '12' ? '00' : $1, ":$2\n"
+ )
+ : ($1 >= 12 && $1 < 24
+ ? print $1 eq '12' ? '12' : sprintf('%02d', $1 - 12), ":$2 pm\n"
+ : print $1 eq '00'|| $1 eq '24' ? '12' : $1, ":$2 am\n"
+ );
+
diff --git a/challenge-100/arne-sommer/perl/triangle-sum-perl b/challenge-100/arne-sommer/perl/triangle-sum-perl
new file mode 100755
index 0000000000..f8c1132434
--- /dev/null
+++ b/challenge-100/arne-sommer/perl/triangle-sum-perl
@@ -0,0 +1,40 @@
+#! /usr/bin/env perl
+
+use strict;
+use warnings;
+use feature 'say';
+use feature 'signatures';
+use String::Util 'trim';
+use List::Util 'min';
+
+no warnings "experimental::signatures";
+
+my $tree = shift(@ARGV) // "1 | 2 4 | 6 4 9 | 5 1 7 2";
+my @tree;
+
+for my $row (split('\|', $tree))
+{
+ my @row = split(/\s+/, trim($row));
+ push(@tree, \@row);
+}
+
+my @solutions;
+
+traverse(0, 0, 0);
+
+sub traverse($row, $col, $sum)
+{
+ $sum += $tree[$row][$col];
+
+ if ($tree[$row+1])
+ {
+ traverse($row+1, $col, $sum);
+ traverse($row+1, $col+1, $sum);
+ }
+ else
+ {
+ push(@solutions, $sum);
+ }
+}
+
+say min(@solutions);
diff --git a/challenge-100/arne-sommer/raku/ch-1.raku b/challenge-100/arne-sommer/raku/ch-1.raku
new file mode 100755
index 0000000000..f1c23f9956
--- /dev/null
+++ b/challenge-100/arne-sommer/raku/ch-1.raku
@@ -0,0 +1,12 @@
+#! /usr/bin/env raku
+
+@*ARGS[0] ~~ /^(\d\d)\:(\d\d) \s? ([<[ap]>m]?)$/ && $2.chars
+ ?? ($2 eq "pm"
+ ?? say "{ $0 eq '12' ?? '12' !! $0 + 12 }:{ $1 }"
+ !! say "{ $0 eq '12' ?? '00' !! $0 }:{ $1 }"
+ )
+ !! (12 <= $0 < 24
+ ?? say "{ $0 eq '12' ?? '12' !! ($0 - 12).fmt('%02d') }:{ $1 } pm"
+ !! say "{ $0 eq '00'|'24' ?? '12' !! $0 }:{ $1 } am"
+ );
+
diff --git a/challenge-100/arne-sommer/raku/ch-2.raku b/challenge-100/arne-sommer/raku/ch-2.raku
new file mode 100755
index 0000000000..1ab8f025c0
--- /dev/null
+++ b/challenge-100/arne-sommer/raku/ch-2.raku
@@ -0,0 +1,26 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Str $tree = "1 | 2 4 | 6 4 9 | 5 1 7 2");
+
+my @tree = $tree.split("|")>>.words;
+
+my @solutions;
+
+traverse(0, 0, 0);
+
+sub traverse($row, $col, $sum is copy)
+{
+ $sum += @tree[$row][$col];
+
+ if @tree[$row+1]
+ {
+ traverse($row+1, $col, $sum);
+ traverse($row+1, $col+1, $sum);
+ }
+ else
+ {
+ @solutions.push: $sum;
+ }
+}
+
+say @solutions.min;
diff --git a/challenge-100/arne-sommer/raku/fun-time b/challenge-100/arne-sommer/raku/fun-time
new file mode 100755
index 0000000000..f1c23f9956
--- /dev/null
+++ b/challenge-100/arne-sommer/raku/fun-time
@@ -0,0 +1,12 @@
+#! /usr/bin/env raku
+
+@*ARGS[0] ~~ /^(\d\d)\:(\d\d) \s? ([<[ap]>m]?)$/ && $2.chars
+ ?? ($2 eq "pm"
+ ?? say "{ $0 eq '12' ?? '12' !! $0 + 12 }:{ $1 }"
+ !! say "{ $0 eq '12' ?? '00' !! $0 }:{ $1 }"
+ )
+ !! (12 <= $0 < 24
+ ?? say "{ $0 eq '12' ?? '12' !! ($0 - 12).fmt('%02d') }:{ $1 } pm"
+ !! say "{ $0 eq '00'|'24' ?? '12' !! $0 }:{ $1 } am"
+ );
+
diff --git a/challenge-100/arne-sommer/raku/triangle-sum b/challenge-100/arne-sommer/raku/triangle-sum
new file mode 100755
index 0000000000..1ab8f025c0
--- /dev/null
+++ b/challenge-100/arne-sommer/raku/triangle-sum
@@ -0,0 +1,26 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Str $tree = "1 | 2 4 | 6 4 9 | 5 1 7 2");
+
+my @tree = $tree.split("|")>>.words;
+
+my @solutions;
+
+traverse(0, 0, 0);
+
+sub traverse($row, $col, $sum is copy)
+{
+ $sum += @tree[$row][$col];
+
+ if @tree[$row+1]
+ {
+ traverse($row+1, $col, $sum);
+ traverse($row+1, $col+1, $sum);
+ }
+ else
+ {
+ @solutions.push: $sum;
+ }
+}
+
+say @solutions.min;
diff --git a/challenge-100/arne-sommer/raku/triangle-sum-verbose b/challenge-100/arne-sommer/raku/triangle-sum-verbose
new file mode 100755
index 0000000000..c1f044d3c2
--- /dev/null
+++ b/challenge-100/arne-sommer/raku/triangle-sum-verbose
@@ -0,0 +1,61 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Str $tree = "1 | 2 4 | 6 4 9 | 5 1 7 2", :v(:$verbose), :c(:$colour), :h(:$html-colour));
+
+class TrianglePath
+{
+ has Int $.sum;
+ has @.path;
+}
+
+constant ansi-blue = "\e[44m";
+constant ansi-green = "\e[42m";
+constant ansi-red = "\e[101m";
+constant ansi-stop = "\e[0m";
+
+constant html-blue = '<span class="text-light bg-primary">';
+constant html-green = '<span class="text-light bg-success">';
+constant html-red = '<span class="text-light bg-danger">';
+constant html-stop = '</span>';
+
+my @tree = $tree.split("|")>>.words;
+my $width = $tree.split("|")>>.words>>.chars>>.max.max;
+my $height = @tree.elems;
+
+my @solutions;
+
+traverse(0, 0, 0, ());
+
+sub traverse($row, $col, $sum is copy, @path is copy)
+{
+ @path.push: $col;
+ $sum += @tree[$row][$col];
+
+ if @tree[$row+1]
+ {
+ traverse($row+1, $col, $sum, @path);
+ traverse($row+1, $col+1, $sum, @path);
+ }
+ else
+ {
+ say ": Sum: $sum. Path (as indices on the rows): { @path.raku }" if $verbose;
+ @solutions.push: TrianglePath.new(sum => $sum, path => @path);
+ }
+}
+
+my $first = @solutions.sort({$^a.sum <=> $^b.sum }).first;
+
+if $colour | $html-colour
+{
+ my $start = $html-colour ?? html-green !! ansi-green;
+ my $stop = $html-colour ?? html-stop !! ansi-stop;
+
+ for ^@tree.elems -> $row
+ {
+ say ": "
+ ~ (" " x $width * ($height - $row -1))
+ ~ (^@tree[$row].elems).map({ $_ eq $first.path[$row] ?? $start ~ @tree[$row][$_].fmt("%{$width}d") ~ $stop !! (@tree[$row][$_].fmt("%{$width}d")) }).join(" " x $width);
+ }
+}
+
+say $first.sum;