aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Lied <boblied+github@gmail.com>2023-11-26 08:40:22 -0600
committerBob Lied <boblied+github@gmail.com>2023-11-26 08:40:22 -0600
commitdffd2da5d8674935ab48cbe4054aca53cc09ef84 (patch)
tree6d9503a5247f974dbfc220ce99b75e9358e8f86d
parentf5cf1052b7b9df42c9de547165c93a7eec3b708d (diff)
downloadperlweeklychallenge-club-dffd2da5d8674935ab48cbe4054aca53cc09ef84.tar.gz
perlweeklychallenge-club-dffd2da5d8674935ab48cbe4054aca53cc09ef84.tar.bz2
perlweeklychallenge-club-dffd2da5d8674935ab48cbe4054aca53cc09ef84.zip
Week 172 solutions
-rw-r--r--challenge-172/bob-lied/perl/ch-1.pl20
-rw-r--r--challenge-172/bob-lied/perl/ch-2.pl46
2 files changed, 57 insertions, 9 deletions
diff --git a/challenge-172/bob-lied/perl/ch-1.pl b/challenge-172/bob-lied/perl/ch-1.pl
index 4085bc6dd2..da6a73c1c8 100644
--- a/challenge-172/bob-lied/perl/ch-1.pl
+++ b/challenge-172/bob-lied/perl/ch-1.pl
@@ -18,8 +18,6 @@
#=============================================================================
use v5.38;
-use Math::Prime::Util qw/forpart/;
-use List::Util qw/uniqint/;
use Getopt::Long;
my $Verbose = 0;
@@ -28,14 +26,30 @@ my $DoTest = 0;
GetOptions("test" => \$DoTest, "verbose" => \$Verbose);
exit(!runTest()) if $DoTest;
+my $M = shift;
+my $N = shift;
+
+die "Usage: $0 m n" unless $M && $N;
+die "n must be <= m/2" unless $N <= $M/2;
+my $answer = primePartition($M, $N);
+if ( $Verbose )
+{
+ say join(" or ", map { join(", ", $_->@*) } $answer->@*);
+}
+else
+{
+ say "$_->@*" for $answer->@*;
+}
+
sub noDup(@list)
{
+ use List::Util qw/uniqint/;
return scalar(uniqint(@list)) == scalar(@list);
}
sub primePartition($m, $n)
{
- use Data::Dumper;
+ use Math::Prime::Util qw/forpart/;
my @part;
forpart { push @part, [ @_ ] if noDup(@_) } $m, { n => $n, prime => 1} ;
diff --git a/challenge-172/bob-lied/perl/ch-2.pl b/challenge-172/bob-lied/perl/ch-2.pl
index 49b526e9e8..d73be53695 100644
--- a/challenge-172/bob-lied/perl/ch-2.pl
+++ b/challenge-172/bob-lied/perl/ch-2.pl
@@ -20,8 +20,7 @@
#=============================================================================
use v5.38;
-use builtin qw/true false/; no warnings "experimental::builtin";
-
+use builtin qw/floor ceil/; no warnings "experimental::builtin";
use Getopt::Long;
my $Verbose = 0;
@@ -30,6 +29,24 @@ my $DoTest = 0;
GetOptions("test" => \$DoTest, "verbose" => \$Verbose);
exit(!runTest()) if $DoTest;
+show(fiveSummary(@ARGV));
+
+sub show($five)
+{
+ if ( $Verbose )
+ {
+ printf " minimum: %12.3f\n", $five->[0];
+ printf "1st quartile: %12.3f\n", $five->[1];
+ printf " median: %12.3f\n", $five->[2];
+ printf "3nd quartile: %12.3f\n", $five->[3];
+ printf " maximum: %12.3f\n", $five->[4];
+ }
+ else
+ {
+ say "(", join(", ", $five->@*), ")";
+ }
+}
+
sub median($ref)
{
my $len = scalar( @$ref );
@@ -42,7 +59,7 @@ sub median($ref)
{
# Even length, take average of middle 2
my $mid = $len / 2;
- return ( $ref->[$mid] + $ref->[$mid+1] ) / 2;
+ return ( $ref->[$mid] + $ref->[$mid-1] ) / 2;
}
}
@@ -50,19 +67,36 @@ sub fiveSummary(@list)
{
my @sorted = sort { $a <=> $b } @list;
my $len = scalar( @list );
+ my $mid = $len / 2;
+ my ($lowtop, $hibottom);
+ if ( $len % 2 )
+ {
+ # Odd
+ $lowtop = $hibottom = floor($mid);
+ }
+ else
+ {
+ # Even
+ $lowtop = ($hibottom = $mid) - 1;
+ }
+
my @summary = (
$sorted[0],
- 0,
- median(\@sorted),
- 1,
+ median( [ @sorted[0 .. $lowtop ] ]),
+ median( \@sorted ),
+ median( [ @sorted[ $hibottom .. $#list] ]),
$sorted[-1]
);
+ return \@summary;
}
sub runTest
{
use Test2::V0;
+ is( median([3,5,7]), 5, "Median odd length");
+ is( median([3,5,7,9]), 6, "Median even length");
+
is( fiveSummary(0, 0, 1, 2, 63, 61, 27, 13),
[0.0, 0.5, 7.5, 44.0, 63.0 ], "Example 1");