diff options
| author | Javier Luque <javier.luque@humanstate.com> | 2020-08-28 16:59:14 +0100 |
|---|---|---|
| committer | Javier Luque <javier.luque@humanstate.com> | 2020-08-28 16:59:14 +0100 |
| commit | 7778d3255dc3baee4b7f5a924a177201458f6c55 (patch) | |
| tree | 80a334101810f42863bcdb9eef472a73f21e970e | |
| parent | 8d4abcb691fa0008a123f302f03f684f8ffd2ed2 (diff) | |
| download | perlweeklychallenge-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.txt | 1 | ||||
| -rw-r--r-- | challenge-075/javier-luque/perl/ch-1.pl | 24 | ||||
| -rw-r--r-- | challenge-075/javier-luque/perl/ch-2.pl | 63 | ||||
| -rw-r--r-- | challenge-075/javier-luque/raku/ch-1.p6 | 28 | ||||
| -rw-r--r-- | challenge-075/javier-luque/raku/ch-2.p6 | 61 |
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; +} |
