Dapatkan dengan igits

Patricia Arquette
Lepaskan: 2025-01-12 18:12:43
asal
855 orang telah melayarinya

Earn with igits

Cabaran Mingguan 303: Penyelesaian Python dan Perl

Cabaran Mingguan Mohamed S. Anwar menyediakan latihan pengekodan biasa. Penyelesaian saya, yang dibentangkan di bawah, pada mulanya dibuat dalam Python dan kemudian disesuaikan dengan Perl. Pendekatan dwi ini meningkatkan kecekapan pengekodan.

Cabaran 303: Penyelesaian

Tugas 1: Menjana Integer 3 Digit Genap

Huraian Tugas:

Memandangkan senarai integer positif, jana semua integer genap 3 digit unik yang boleh dibentuk menggunakan digit daripada senarai.

Penyelesaian Python:

Penyelesaian Python ini memanfaatkan fungsi itertools.permutations untuk menjana semua kemungkinan gabungan 3 digit dengan cekap. Satu set digunakan untuk mengekalkan keunikan.

<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>
Salin selepas log masuk

Penyelesaian Perl:

Perl yang setara menggunakan modul Algorithm::Permute untuk pilih atur dan cincang untuk memastikan keunikan.

<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>
Salin selepas log masuk

Contoh:

<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>
Salin selepas log masuk

Tugas 2: Padam dan Peroleh

Huraian Tugas:

Memandangkan tatasusunan integer, cari bilangan maksimum mata yang boleh anda peroleh dengan memadamkan elemen berulang kali, memperoleh nilainya dan kemudian memadamkan semua elemen dengan nilai kurang satu dan lebih satu daripada elemen yang dipadamkan.

Penyelesaian Python:

Penyelesaian Python ini menggunakan Counter untuk menjejak frekuensi elemen dan menggunakan fungsi rekursif untuk meneroka strategi pemadaman yang berbeza.

<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>
Salin selepas log masuk

Penyelesaian Perl:

Penyelesaian Perl mencerminkan pendekatan Python menggunakan cincang untuk pengiraan kekerapan dan fungsi rekursif.

<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>
Salin selepas log masuk

Contoh:

<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>
Salin selepas log masuk

Penyelesaian ini menunjukkan pendekatan yang cekap dan jelas untuk menyelesaikan kedua-dua tugasan dalam Cabaran Mingguan 303. Penggunaan kedua-dua Python dan Perl menyerlahkan sifat mudah alih penyelesaian masalah algoritma merentas bahasa pengaturcaraan yang berbeza.

Atas ialah kandungan terperinci Dapatkan dengan igits. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan