aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-245/ianrifkin/README.md135
-rw-r--r--challenge-245/ianrifkin/blog.txt1
-rw-r--r--challenge-245/ianrifkin/perl/ch-1.pl77
-rw-r--r--challenge-245/ianrifkin/perl/ch-2.pl107
-rw-r--r--challenge-245/ianrifkin/python/ch-1.py32
-rw-r--r--challenge-245/ianrifkin/python/ch-2.py69
6 files changed, 421 insertions, 0 deletions
diff --git a/challenge-245/ianrifkin/README.md b/challenge-245/ianrifkin/README.md
index 9e84586460..22e83c967e 100644
--- a/challenge-245/ianrifkin/README.md
+++ b/challenge-245/ianrifkin/README.md
@@ -1,3 +1,137 @@
+<<<<<<< HEAD
+# I'm never last picked
+
+Challenge 245: https://theweeklychallenge.org/blog/perl-weekly-challenge-245/
+
+This week we have a task to sort an array based on another array and a task to calculate the largest number combination from a given input that is divisible by 3.
+
+## Task 1: Sort Language
+
+```
+You are given two array of languages and its popularity.
+
+Write a script to sort the language based on popularity.
+
+Example 1
+Input: @lang = ('perl', 'c', 'python')
+ @popularity = (2, 1, 3)
+Output: ('c', 'perl', 'python')
+Example 2
+Input: @lang = ('c++', 'haskell', 'java')
+ @popularity = (1, 3, 2)
+Output: ('c++', 'java', 'haskell')
+```
+
+My first instinct to solve this was to align the two arrays (lang and popularity) into a hash. While this made sense I quickly realized I would still have the step of sorting based on the keys. This should still have worked but since the arrays have the same indices I didn't really need to combine them into a hash.
+
+I sorted the popularity array and outputted the indices in sort order (not the values):
+```
+my @pop_sort_idx = sort { $popularity[$a] <=> $popularity[$b] } 0 .. $#popularity;
+```
+
+With that I return an array of the languages in sort order using the inputted langage array in the order of the sorted popularity:
+```
+@lang[@pop_sort_idx];
+```
+
+I also solved this task only slightly differently with Python. I first created a list combining the `popularity` and `lang` lists using `zip`:
+```
+sorted_langs_with_pop = sorted(zip(popularity,lang))
+```
+
+I then use that to create the desired output of just the languages in the sort order:
+```
+[lang for _,lang in sorted_langs_with_pop]
+```
+
+That could have been in one line but I thought it was clearer in the two distinct steps.
+
+## Task 2: Largest of Three
+
+```
+You are given an array of integers >= 0.
+
+Write a script to return the largest number formed by concatenating some of the given integers in any order which is also multiple of 3. Return -1 if none found.
+
+
+Example 1
+Input: @ints = (8, 1, 9)
+Output: 981
+
+981 % 3 == 0
+Example 2
+Input: @ints = (8, 6, 7, 1, 0)
+Output: 8760
+Example 3
+Input: @ints = (1)
+Output: -1
+```
+
+This was fun to think through. The first part of the problem is to create an array of all potential numbers sorted from biggest to smallest. The second part of the problem is simpler -- ouput the biggest number (if available) that is divisible by 3.
+
+In Challenge 244 I used Algorithm::Combinatoric::partitions so I decided to start with that again here. I take the input number and use `partitions` to generate the various "partitions" e.g. for 9,8,1 it is: 981, 98, 91, 9, 81, 8, 1.
+```
+my @parts = partitions(\@ints);
+```
+
+This only gets me part of the way there. I then need each of those numbers in every order (e.g. I need 89 in addition to 98). I decided to use Algorithm::Permute to take the partitions and create all these permutations.
+```
+for (my $i=0; $i<@parts-1; $i++) {
+ foreach ( @{$parts[$i]} ) {
+ my @parts = $_;
+ my $p_iterator = Algorithm::Permute->new ( \@{$parts[0]} );
+```
+
+Finally I will take the output from Algorithm::Permute and push it into an array of all the numbers to try:
+```
+while (my @perm = $p_iterator->next) {
+ push(@numbers_to_try, join('', @perm));
+}
+```
+
+At this point I have a randomly sorted array of every number to try. I next need to find out which number (if any) is the largest number divisible by 3.
+```
+foreach my $num_2_try (sort { $b <=> $a } @numbers_to_try) {
+ return $num_2_try unless $num_2_try % 3;
+}
+```
+
+The above loop will return the first number (the largest number) divisible by 3. If it doesn't find one then after this loop there is a `return -1` so that the default behavoir matches the requirements.
+
+
+Again with this task I wanted to see how to solve it using Python. It is a fairly similar approach but I of course don't have the Perl modules available; instead I used `itertools:permutations` which is native to Python.
+
+`itertools:permutations` can have a length to its output but I don't see a way for it to provide a dynamic length like we need. Instead I loop through the list length so that I can run the permutations for each length:
+```
+for i in range(len(nums)):
+ num_of_digits = i+1
+ perms = list(permutations(nums, num_of_digits))
+```
+
+That creates a list of tuples, but I need the tuples to be combined into actual numbers to try:
+```
+ for group_of_digits in perms:
+ combined_digits = int("".join(map(str, group_of_digits)))
+ numbers_to_try.append(combined_digits)
+```
+
+Now I have an unsorted list of numbers to try, so next comes the sorting:
+```
+numbers_to_try.sort(reverse=True)
+```
+
+The final step, like in the Perl solution, is to return the first (largest) number divisible by 3, otherwise return -1:
+```
+for num2try in numbers_to_try:
+ if num2try % 3 == 0:
+ return num2try
+return -1
+```
+
+
+---
+The full code with comments is available at https://github.com/manwar/perlweeklychallenge-club/tree/master/challenge-245/ianrifkin
+=======
# And then a hero comes along
Challenge 244: https://theweeklychallenge.org/blog/perl-weekly-challenge-244/
@@ -88,3 +222,4 @@ Then at the conclusion I return `$group_hero` with the final number.
---
The full code with comments is available at https://github.com/manwar/perlweeklychallenge-club/tree/master/challenge-244/ianrifkin
+>>>>>>> main
diff --git a/challenge-245/ianrifkin/blog.txt b/challenge-245/ianrifkin/blog.txt
new file mode 100644
index 0000000000..74387c5aab
--- /dev/null
+++ b/challenge-245/ianrifkin/blog.txt
@@ -0,0 +1 @@
+https://github.com/manwar/perlweeklychallenge-club/tree/master/challenge-245/ianrifkin#readme
diff --git a/challenge-245/ianrifkin/perl/ch-1.pl b/challenge-245/ianrifkin/perl/ch-1.pl
new file mode 100644
index 0000000000..cdcfe89983
--- /dev/null
+++ b/challenge-245/ianrifkin/perl/ch-1.pl
@@ -0,0 +1,77 @@
+use v5.30.3;
+use warnings;
+use strict;
+use Getopt::Long;
+use Pod::Usage;
+
+# Task 1: Sort Language
+
+my $man = 0;
+my $help = 0;
+GetOptions ('help|?' => \$help, man => \$man
+ )
+ or pod2usage(2);
+
+pod2usage(1) if $help;
+pod2usage(-exitstatus => 0, -verbose => 2) if $man;
+
+# Example 1
+my @lang = ('perl', 'c', 'python');
+my @popularity = (2, 1, 3);
+say sort_lang(\@lang, \@popularity);
+#Output: ('c', 'perl', 'python')
+
+#Example 2
+@lang = ('c++', 'haskell', 'java');
+@popularity = (1, 3, 2);
+say sort_lang(\@lang, \@popularity);
+#Output: ('c++', 'java', 'haskell')
+
+sub sort_lang {
+ my ($lang, $popularity) = @_;
+ # Get indices of popularity array in sort order
+ my @pop_sort_idx = sort { $popularity[$a] <=> $popularity[$b] } 0 .. $#popularity;
+ # Return sorted language array using indices of sorted popularity numbers
+ return "@lang[@pop_sort_idx]";
+}
+
+__END__
+
+=head1 Challenge 245, Task 1: Sort Language, by IanRifkin
+
+You are given two array of languages and its popularity.
+
+Write a script to sort the language based on popularity.
+
+Example 1
+Input: @lang = ('perl', 'c', 'python')
+ @popularity = (2, 1, 3)
+Output: ('c', 'perl', 'python')
+Example 2
+Input: @lang = ('c++', 'haskell', 'java')
+ @popularity = (1, 3, 2)
+Output: ('c++', 'java', 'haskell')
+
+See https://theweeklychallenge.org/blog/perl-weekly-challenge-245/#TASK1 for more information on this challenge
+
+=head1 SYNOPSIS
+
+perl ./ch-1.pl [options]
+
+=head1 OPTIONS
+
+=over 8
+
+=item B<-help>
+
+Print a brief help message and exits.
+
+=item B<-man>
+
+Prints the manual page and exits.
+
+=back
+
+
+
+
diff --git a/challenge-245/ianrifkin/perl/ch-2.pl b/challenge-245/ianrifkin/perl/ch-2.pl
new file mode 100644
index 0000000000..0ed48deed8
--- /dev/null
+++ b/challenge-245/ianrifkin/perl/ch-2.pl
@@ -0,0 +1,107 @@
+use v5.30.3;
+use warnings;
+use strict;
+use Getopt::Long;
+use Pod::Usage;
+use Algorithm::Permute;
+use Algorithm::Combinatorics qw(partitions);
+
+
+# Task 2: Largest of Three
+
+my $man = 0;
+my $help = 0;
+GetOptions ('help|?' => \$help, man => \$man
+ )
+ or pod2usage(2);
+
+pod2usage(1) if $help;
+pod2usage(-exitstatus => 0, -verbose => 2) if $man;
+
+# Example 1
+my @ints = (8, 1, 9);
+say largest(@ints);
+# Output: 981
+
+# Example 2
+@ints = (8, 6, 7, 1, 0);
+say largest(@ints);
+# Output: 8760
+
+# Example 3
+@ints = (1);
+say largest(@ints);
+# Output: -1
+
+sub largest {
+ my @ints = @_; #input array of indidviual ints
+
+ # form an an array of all the possible numbers to try
+ my @numbers_to_try;
+ # use Algorithm::Combinatoric::partitions to generate all the combinations of numbers
+ # e.g. for 9,8,1 it is: 981, 98, 91, 9, 81, 8, 1
+ my @parts = partitions(\@ints);
+ for (my $i=0; $i<@parts-1; $i++) {
+ foreach ( @{$parts[$i]} ) {
+ my @parts = $_;
+ # use Algorithm::Permute to take the partitions and create every order of the numbers
+ # e.g. for an input of 91 it would output 91 and 19
+ my $p_iterator = Algorithm::Permute->new ( \@{$parts[0]} );
+ while (my @perm = $p_iterator->next) {
+ push(@numbers_to_try, join('', @perm));
+ }
+ }
+ }
+
+ # Use array of potential numbers in numerical descending sort order
+ # to determine if any are divisible by 3
+ foreach my $num_2_try (sort { $b <=> $a } @numbers_to_try) {
+ # return the first (biggest) number found
+ return $num_2_try unless $num_2_try % 3;
+ }
+ return -1 #default return value of -1 if no number found
+}
+
+__END__
+
+=head1 Challenge 245, Task 2: Largest of Three, by IanRifkin
+
+You are given an array of integers >= 0.
+
+Write a script to return the largest number formed by concatenating some of the given integers in any order which is also multiple of 3. Return -1 if none found.
+
+Example 1
+Input: @ints = (8, 1, 9)
+Output: 981
+
+981 % 3 == 0
+Example 2
+Input: @ints = (8, 6, 7, 1, 0)
+Output: 8760
+Example 3
+Input: @ints = (1)
+Output: -1
+
+See https://theweeklychallenge.org/blog/perl-weekly-challenge-245/#TASK2 for more information on this challenge
+
+=head1 SYNOPSIS
+
+perl ./ch-1.pl [options]
+
+=head1 OPTIONS
+
+=over 8
+
+=item B<-help>
+
+Print a brief help message and exits.
+
+=item B<-man>
+
+Prints the manual page and exits.
+
+=back
+
+
+
+
diff --git a/challenge-245/ianrifkin/python/ch-1.py b/challenge-245/ianrifkin/python/ch-1.py
new file mode 100644
index 0000000000..54d125e553
--- /dev/null
+++ b/challenge-245/ianrifkin/python/ch-1.py
@@ -0,0 +1,32 @@
+#!/usr/local/bin/python3
+import sys
+
+# Task 1: Sort Language
+
+# See https://theweeklychallenge.org/blog/perl-weekly-challenge-245/#TASK1 for more information on this challenge
+
+# You are given two array of languages and its popularity.
+# Write a script to sort the language based on popularity.
+
+def main(argv):
+ # Example 1
+ lang = ('perl', 'c', 'python')
+ popularity = (2, 1, 3)
+ print( sort_languages(lang, popularity) )
+ #Output: ('c', 'perl', 'python')
+
+ # Example 2
+ lang = ('c++', 'haskell', 'java')
+ popularity = (1, 3, 2)
+ print( sort_languages(lang, popularity) )
+ #Output: ('c++', 'java', 'haskell')
+
+def sort_languages(lang,popularity):
+ # Create a single list based on the two inputted lists
+ sorted_langs_with_pop = sorted(zip(popularity,lang))
+ # Created a sorted list using the above list but only with the languages
+ sorted_langs = [lang for _,lang in sorted_langs_with_pop]
+ return sorted_langs
+
+if __name__ == "__main__":
+ main(sys.argv[1:])
diff --git a/challenge-245/ianrifkin/python/ch-2.py b/challenge-245/ianrifkin/python/ch-2.py
new file mode 100644
index 0000000000..8af7ea3f1e
--- /dev/null
+++ b/challenge-245/ianrifkin/python/ch-2.py
@@ -0,0 +1,69 @@
+#!/usr/local/bin/python3
+import sys, argparse
+import math
+from itertools import permutations
+
+# Task 2: Largest of Three
+
+# You are given an array of integers >= 0.
+
+# Write a script to return the largest number formed by concatenating some of the given integers in any order which is also multiple of 3. Return -1 if none found.
+
+# See https://theweeklychallenge.org/blog/perl-weekly-challenge-245/#TASK2 for more information on this challenge
+
+def main(argv):
+ argParser = argparse.ArgumentParser()
+ argParser.add_argument("-n", "--nums", nargs='+', type=int, help="space seperated list of positive integers e.g. -n 10 30 4 5")
+ args = argParser.parse_args()
+
+ if args.nums:
+ nums = args.nums
+ print( largest(nums) )
+ else:
+ # Example 1
+ nums = [8, 1, 9]
+ print( largest(nums) )
+ #Output: 981
+
+ # Example 2
+ nums = [8, 6, 7, 1, 0]
+ print( largest(nums) )
+ #Output: 8760
+
+ # Example 3
+ nums = [1]
+ print( largest(nums) )
+ #Output: -1
+
+
+def largest(nums):
+ numbers_to_try = []
+ for i in range(len(nums)):
+ num_of_digits = i+1
+ perms = list(permutations(nums, num_of_digits))
+
+ for group_of_digits in perms:
+ combined_digits = int("".join(map(str, group_of_digits)))
+ numbers_to_try.append(combined_digits)
+
+ numbers_to_try.sort(reverse=True)
+
+ for num2try in numbers_to_try:
+ if num2try % 3 == 0:
+ return num2try
+ return -1
+
+
+ # # Use array of potential numbers in numerical descending sort order
+ # # to determine if any are divisible by 3
+ # foreach my $num_2_try (sort { $b <=> $a } @numbers_to_try) {
+ # # return the first (biggest) number found
+ # return $num_2_try unless $num_2_try % 3;
+ # }
+ # return -1 #default return value of -1 if no number found
+
+
+
+
+if __name__ == "__main__":
+ main(sys.argv[1:])