ハンマーリスト

DDD
リリース: 2024-12-30 16:34:15
オリジナル
544 人が閲覧しました

Hammering lists

ウィークリーチャレンジ 301

Mohammad S. Anwar は毎週、毎週 2 つのタスクに対する解決策を全員が考え出すチャンスであるウィークリー チャレンジを送信します。私のソリューションは最初に Python で書かれ、次に Perl に変換されます。これは、私たち全員がコーディングを練習するのに最適な方法です。

挑戦、私の解決策

タスク 1: 最大の数

タスク

正の整数のリスト @ints が与えられます。

指定されたリスト内のすべての要素を最大の数を形成するように配置し、それを返すスクリプトを作成します。

私の解決策

考えすぎかもしれませんが、これは思ったほど簡単ではありません。

1 つのオプションは、すべての順列を計算し、どの数値が最大であるかを確認することです。ただし、整数を追加すると、リソースが大量に消費されます。 13 個の整数がある場合、60 億を超える順列が存在します。したがって、私はこれを解決策として除外します。

したがって、当然のことは、整数をソートし、結合して結果を出力することです。 Python では文字列と整数の処理が異なるため、ソートされたリストを文字列に変換し、結合して整数に戻す必要があります。

def largest_number(ints: list) -> int:
    sorted_ints = sorted(ints, key=cmp_to_key(number_sort), reverse=True)
    return int(''.join(map(str, sorted_ints)))
ログイン後にコピー
ログイン後にコピー

並べ替えに関しては、少し複雑です。 2 番目に提供された例では、3、30、および 34 がすべて整数として指定されていることがわかります。このため、項目 (最高値から最低値へ) 34、3、および 30 を並べることで最大の数値が得られることがわかりました。

number_sort 関数では、整数を文字列 s1 と s2 に変換します。次に、s1 と s2 を連結した整数 c1 が得られ、c2 は s2 と s1 を連結したものになります。

c1 が c2 より小さい場合、-1 を返します。大きい場合は 1 を返します。同じ場合は 0 を返します。sorted 関数はこの情報を使用して、必要に応じてリストを並べ替えます。

def number_sort(i1: int, i2: int) -> int:
    s1 = str(i1)
    s2 = str(i2)

    c1 = int(s1 + s2)
    c2 = int(s2 + s1)

    if c1 < c2:
        return -1
    if c1 > c2:
        return 1

    return 0
ログイン後にコピー
ログイン後にコピー

Perl コードははるかに単純です :)

sub number_sort() {
    return "$a$b" <=> "$b$a";
}
ログイン後にコピー

$ ./ch-1.py 20 3
320

$ ./ch-1.py 3 30 34 5 9
9534330
ログイン後にコピー

タスク 2: ハミング距離

タスク

整数の配列 @ints が与えられます。

指定された整数配列内のすべての整数ペア間のハミング距離の合計を返すスクリプトを作成します。

2 つの整数間のハミング距離は、それらのバイナリ表現が異なる箇所の数です。

私の解決策

前のタスクでは、Python が整数と文字列を異なる型として扱う方法について説明しました。 Perl の利点の 1 つは、あらゆる点で変数の型指定について心配する必要がないと言われていることです。内部的には異なる方法で保存されていますが、Perl は何をすべきかを知っています。

Perl 5.10 と Perl 5.16 (私は Perl 開発のほとんどをここで行いました) には、2 つの注目すべき例外があります。 1 つは JSON モジュールで、文字列の場合は「10」、整数の場合は 10 を出力します。

もう 1 つはビット単位の演算です。パーロップのページから、105 | 150 (2 つの整数) は 255 ですが、「105」 | 「150」(2つの文字列)は155です。

そこで、perlop ページをもう一度読んで、これが Perl の新しいバージョンで解決されていることを確認して、嬉しい驚きを感じました。 Perl 5.22 で実験的であり、Perl 5.28 で利用できるビットごとの機能が追加されました。これにより、ビット単位の演算子が常に値を整数として扱うことが保証され、文字列ベースのビット単位には新しい演算子が追加されます。

とにかく、目の前の仕事に戻りましょう。このために、2 つの整数のすべての組み合わせを計算します。組み合わせごとに、2 つの値の XOR (排他的論理和) を実行し、バイナリに変換して、バイナリ表現内の 1 の数を数えます。

def largest_number(ints: list) -> int:
    sorted_ints = sorted(ints, key=cmp_to_key(number_sort), reverse=True)
    return int(''.join(map(str, sorted_ints)))
ログイン後にコピー
ログイン後にコピー

def number_sort(i1: int, i2: int) -> int:
    s1 = str(i1)
    s2 = str(i2)

    c1 = int(s1 + s2)
    c2 = int(s2 + s1)

    if c1 < c2:
        return -1
    if c1 > c2:
        return 1

    return 0
ログイン後にコピー
ログイン後にコピー

以上がハンマーリストの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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