イギットで稼ぐ

Patricia Arquette
リリース: 2025-01-12 18:12:43
オリジナル
887 人が閲覧しました

Earn with igits

ウィークリー チャレンジ 303: Python と Perl のソリューション

Mohammad S. Anwar の Weekly Challenge では、定期的なコーディング演習が提供されます。 以下に示す私のソリューションは、最初は Python で作成され、その後 Perl に適応されました。 この 2 つのアプローチにより、コーディング能力が向上します。

課題 303: 解決策

タスク 1: 偶数 3 桁の整数を生成する

タスクの説明:

正の整数のリストが与えられた場合、リストの数字を使用して形成できる一意の偶数 3 桁の整数をすべて生成します。

Python ソリューション:

この Python ソリューションは、itertools.permutations 関数を利用して、考えられるすべての 3 桁の組み合わせを効率的に生成します。 セットは一意性を維持するために使用されます。

<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 ソリューション:

Perl の同等のモジュールは、置換とハッシュに Algorithm::Permute モジュールを使用して一意性を確保します。

<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>
ログイン後にコピー

例:

<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>
ログイン後にコピー

タスク 2: 削除して獲得

タスクの説明:

整数の配列が与えられた場合、要素を繰り返し削除してその値を取得し、削除された要素より 1 つ少ない値と 1 つ多い値を持つすべての要素を削除することで獲得できる最大ポイント数を見つけます。

Python ソリューション:

この Python ソリューションは、Counter を使用して要素の頻度を追跡し、再帰関数を使用してさまざまな削除戦略を調査します。

<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 ソリューション:

Perl ソリューションは、頻度カウントのハッシュと再帰関数を使用する Python のアプローチを反映しています。

<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>
ログイン後にコピー

例:

<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>
ログイン後にコピー

これらのソリューションは、ウィークリー チャレンジ 303 の両方のタスクを解決するための効率的かつ明確なアプローチを示しています。Python と Perl の両方を使用することにより、アルゴリズムによる問題解決が異なるプログラミング言語間で応用できる性質があることが強調されます。

以上がイギットで稼ぐの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート