From 3eac84cedbe50a028765be18bf09465ad1edc539 Mon Sep 17 00:00:00 2001 From: Niels van Dijke Date: Mon, 22 May 2023 21:17:18 +0000 Subject: w218 - Task 1 & 2 --- challenge-218/perlboy1967/perl/ch1.pl | 48 +++++++++++++++++++++++++++++ challenge-218/perlboy1967/perl/ch2.pl | 57 +++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100755 challenge-218/perlboy1967/perl/ch1.pl create mode 100755 challenge-218/perlboy1967/perl/ch2.pl 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; -- cgit From b9798d4f8d8d14c5230c442253ad52e6994da391 Mon Sep 17 00:00:00 2001 From: Niels van Dijke Date: Mon, 22 May 2023 21:42:43 +0000 Subject: Some comments --- challenge-218/perlboy1967/perl/ch1.pl | 3 +++ challenge-218/perlboy1967/perl/ch2.pl | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/challenge-218/perlboy1967/perl/ch1.pl b/challenge-218/perlboy1967/perl/ch1.pl index 79ef7e0701..48bbc2aa76 100755 --- a/challenge-218/perlboy1967/perl/ch1.pl +++ b/challenge-218/perlboy1967/perl/ch1.pl @@ -27,12 +27,15 @@ use Test::More; sub maxProduct (@) { my (@n,@p); + # Find negative and positive factors for (@_) { $_ < 0 ? push(@n,$_) : $_ > 0 ? push(@p,$_) : 0; } + # If we have an odd number of negative factors, + # ditch the one closest to zero @n = sort {$a <=> $b} @n; pop @n if (@n % 2); diff --git a/challenge-218/perlboy1967/perl/ch2.pl b/challenge-218/perlboy1967/perl/ch2.pl index 9eaefc1b60..757630f319 100755 --- a/challenge-218/perlboy1967/perl/ch2.pl +++ b/challenge-218/perlboy1967/perl/ch2.pl @@ -40,7 +40,8 @@ sub matrixScore (\@) { 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 + + # Flip bits in column C if number of '1's is smaller than # of rows map { $ar->[$_][$c] = ++$$ar[$_][$c] % 2 } (0 .. $nR) if ($ones < $nR); } -- cgit