diff options
| -rw-r--r-- | challenge-172/bob-lied/perl/ch-1.pl | 20 | ||||
| -rw-r--r-- | challenge-172/bob-lied/perl/ch-2.pl | 46 |
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"); |
