入れ子の美しさ

DDD
DDDオリジナル
2024-12-26 22:22:14190ブラウズ

Nested beauty

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

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

挑戦、私の解決策

これが 300 回目のチャレンジとなるので、チーム PWC の全員を代表して毎週行っているすべての仕事に対して、モハマドに個人的に感謝したいと思います。

タスク 1: 美しいアレンジメント

タスク

正の整数 $int が与えられます。

構築できる美しいアレンジメントの数を返すスクリプトを作成します。

すべての i (1

  1. perm[i] は i で割り切れます
  2. i は perm[i] で割り切れます

私の解決策

このタスクでは、itertool モジュールの順列関数を使用して、すべての順列を処理します。

あとは、この順列が指定された基準を満たしているかどうかを判断するだけです。そうでない場合は、次の順列に進みます。そうであれば、count 変数に 1 を追加します。

def beautiful_arrangement(n: list) -> str:
    count = 0

    for p in permutations(range(1, n+1)):
        for i in range(n):
            if p[i] % (i+1) != 0 and (i+1) % p[i] != 0:
                break
        else:
            count += 1

    return count

総当たりを使わずに結果を計算するより効率的な方法があるかもしれません。私のコードは、数値が大きくなると非常に非効率になります。私はこれを調査するのに少しも時間を費やしませんでした。

$ ./ch-1.py 1
1

$ ./ch-1.py 2
2

$ ./ch-1.py 10
700

タスク 2: 入れ子になった配列

タスク

[0, n - 1] の範囲内の数値の順列を含む長さ n の整数の配列 @int が与えられます。

次のルールに従って、セット set[i] = ints[i], ints[ints[i]], ints[ints[ints[i]]], ... を構築するスクリプトを作成します。

  1. set[i] の最初の要素は、要素 ints[i] の選択から始まります。
  2. set[i] の次の要素は ints[ints[i]]、次に ints[ints[ints[i]]] というようになります。
  3. set[i] で重複要素が発生する直前に追加を停止します。

私の解決策

これは比較的簡単です。まず、longest_set という変数を 0 に設定します。次に、各開始位置を反復処理して、this_set リストをセットの最初の項目 (つまり ints[i]) に設定します。 ints[this_set[-1]] が this_set リストに表示されない間、このセットに追加し続けます。これが完了したら、this_set リストの長さをlongest_set 値と比較します。それが大きい場合は、longest_set 値を更新します。

def nested_array(ints: list) -> int:
    longest_set = 0

    for start in range(len(ints)):
        this_set = [ints[start]]

        while ints[this_set[-1]] not in this_set:
            this_set.append(ints[this_set[-1]])

        if longest_set < len(this_set):
            longest_set = len(this_set)

    return longest_set

$ ./ch-2.py 5 4 0 3 1 6 2
4

$ ./ch-2.py 0 1 2
1

$ ./ch-2.py 1 2 0 4 5 2
5

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。