aboutsummaryrefslogtreecommitdiff
path: root/challenge-218
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2023-05-29 04:20:37 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2023-05-29 04:20:37 +0100
commit7d1f28387726eeb7e5634d94e7a8b6ae4a3eea74 (patch)
treea75b1c43be2ff9889204e5c9824ad1ae73a3f82b /challenge-218
parent3f7d7e29c9d50eb0f0c90b20972de05fb1887fd1 (diff)
downloadperlweeklychallenge-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.txt1
-rw-r--r--challenge-218/polettix/blog1.txt1
-rw-r--r--challenge-218/polettix/perl/ch-1.pl13
-rw-r--r--challenge-218/polettix/perl/ch-2.pl40
-rw-r--r--challenge-218/polettix/raku/ch-1.raku10
-rw-r--r--challenge-218/polettix/raku/ch-2.raku27
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 }