diff options
| -rw-r--r-- | challenge-214/sgreen/README.md | 4 | ||||
| -rwxr-xr-x | challenge-214/sgreen/perl/ch-1.pl | 27 | ||||
| -rwxr-xr-x | challenge-214/sgreen/perl/ch-2.pl | 60 | ||||
| -rwxr-xr-x | challenge-214/sgreen/python/ch-1.py | 24 | ||||
| -rwxr-xr-x | challenge-214/sgreen/python/ch-2.py | 50 |
5 files changed, 162 insertions, 3 deletions
diff --git a/challenge-214/sgreen/README.md b/challenge-214/sgreen/README.md index 78dadfd6ee..ca70b10319 100644 --- a/challenge-214/sgreen/README.md +++ b/challenge-214/sgreen/README.md @@ -1,3 +1 @@ -# The Weekly Challenge 213 - -Blog: [Sorting Routes](https://dev.to/simongreennet/sorting-routes-595b) +# The Weekly Challenge 214 diff --git a/challenge-214/sgreen/perl/ch-1.pl b/challenge-214/sgreen/perl/ch-1.pl new file mode 100755 index 0000000000..d68b17c47c --- /dev/null +++ b/challenge-214/sgreen/perl/ch-1.pl @@ -0,0 +1,27 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use feature 'say'; +use experimental 'signatures'; + +sub main(@array) { + my %score_to_place = (); + my @sorted = sort { $b <=> $a } @array; + while(my ($i, $score) = each(@sorted)) { + if (not exists $score_to_place{$score}) { + $score_to_place{$score} = $i+1; + } + } + + my %place_to_word = ( 1 => 'G', 2 => 'S', 3 => 'B' ); + my @solution = (); + foreach my $score (@array) { + my $place = $score_to_place{$score}; + push @solution, $place_to_word{$place} || $place; + } + + say join ', ', @solution; +} + +main(@ARGV);
\ No newline at end of file diff --git a/challenge-214/sgreen/perl/ch-2.pl b/challenge-214/sgreen/perl/ch-2.pl new file mode 100755 index 0000000000..1049d060f7 --- /dev/null +++ b/challenge-214/sgreen/perl/ch-2.pl @@ -0,0 +1,60 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use feature 'say'; +use experimental 'signatures'; + +sub shrink_list(@array) { + # Shrink the list if it has consecutive numbers + my @new_array = []; + foreach my $i (@array) { + my ($number, $count) = @$i; + if ($#new_array != -1 and $new_array[-1][0] == $number) { + $new_array[-1] = [$number, $count + $new_array[-1][1]]; + } + else { + push @new_array, [$number, $count]; + } + } + + return @new_array; +} + +sub score_array(@array) { + # Recursive function to get the highest score + + # Shrink the list if it has consecutive numbers + @array = shrink_list(@array); + + if ($#array == 1) { + # There is only one remaining number + return $array[0][1] ** 2; + } + + my $max_score = 0; + + while(my($i, $tup )= each @array) { + # Create a copy of the array without the chosen element + my @new_array = @array; + splice(@new_array, $i, 1); + + # Calculate the maximum possible score recursively + my $score = $tup->[1] ** 2 + score_array(@new_array); + if ($score > $max_score) { + $max_score = $score; + } + } + + # Return the maximum score + return $max_score; +} + +sub main(@array) { + # Turn the list in a list of tuples of the number and the occurrences of it + @array = map { [$_, 1] } @array; + my $score = score_array(@array); + say $score; +} + +main(@ARGV);
\ No newline at end of file diff --git a/challenge-214/sgreen/python/ch-1.py b/challenge-214/sgreen/python/ch-1.py new file mode 100755 index 0000000000..35bd25744a --- /dev/null +++ b/challenge-214/sgreen/python/ch-1.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +import sys + + +def main(array): + score_to_place = {} + for i, score in enumerate(sorted(array, reverse=True)): + if score not in score_to_place: + score_to_place[score] = i+1 + + place_to_word = {1: 'G', 2: 'S', 3: 'B'} + solution = [] + for i in array: + place = score_to_place[i] + solution.append(place_to_word.get(place, place)) + + print(*solution, sep=', ') + + +if __name__ == '__main__': + # Turn the strings into integers + n = [int(i) for i in sys.argv[1:]] + main(n) diff --git a/challenge-214/sgreen/python/ch-2.py b/challenge-214/sgreen/python/ch-2.py new file mode 100755 index 0000000000..eeeb695be2 --- /dev/null +++ b/challenge-214/sgreen/python/ch-2.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python + +import sys + +def shrink_list(array): + '''Shrink the list if it has consecutive numbers''' + new_array = [] + for i in array: + number, count = i + if len(new_array) and new_array[-1][0] == number: + new_array[-1] = (number, count + new_array[-1][1]) + else: + new_array.append((number, count)) + + return new_array + +def score_array(array): + '''Recursive function to get the highest score''' + # Shrink the list if it has consecutive numbers + array = shrink_list(array) + + if len(array) == 1: + # There is only one remaining number + return array[0][1] ** 2 + + max_score = 0 + + for i, tup in enumerate(array): + # Create a copy of the array without the chosen element + new_array = array.copy() + del new_array[i] + + # Calculate the maximum possible score recursively + score = tup[1] ** 2 + score_array(new_array) + if score > max_score: + max_score = score + + # Return the maximum score + return max_score + +def main(array): + # Turn the list in a list of tuples of the number and the occurrences of it + array = [ (x, 1) for x in array] + score = score_array(array) + print(score) + +if __name__ == '__main__': + # Turn the strings into integers + n = [int(i) for i in sys.argv[1:]] + main(n) |
