diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2023-05-29 04:20:37 +0100 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2023-05-29 04:20:37 +0100 |
| commit | 7d1f28387726eeb7e5634d94e7a8b6ae4a3eea74 (patch) | |
| tree | a75b1c43be2ff9889204e5c9824ad1ae73a3f82b /challenge-218 | |
| parent | 3f7d7e29c9d50eb0f0c90b20972de05fb1887fd1 (diff) | |
| download | perlweeklychallenge-club-7d1f28387726eeb7e5634d94e7a8b6ae4a3eea74.tar.gz perlweeklychallenge-club-7d1f28387726eeb7e5634d94e7a8b6ae4a3eea74.tar.bz2 perlweeklychallenge-club-7d1f28387726eeb7e5634d94e7a8b6ae4a3eea74.zip | |
- Added solutions by Flavio Poletti.
Diffstat (limited to 'challenge-218')
| -rw-r--r-- | challenge-218/polettix/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-218/polettix/blog1.txt | 1 | ||||
| -rw-r--r-- | challenge-218/polettix/perl/ch-1.pl | 13 | ||||
| -rw-r--r-- | challenge-218/polettix/perl/ch-2.pl | 40 | ||||
| -rw-r--r-- | challenge-218/polettix/raku/ch-1.raku | 10 | ||||
| -rw-r--r-- | challenge-218/polettix/raku/ch-2.raku | 27 |
6 files changed, 92 insertions, 0 deletions
diff --git a/challenge-218/polettix/blog.txt b/challenge-218/polettix/blog.txt new file mode 100644 index 0000000000..f4a682423a --- /dev/null +++ b/challenge-218/polettix/blog.txt @@ -0,0 +1 @@ +https://github.polettix.it/ETOOBUSY/2023/05/25/pwc218-maximum-product/ diff --git a/challenge-218/polettix/blog1.txt b/challenge-218/polettix/blog1.txt new file mode 100644 index 0000000000..fc61cfb26b --- /dev/null +++ b/challenge-218/polettix/blog1.txt @@ -0,0 +1 @@ +https://github.polettix.it/ETOOBUSY/2023/05/26/pwc218-matrix-score/ diff --git a/challenge-218/polettix/perl/ch-1.pl b/challenge-218/polettix/perl/ch-1.pl new file mode 100644 index 0000000000..6cf474333c --- /dev/null +++ b/challenge-218/polettix/perl/ch-1.pl @@ -0,0 +1,13 @@ +#!/usr/bin/env perl +use v5.24; +use warnings; +use experimental 'signatures'; + +say maximum_product(@ARGV); + +sub maximum_product (@list) { + @list = sort { $a <=> $b } @list; + my $below = $list[0] * $list[1] * $list[-1]; + my $above = $list[-3] * $list[-2] * $list[-1]; + return $below > $above ? $below : $above; +} diff --git a/challenge-218/polettix/perl/ch-2.pl b/challenge-218/polettix/perl/ch-2.pl new file mode 100644 index 0000000000..2f4ec00158 --- /dev/null +++ b/challenge-218/polettix/perl/ch-2.pl @@ -0,0 +1,40 @@ +#!/usr/bin/env perl +use v5.24; +use warnings; +use experimental 'signatures'; +use List::Util 'sum'; + +say matrix_score($_) for test_matrixes(); + +sub matrix_score ($matrix) { + my $n_rows = $matrix->@*; + my $threshold = int($n_rows / 2) + ($n_rows % 2); + for my $r (0 .. $n_rows - 1) { + toggle_row($matrix, $r) unless $matrix->[$r][0]; + } + for my $c (1 .. $matrix->[0]->$#*) { + toggle_col($matrix, $c) if count_col($matrix, $c) < $threshold; + } + return sum(map { binarr_to_dec($_) } $matrix->@*); +} + +sub binarr_to_dec ($row) { + my $v = 0; + $v = ($v << 1) | ($row->[$_] ? 1 : 0) for 0 .. $row->$#*; + return $v; +} + +sub toggle_row ($m, $r) { + $m->[$r][$_] = 1 - $m->[$r][$_] for 0 .. $m->[$r]->$#*; +} + +sub toggle_col ($matrix, $c) { $_->[$c] = 1 - $_->[$c] for $matrix->@* } + +sub count_col ($m, $c) { sum(map { $_->[$c] ? 1 : 0 } $m->@*) // 0 } + +sub test_matrixes { + return ( + [[0, 0, 1, 1], [1, 0, 1, 0], [1, 1, 0, 0]], + [[0]], + ); +} diff --git a/challenge-218/polettix/raku/ch-1.raku b/challenge-218/polettix/raku/ch-1.raku new file mode 100644 index 0000000000..607aabbd61 --- /dev/null +++ b/challenge-218/polettix/raku/ch-1.raku @@ -0,0 +1,10 @@ +#!/usr/bin/env raku +use v6; +sub MAIN (*@args) { say maximum-product(@args) } + +sub maximum-product (@args) { + my @sorted = @argsĀ».Int.sort; + my $below = @sorted[0] * @sorted[1] * @sorted[* - 1]; + my $above = [*] @sorted.reverse[0..2]; + return ($below, $above).max; +} diff --git a/challenge-218/polettix/raku/ch-2.raku b/challenge-218/polettix/raku/ch-2.raku new file mode 100644 index 0000000000..38195f22d2 --- /dev/null +++ b/challenge-218/polettix/raku/ch-2.raku @@ -0,0 +1,27 @@ +#!/usr/bin/env raku +use v6; +sub MAIN { + my @tests = + [[0, 0, 1, 1], [1, 0, 1, 0], [1, 1, 0, 0]], + [[0],], + ; + put(matrix-score($_)) for @tests; +} + +sub matrix-score ($matrix) { + my $n-rows = $matrix.elems; + my $threshold = ($n-rows div 2) + ($n-rows % 2); + for ^$n-rows -> $r { + toggle-row($matrix, $r) unless $matrix[$r][0]; + } + for 1 .. $matrix[0].end -> $c { + toggle-col($matrix, $c) if count-col($matrix, $c) < $threshold; + } + return $matrix.map({ $_.join('').parse-base(2) }).sum; +} + +sub toggle-row ($m, $r) { $m[$r][$_] = 1 - $m[$r][$_] for 0 .. $m[0].end } + +sub toggle-col ($matrix, $c) { $_[$c] = 1 - $_[$c] for @$matrix } + +sub count-col ($matrix, $c) { $matrix.map({ $_[$c] }).sum } |
