diff options
| author | Peter Campbell Smith <pj.campbell.smith@gmail.com> | 2023-05-16 17:04:22 +0100 |
|---|---|---|
| committer | Peter Campbell Smith <pj.campbell.smith@gmail.com> | 2023-05-16 17:04:22 +0100 |
| commit | d972746b7d9779cd584c9fbf47e1053e818c37a2 (patch) | |
| tree | 3e676e9c49867f6c97f8f36ccb40f6cb2dcc5078 | |
| parent | a1d0331cecd65975208c9e6466b41434d5109784 (diff) | |
| download | perlweeklychallenge-club-d972746b7d9779cd584c9fbf47e1053e818c37a2.tar.gz perlweeklychallenge-club-d972746b7d9779cd584c9fbf47e1053e818c37a2.tar.bz2 perlweeklychallenge-club-d972746b7d9779cd584c9fbf47e1053e818c37a2.zip | |
Revised task 2!
| -rwxr-xr-x | challenge-217/peter-campbell-smith/perl/ch-2.pl | 40 |
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; +} |
