Home >Backend Development >Python Tutorial >Earn with igits
Weekly Challenge 303: Python and Perl Solutions
Mohammad S. Anwar's Weekly Challenge provides a regular coding exercise. My solutions, presented below, are initially crafted in Python and then adapted to Perl. This dual approach enhances coding proficiency.
Challenge 303: Solutions
Task 1: Generating Even 3-Digit Integers
Task Description:
Given a list of positive integers, generate all unique even 3-digit integers that can be formed using the digits from the list.
Python Solution:
This Python solution leverages the itertools.permutations
function to efficiently generate all possible 3-digit combinations. A set is used to maintain uniqueness.
<code class="language-python">from itertools import permutations def three_digits_even(ints: list) -> list: solution = set() for p in permutations(ints, 3): num_str = "".join(map(str, p)) num = int(num_str) if num >= 100 and num % 2 == 0 and num_str[0] != '0': solution.add(num) return sorted(list(solution))</code>
Perl Solution:
The Perl equivalent uses the Algorithm::Permute
module for permutations and a hash to ensure uniqueness.
<code class="language-perl">use Algorithm::Permute; sub three_digits_even { my @ints = @_; my %seen; my @result; my $p = Algorithm::Permute->new(\@ints, 3); while (my @perm = $p->next) { my $num_str = join('', @perm); my $num = $num_str; if ($num >= 100 and $num % 2 == 0 and $num_str !~ /^0/) { push @result, $num unless $seen{$num}++; } } return sort {$a <=> $b} @result; }</code>
Examples:
<code># Python print(three_digits_even([2, 1, 3, 0])) # Output: [102, 120, 130, 132, 210, 230, 302, 310, 312, 320] print(three_digits_even([2, 2, 8, 8, 2])) # Output: [222, 228, 282, 288, 822, 828, 882] # Perl print "@{[three_digits_even(2, 1, 3, 0)]}\n"; # Output: 102 120 130 132 210 230 302 310 312 320 print "@{[three_digits_even(2, 2, 8, 8, 2)]}\n"; # Output: 222 228 282 288 822 828 882</code>
Task 2: Delete and Earn
Task Description:
Given an array of integers, find the maximum number of points you can earn by repeatedly deleting an element, earning its value, and then deleting all elements with values one less and one more than the deleted element.
Python Solution:
This Python solution uses a Counter
to track element frequencies and employs a recursive function to explore different deletion strategies.
<code class="language-python">from collections import Counter def delete_and_earn(ints: list) -> int: freq = Counter(ints) return max_score(freq) def max_score(freq: Counter) -> int: max_points = 0 for num in list(freq): # Iterate through a copy to safely delete points = num * freq[num] new_freq = freq.copy() del new_freq[num] if num - 1 in new_freq: del new_freq[num - 1] if num + 1 in new_freq: del new_freq[num + 1] max_points = max(max_points, points + (0 if not new_freq else max_score(new_freq))) return max_points</code>
Perl Solution:
The Perl solution mirrors the Python approach using a hash for frequency counting and a recursive function.
<code class="language-perl">sub delete_and_earn { my %freq = map { $_ => 1 + $freq{$_} // 0 } @_; return max_score(\%freq); } sub max_score { my $freq = shift; my $max_points = 0; foreach my $num (keys %$freq) { my $points = $num * $freq->{$num}; my %new_freq = %$freq; delete $new_freq{$num}; delete $new_freq{$num - 1}; delete $new_freq{$num + 1}; $max_points = max($max_points, $points + (0 || max_score(\%new_freq))); } return $max_points; } sub max { return shift if @_ == 1; return $_[0] > $_[1] ? $_[0] : $_[1]; }</code>
Examples:
<code># Python print(delete_and_earn([3, 4, 2])) # Output: 6 print(delete_and_earn([2, 2, 3, 3, 3, 4])) # Output: 9 # Perl print delete_and_earn(3, 4, 2), "\n"; # Output: 6 print delete_and_earn(2, 2, 3, 3, 3, 4), "\n"; # Output: 9</code>
These solutions demonstrate efficient and clear approaches to solving both tasks in the Weekly Challenge 303. The use of both Python and Perl highlights the transferable nature of algorithmic problem-solving across different programming languages.
The above is the detailed content of Earn with igits. For more information, please follow other related articles on the PHP Chinese website!