diff options
| author | arnesom <arne@bbop.org> | 2021-02-20 17:42:22 +0100 |
|---|---|---|
| committer | arnesom <arne@bbop.org> | 2021-02-20 17:42:22 +0100 |
| commit | bbf7d31124440cf3176b12c8e6f9e55e7a2fa6ac (patch) | |
| tree | 65a45a3d940f84c34b071f709f0d23894c2935d0 | |
| parent | 0617dd595c13afcdf7e30ab9525b6b52ebea8284 (diff) | |
| download | perlweeklychallenge-club-bbf7d31124440cf3176b12c8e6f9e55e7a2fa6ac.tar.gz perlweeklychallenge-club-bbf7d31124440cf3176b12c8e6f9e55e7a2fa6ac.tar.bz2 perlweeklychallenge-club-bbf7d31124440cf3176b12c8e6f9e55e7a2fa6ac.zip | |
Arne Sommer
| -rw-r--r-- | challenge-100/arne-sommer/blog.txt | 1 | ||||
| -rwxr-xr-x | challenge-100/arne-sommer/perl/ch-1.pl | 15 | ||||
| -rwxr-xr-x | challenge-100/arne-sommer/perl/ch-2.pl | 40 | ||||
| -rwxr-xr-x | challenge-100/arne-sommer/perl/fun-time-perl | 15 | ||||
| -rwxr-xr-x | challenge-100/arne-sommer/perl/triangle-sum-perl | 40 | ||||
| -rwxr-xr-x | challenge-100/arne-sommer/raku/ch-1.raku | 12 | ||||
| -rwxr-xr-x | challenge-100/arne-sommer/raku/ch-2.raku | 26 | ||||
| -rwxr-xr-x | challenge-100/arne-sommer/raku/fun-time | 12 | ||||
| -rwxr-xr-x | challenge-100/arne-sommer/raku/triangle-sum | 26 | ||||
| -rwxr-xr-x | challenge-100/arne-sommer/raku/triangle-sum-verbose | 61 |
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; |
