Heim >Backend-Entwicklung >Python-Tutorial >Verdienen Sie mit igits
Wöchentliche Herausforderung 303: Python- und Perl-Lösungen
Mohammad S. Anwars Weekly Challenge bietet eine regelmäßige Programmierübung. Meine unten vorgestellten Lösungen werden zunächst in Python erstellt und dann an Perl angepasst. Dieser duale Ansatz verbessert die Programmierkompetenz.
Herausforderung 303: Lösungen
Aufgabe 1: Generieren gerader dreistelliger Ganzzahlen
Aufgabenbeschreibung:
Generieren Sie anhand einer Liste positiver Ganzzahlen alle eindeutigen geraden 3-stelligen Ganzzahlen, die mit den Ziffern aus der Liste gebildet werden können.
Python-Lösung:
Diese Python-Lösung nutzt die Funktion itertools.permutations
, um alle möglichen dreistelligen Kombinationen effizient zu generieren. Ein Set wird verwendet, um die Einzigartigkeit zu bewahren.
<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-Lösung:
Das Perl-Äquivalent verwendet das Algorithm::Permute
-Modul für Permutationen und einen Hash, um die Einzigartigkeit sicherzustellen.
<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>
Beispiele:
<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>
Aufgabe 2: Löschen und verdienen
Aufgabenbeschreibung:
Ermitteln Sie anhand eines Arrays von ganzen Zahlen die maximale Anzahl an Punkten, die Sie verdienen können, indem Sie wiederholt ein Element löschen, seinen Wert erhalten und dann alle Elemente löschen, deren Werte um eins kleiner und eins größer als das gelöschte Element sind.
Python-Lösung:
Diese Python-Lösung verwendet ein Counter
, um Elementhäufigkeiten zu verfolgen, und verwendet eine rekursive Funktion, um verschiedene Löschstrategien zu untersuchen.
<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-Lösung:
Die Perl-Lösung spiegelt den Python-Ansatz wider und verwendet einen Hash zur Häufigkeitszählung und eine rekursive Funktion.
<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>
Beispiele:
<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>
Diese Lösungen demonstrieren effiziente und klare Ansätze zur Lösung beider Aufgaben in der Weekly Challenge 303. Die Verwendung von Python und Perl unterstreicht die Übertragbarkeit algorithmischer Problemlösung auf verschiedene Programmiersprachen.
Das obige ist der detaillierte Inhalt vonVerdienen Sie mit igits. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!