嵌套之美

DDD
DDD原創
2024-12-26 22:22:14201瀏覽

Nested beauty

每週挑戰 300

穆罕默德·S·安瓦爾 (Mohammad S. Anwar) 每週都會發出“每週挑戰”,讓我們所有人都有機會為兩週的任務提出解決方案。我的解決方案先用Python編寫,然後轉換為Perl。這對我們所有人來說都是練習編碼的好方法。

挑戰,我的解決方案

這是第三百次挑戰,讓我個人感謝穆罕默德代表普華永道團隊的每個人每週所做的所有工作。

任務一:美麗的佈置

任務

給你一個正整數,$int。

編寫一個腳本來傳回您可以建立的精美排列的數量。

如果對於每個 i (1

  1. perm[i] 能被 i 整除
  2. i 可以被 perm[i]整除

我的解決方案

對於此任務,我使用 itertool 模組中的排列函數來完成所有排列。

那麼只需確定該排列是否符合指定條件即可。如果沒有,我將轉向下一個排列。如果是,我會向 count 變數加一。

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:嵌套數組

任務

給你一個整數數組,@ints 長度為 n,包含 [0, n - 1] 範圍內數字的排列。

寫一個腳本來建立一個集合,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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn