diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2023-05-16 17:26:30 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-05-16 17:26:30 +0100 |
| commit | 833836697f2d0121bf791c605b0c3aae35411500 (patch) | |
| tree | b0017ab11c44c5c3df63c0217755d06a928919dd | |
| parent | 7a7c6a53392171a59ee0846884971596ec975ff5 (diff) | |
| parent | d972746b7d9779cd584c9fbf47e1053e818c37a2 (diff) | |
| download | perlweeklychallenge-club-833836697f2d0121bf791c605b0c3aae35411500.tar.gz perlweeklychallenge-club-833836697f2d0121bf791c605b0c3aae35411500.tar.bz2 perlweeklychallenge-club-833836697f2d0121bf791c605b0c3aae35411500.zip | |
Merge pull request #8088 from pjcs00/wk217
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; +} |
