aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJavier Luque <javier.luque@humanstate.com>2020-08-28 16:59:14 +0100
committerJavier Luque <javier.luque@humanstate.com>2020-08-28 16:59:14 +0100
commit7778d3255dc3baee4b7f5a924a177201458f6c55 (patch)
tree80a334101810f42863bcdb9eef472a73f21e970e
parent8d4abcb691fa0008a123f302f03f684f8ffd2ed2 (diff)
downloadperlweeklychallenge-club-7778d3255dc3baee4b7f5a924a177201458f6c55.tar.gz
perlweeklychallenge-club-7778d3255dc3baee4b7f5a924a177201458f6c55.tar.bz2
perlweeklychallenge-club-7778d3255dc3baee4b7f5a924a177201458f6c55.zip
Solutions to challenge 75
-rw-r--r--challenge-075/javier-luque/blog.txt1
-rw-r--r--challenge-075/javier-luque/perl/ch-1.pl24
-rw-r--r--challenge-075/javier-luque/perl/ch-2.pl63
-rw-r--r--challenge-075/javier-luque/raku/ch-1.p628
-rw-r--r--challenge-075/javier-luque/raku/ch-2.p661
5 files changed, 177 insertions, 0 deletions
diff --git a/challenge-075/javier-luque/blog.txt b/challenge-075/javier-luque/blog.txt
new file mode 100644
index 0000000000..281d59e949
--- /dev/null
+++ b/challenge-075/javier-luque/blog.txt
@@ -0,0 +1 @@
+https://perlchallenges.wordpress.com/2020/08/28/perl-weekly-challenge-075/
diff --git a/challenge-075/javier-luque/perl/ch-1.pl b/challenge-075/javier-luque/perl/ch-1.pl
new file mode 100644
index 0000000000..c2a0113909
--- /dev/null
+++ b/challenge-075/javier-luque/perl/ch-1.pl
@@ -0,0 +1,24 @@
+#!/usr/bin/perl
+# Test: ./ch-1.pl
+use Modern::Perl;
+use List::Util qw /sum0/;
+use Algorithm::Combinatorics qw(combinations_with_repetition);
+
+my @C = (1, 2, 4);
+my $S = 6;
+
+my $total = 0;
+my $solutions;
+
+for my $size (reverse(1 .. $S)) {
+ my $iter = combinations_with_repetition(\@C,$size);
+ while (my $v = $iter->next) {
+ if (sum0(@$v) == $S) {
+ $total++;
+ $solutions .= '(' . (join ',', @$v) . ')' . "\n"
+ }
+ }
+}
+
+say "Output: " . $total . ' solutions';
+print $solutions;
diff --git a/challenge-075/javier-luque/perl/ch-2.pl b/challenge-075/javier-luque/perl/ch-2.pl
new file mode 100644
index 0000000000..3209223406
--- /dev/null
+++ b/challenge-075/javier-luque/perl/ch-2.pl
@@ -0,0 +1,63 @@
+#!/usr/bin/perl
+# Test: ./ch-2.pl
+use Modern::Perl;
+use List::Util qw /max/;
+
+histogram(2, 1, 4, 5, 3, 7);
+say "Output: " . largest_rect(2, 1, 4, 5, 3, 7);
+
+say "\n";
+
+histogram(3, 2, 3, 5, 7, 5);
+say "Output: " . largest_rect(3, 2, 3, 5, 7, 5);
+
+sub histogram {
+ my @A = @_;
+ my $max = max @A;
+
+ for my $row (reverse (1 ..$max)) {
+ printf ("%s ", $row);
+ for my $col (@A) {
+ if ($col >= $row) {
+ print "# ";
+ } else {
+ print " ";
+ }
+ }
+ print "\n";
+ }
+
+ print "- " x (scalar(@A) + 1) . "\n";
+ print " " . (join ' ', @A) . "\n";
+}
+
+sub largest_rect {
+ my @A = @_;
+
+ my @stack;
+ my $max_area = 0;
+ my $stack_top;
+ my $i = 0;
+
+ while ($i < scalar(@A)) {
+ if (!scalar(@stack) || $A[$stack[-1]] <= $A[$i]) {
+ push @stack, $i++;
+ } else {
+ $stack_top = pop @stack;
+ my $w = (scalar(@stack)) ?
+ ($i - $stack[-1] - 1) : $i;
+ my $area = $A[$stack_top] * $w;
+ $max_area = max($max_area, $area);
+ }
+ }
+
+ while (@stack) {
+ $stack_top = pop @stack;
+ my $w = (scalar(@stack)) ?
+ ($i - $stack[-1] - 1) : $i;
+ my $area = $A[$stack_top] * $w;
+ $max_area = max($max_area, $area);
+ }
+
+ return $max_area;
+}
diff --git a/challenge-075/javier-luque/raku/ch-1.p6 b/challenge-075/javier-luque/raku/ch-1.p6
new file mode 100644
index 0000000000..56e5975d7e
--- /dev/null
+++ b/challenge-075/javier-luque/raku/ch-1.p6
@@ -0,0 +1,28 @@
+# Test: perl6 ch-1.p6
+our %found;
+
+sub MAIN() {
+ my @C = (1, 2, 4);
+ my $S = 6;
+ my @bag = ();
+ coin-combinations(@C, $S, @bag);
+ say "Output: " ~ %found.keys.elems ~ ' solutions';
+}
+
+sub coin-combinations(@C, $S, @bag is copy) {
+
+ for (@C) -> $coin {
+ @bag.push($coin);
+ if (@bag.sum < $S) {
+ coin-combinations(@C, $S, @bag);
+ }
+
+ if (@bag.sum == $S) {
+ my $key = '(' ~ @bag.sort.join(',') ~ ')';
+ say $key unless (%found{$key});
+ %found{$key} = True;
+ }
+
+ @bag.pop;
+ }
+}
diff --git a/challenge-075/javier-luque/raku/ch-2.p6 b/challenge-075/javier-luque/raku/ch-2.p6
new file mode 100644
index 0000000000..5a7640fd28
--- /dev/null
+++ b/challenge-075/javier-luque/raku/ch-2.p6
@@ -0,0 +1,61 @@
+# Test: perl6 ch-2.p6
+
+sub MAIN() {
+ my @A = (2, 1, 4, 5, 3, 7);
+ histogram(@A);
+ say "Output: " ~ largest-rect(@A);
+
+ say "\n";
+
+ my @B = (3, 2, 3, 5, 7, 5);
+ histogram(@B);
+ say "Output: " ~ largest-rect(@B);
+}
+
+sub histogram(@A) {
+ my $max = @A.max;
+
+ for (reverse (1 ..$max)) -> $row {
+ print "$row ";
+ for (@A) -> $col {
+ if ($col >= $row) {
+ print "# ";
+ } else {
+ print " ";
+ }
+ }
+ print "\n";
+ }
+
+ print "- " x (@A.elems + 1) ~ "\n";
+ print " " ~ (join ' ', @A) ~ "\n";
+}
+
+sub largest-rect(@A) {
+ my @stack;
+ my $max_area = 0;
+ my $stack_top;
+ my $i = 0;
+
+ while ($i < @A.elems) {
+ if (!@stack.elems || @A[@stack[*-1]] <= @A[$i]) {
+ @stack.push($i++);
+ } else {
+ $stack_top = @stack.pop;
+ my $w = (@stack.elems) ??
+ ($i - @stack[*-1] - 1) !! $i;
+ my $area = @A[$stack_top] * $w;
+ $max_area = max($max_area, $area);
+ }
+ }
+
+ while (@stack) {
+ $stack_top = @stack.pop;
+ my $w = (@stack.elems) ??
+ ($i - @stack[*-1] - 1) !! $i;
+ my $area = @A[$stack_top] * $w;
+ $max_area = max($max_area, $area);
+ }
+
+ return $max_area;
+}