aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Campbell Smith <pj.campbell.smith@gmail.com>2023-05-16 17:04:22 +0100
committerPeter Campbell Smith <pj.campbell.smith@gmail.com>2023-05-16 17:04:22 +0100
commitd972746b7d9779cd584c9fbf47e1053e818c37a2 (patch)
tree3e676e9c49867f6c97f8f36ccb40f6cb2dcc5078
parenta1d0331cecd65975208c9e6466b41434d5109784 (diff)
downloadperlweeklychallenge-club-d972746b7d9779cd584c9fbf47e1053e818c37a2.tar.gz
perlweeklychallenge-club-d972746b7d9779cd584c9fbf47e1053e818c37a2.tar.bz2
perlweeklychallenge-club-d972746b7d9779cd584c9fbf47e1053e818c37a2.zip
Revised task 2!
-rwxr-xr-xchallenge-217/peter-campbell-smith/perl/ch-2.pl40
1 files changed, 36 insertions, 4 deletions
diff --git a/challenge-217/peter-campbell-smith/perl/ch-2.pl b/challenge-217/peter-campbell-smith/perl/ch-2.pl
index c9adadc632..f8fc81c3a2 100755
--- a/challenge-217/peter-campbell-smith/perl/ch-2.pl
+++ b/challenge-217/peter-campbell-smith/perl/ch-2.pl
@@ -1,7 +1,7 @@
#!/usr/bin/perl
use v5.16; # The Weekly Challenge - 2023-05-15
-use utf8; # Week 216 task 1 - Max number
+use utf8; # Week 217 task 2 - Max number
use strict; # Peter Campbell Smith
use warnings; # Blog: http://ccgi.campbellsmiths.force9.co.uk/challenge
@@ -10,11 +10,43 @@ max_number(10, 3, 2);
max_number(31, 2, 4, 10);
max_number(5, 11, 4, 1, 2);
max_number(1, 10);
+max_number(9900, 1, 99, 88);
+max_number(47, 53, 99, 82, 9, 21, 36, 76, 77);
sub max_number {
- # concatenate the numbers in descending alphabetical sort order
- say qq[\nInput: ] . join(', ', @_);
- say qq[Output: ] . join('', reverse sort @_);
+ my (%left, $max);
+
+ # put the numbers in a hash (as keys)
+ $left{$_} = 1 for @_;
+
+ # show result
+ say qq[\nInput: (] . join(', ', @_) . ')';
+ say qq[Output: ] . add_a_number(0, '', \%left);
}
+sub add_a_number {
+
+ my ($max, $so_far, $so_far2, %left, %more, $this);
+
+ # initialise
+ $max = $_[0];
+ $so_far = $_[1];
+ %left = %{$_[2]};
+
+ # added all numbers
+ unless (%left) {
+ $max = $so_far if $so_far > $max;
+
+ # add the next number
+ } else {
+ for $this (keys %left) {
+ %more = %left;
+ delete $more{$this};
+ $max = add_a_number($max, $so_far . $this, \%more);
+ }
+ }
+
+ # return the best so far
+ return $max;
+}