diff options
| -rwxr-xr-x | challenge-218/perlboy1967/perl/ch1.pl | 48 | ||||
| -rwxr-xr-x | challenge-218/perlboy1967/perl/ch2.pl | 57 |
2 files changed, 105 insertions, 0 deletions
diff --git a/challenge-218/perlboy1967/perl/ch1.pl b/challenge-218/perlboy1967/perl/ch1.pl new file mode 100755 index 0000000000..79ef7e0701 --- /dev/null +++ b/challenge-218/perlboy1967/perl/ch1.pl @@ -0,0 +1,48 @@ +#!/bin/perl + +=pod + +The Weekly Challenge - 217 +- https://theweeklychallenge.org/blog/perl-weekly-challenge-217 + +Author: Niels 'PerlBoy' van Dijke + +Task 1: Maximum Product +Submitted by: Mohammad S Anwar + +You are given a list of 3 or more integers. + +Write a script to find the 3 integers whose product is the maximum and return it. + +=cut + +use v5.16; + +use common::sense; + +use List::Util qw(product); + +use Test::More; + +sub maxProduct (@) { + my (@n,@p); + + for (@_) { + $_ < 0 ? push(@n,$_) : + $_ > 0 ? push(@p,$_) : + 0; + } + + @n = sort {$a <=> $b} @n; + pop @n if (@n % 2); + + product(@p,@n); +} + +is(maxProduct(3,2,1),6); +is(maxProduct(4,1,3,2),24); +is(maxProduct(-1,0,1,3,1),3); +is(maxProduct(-8,2,-9,0,-4,3),432); +is(maxProduct(-3,-2,-1,0,1,2,3),36); + +done_testing; diff --git a/challenge-218/perlboy1967/perl/ch2.pl b/challenge-218/perlboy1967/perl/ch2.pl new file mode 100755 index 0000000000..9eaefc1b60 --- /dev/null +++ b/challenge-218/perlboy1967/perl/ch2.pl @@ -0,0 +1,57 @@ +#!/bin/perl + +=pod + +The Weekly Challenge - 217 +- https://theweeklychallenge.org/blog/perl-weekly-challenge-217 + +Author: Niels 'PerlBoy' van Dijke + +Task 2: Matrix Score +Submitted by: Mohammad S Anwar + +You are given a m x n binary matrix i.e. having only 1 and 0. + +You are allowed to make as many moves as you want to get the highest score. + +|| A move can be either toggling each value in a row or column. + +To get the score, convert the each row binary to dec and return the sum. + +=cut + +use v5.16; + +use common::sense; + +use List::Util qw(sum); + +use Test::More; + +sub matrixScore (\@) { + my ($ar) = @_; + my $nR = @$ar - 1; + my $nC = @{$ar->[0]} - 1; + + # First make sure each row has its MSB set + for (@$ar) { + map { $_ = ++$_ % 2 } @$_ if ($$_[0] == 0); + } + + for my $c (1 .. $nC) { + my $ones = grep { $ar->[$_][$c] == 1 } (0 .. $nR); + # Flip bits in column C if number of '1's ir smaller than rows + map { $ar->[$_][$c] = ++$$ar[$_][$c] % 2 } (0 .. $nR) + if ($ones < $nR); + } + + return sum(map{oct('0b'.join('',@$_))} @$ar); +} + + +is(matrixScore(@{[[0,0,1,1], + [1,0,1,0], + [1,1,0,0], + ]}),39); + +done_testing; |
