Robbie Hatley's Solutions, in Perl, for The Weekly Challenge #336 (“Equal Group” and “Final Score”)
For those not familiar with "The Weekly Challenge", it is a weekly programming puzzle with two parts, with a new pair of tasks each Monday. You can find it here:
The Weekly Challenge for the week of 2025-08-25 through 2025-08-31 is #336
The tasks for challenge #336 are as follows:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Task 336-1: Equal Group Submitted by: Mohammad Sajid Anwar You are given an array of integers. Write a script to return true if the given array can be divided into one or more groups: each group must be of the same size as the others, with at least two members, and with all members having the same value. Example #1: Input: @ints = (1,1,2,2,2,2) Output: true Groups: (1,1), (2,2), (2,2) Example #2: Input: @ints = (1,1,1,2,2,2,3,3) Output: false Groups: (1,1,1), (2,2,2), (3,3) Example #3: Input: @ints = (5,5,5,5,5,5,7,7,7,7,7,7) Output: true Groups: (5,5,5,5,5,5), (7,7,7,7,7,7) Example #4: Input: @ints = (1,2,3,4) Output: false Example #5: Input: @ints = (8,8,9,9,10,10,11,11) Output: true Groups: (8,8), (9,9), (10,10), (11,11)
Mathematically, this problem is equivalent to splitting the input array into equivalence groups based on integer equality. That can easily be done by using a hash %hash with key=integer and value=multiplicity. Then store keys sorted by increasing abundance in an array @sk. If any $hash{$sk[$idx]} is less than 2, or if any $hash{$sk[$idx]} is not divisible by $hash{$sk[0]}, return "false"; otherwise return "true".

Robbie Hatley's Perl Solution to The Weekly Challenge 336-1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Task 336-2: Final Score Submitted by: Mohammad Sajid Anwar You are given an array of scores by a team. Write a script to find the total score of the given team. The score can be any integer, +, C or D. The + adds the sum of previous two scores. The score C invalidates the previous score. The score D will double the previous score. Example #1: Input: @scores = ("5","2","C","D","+") Output: 30 Round 1: 5 Round 2: 5 + 2 Round 3: 5 (invalidate the previous score 2) Round 4: 5 + 10 (double the previous score 5) Round 5: 5 + 10 + 15 (sum of previous two scores) Total Scores: 30 Example #2: Input: @scores = ("5","-2","4","C","D","9","+","+") Output: 27 Round 1: 5 Round 2: 5 + (-2) Round 3: 5 + (-2) + 4 Round 4: 5 + (-2) (invalidate the previous score 4) Round 5: 5 + (-2) + (-4) (double the previous score -2) Round 6: 5 + (-2) + (-4) + 9 Round 7: 5 + (-2) + (-4) + 9 + 5 (sum of previous two scores) Round 8: 5 + (-2) + (-4) + 9 + 5 + 14 (sum of previous two scores) Total Scores: 27 Example #3: Input: @scores = ("7","D","D","C","+","3") Output: 45 Round 1: 7 Round 2: 7 + 14 (double the previous score 7) Round 3: 7 + 14 + 28 (double the previous score 14) Round 4: 7 + 14 (invalidate the previous score 28) Round 5: 7 + 14 + 21 (sum of previous two scores) Round 6: 7 + 14 + 21 + 3 Total Scores: 45 Example #4: Input: @scores = ("-5","-10","+","D","C","+") Output: -55 Round 1: (-5) Round 2: (-5) + (-10) Round 3: (-5) + (-10) + (-15) (sum of previous two scores) Round 4: (-5) + (-10) + (-15) + (-30) (double the previous score -15) Round 5: (-5) + (-10) + (-15) (invalidate the previous score -30) Round 6: (-5) + (-10) + (-15) + (-25) (sum of previous two scores) Total Scores: -55 Example #5: Input: @scores = ("3","6","+","D","C","8","+","D","-2","C","+") Output: 128 Round 1: 3 Round 2: 3 + 6 Round 3: 3 + 6 + 9 (sum of previous two scores) Round 4: 3 + 6 + 9 + 18 (double the previous score 9) Round 5: 3 + 6 + 9 (invalidate the previous score 18) Round 6: 3 + 6 + 9 + 8 Round 7: 3 + 6 + 9 + 8 + 17 (sum of previous two scores) Round 8: 3 + 6 + 9 + 8 + 17 + 34 (double the previous score 17) Round 9: 3 + 6 + 9 + 8 + 17 + 34 + (-2) Round 10: 3 + 6 + 9 + 8 + 17 + 34 (invalidate the previous score -2) Round 11: 3 + 6 + 9 + 8 + 17 + 34 + 51 (sum of previous two scores) Total Scores: 128
I'll iterate through the partial scores from left to right, replacing each with an integer, depending on what each partial score is saying to do. I'll use "switch" and "case" from CPAN module "Switch" to select actions based on each partial score. Then when all partial scores have been converted to integers, I'll use "sum0" from CPAN module "List::Util" to sum the integers, giving the final score.

Robbie Hatley's Perl Solution to The Weekly Challenge 336-2
That's it for challenge 336; see you on challenge 337!
Comments
Post a Comment