簡體   English   中英

在 Python 中,以下代碼如何工作?

[英]In Python, How does the following code work?

指示

越獄

監獄可以表示為牢房列表。 每個牢房都包含一個囚犯。 1 代表未鎖定的單元格,0 代表鎖定的單元格。

[1, 1, 0, 0, 0, 1, 0]

從最左邊的牢房開始,您的任務是查看可以釋放多少囚犯,並抓住。 你是第一個牢房的囚犯。 如果第一個單元被鎖定,您將無法釋放任何人。 每次您釋放囚犯時,鎖定的牢房就會解鎖,而解鎖的牢房會再次鎖定。

因此,如果我們使用上面的示例:

[1, 1, 0, 0, 0, 1, 0]
# You free the prisoner in the 1st cell.

[0, 0, 1, 1, 1, 0, 1] 
# You free the prisoner in the 3rd cell (2nd one locked).

[1, 1, 0, 0, 0, 1, 0]
# You free the prisoner in the 6th cell (3rd, 4th and 5th locked).

[0, 0, 1, 1, 1, 0, 1]
# You free the prisoner in the 7th cell - and you are done!
Here, we have set free 4 prisoners in total.

創建一個 function,給定這種獨特的監獄安排,返回釋放囚犯的數量。

例子

freed_prisoners([1, 1, 0, 0, 0, 1, 0]) ➞ 4

freed_prisoners([1, 1, 1]) ➞ 1

freed_prisoners([0, 0, 0]) ➞ 0

freed_prisoners([0, 1, 1, 1]) ➞ 0

筆記

  • 你是第一個牢房的囚犯。 你必須被釋放以釋放其他任何人。

  • 您必須釋放一名囚犯才能打開鎖。 因此,在第二個示例中,在您釋放第一個囚犯后,輸入為 [1, 1, 1],鎖更改為 [0, 0, 0]。 由於所有牢房都被鎖定,您無法釋放更多囚犯。

  • 你總是從列表中最左邊的元素開始(第一個牢房)。 如果你右邊的所有牢房都是零,你就不能再釋放更多的囚犯了。

學分: Edabit

我在解決方案中找到了以下代碼:

def freed_prisoners(prison):
    freed = [k for k, _ in groupby(prison)]
    return len(freed) if freed[0] == 1 else 0

我知道groupby function 會給我鑰匙: [1, 0, 1, 0]

我的問題是這段代碼如何與邏輯匹配? 它只是碰巧給出了相同的答案嗎?

從犯人的角度來看,越獄是這樣的:

  1. 如果我的牢房被鎖定,則沒有人被釋放( freed[0] == 1 )。 結束。 否則,繼續執行步驟 2。
  2. 在我離開牢房后,鎖會切換,我小組中的任何人都留在他們的牢房里,因為它剛剛從解鎖變為鎖定。 跳過我組中的每個人( k, _ in groupby(prison) )。
  3. 對單元塊的 rest 重復步驟 1 和 2。

從第 2 步中,我們可以推斷出在相同鎖定狀態的每個組中只有一名囚犯被釋放。 我們還可以推斷,從后面的每一組中,我們可以釋放一個囚犯。 因此,確定獲釋囚犯的數量可以減少為計算不同群體的數量(如果我的牢房被鎖定,則為零)。 這將是len(freed)

從下面的代碼中可以更容易地看出這一點。 另請注意第二個示例,它解決了“每組僅釋放一個”部分; 與第一個示例比較:

import itertools

def freed_prisoners(prison):
    groups = [(k,list(v)) for k,v in itertools.groupby(prison)]
    print(f"Groups: {groups}")
    freed = [k for k, _ in groups]
    persons = len(freed) if freed[0] == 1 else 0
    print(f"Freed list: {freed}; freed {persons} persons")
    return persons

freed_prisoners([1, 1, 0, 0, 0, 1, 0])  # ➞ 4
freed_prisoners([1, 0, 1, 0])           # ➞ 4
freed_prisoners([1, 1, 1])              # ➞ 1
freed_prisoners([0, 0, 0])              # ➞ 0
freed_prisoners([0, 1, 1, 1])           # ➞ 0

Output

Groups: [(1, [1, 1]), (0, [0, 0, 0]), (1, [1]), (0, [0])]
Freed list: [1, 0, 1, 0]; freed 4 persons
Groups: [(1, [1]), (0, [0]), (1, [1]), (0, [0])]
Freed list: [1, 0, 1, 0]; freed 4 persons
Groups: [(1, [1, 1, 1])]
Freed list: [1]; freed 1 persons
Groups: [(0, [0, 0, 0])]
Freed list: [0]; freed 0 persons
Groups: [(0, [0]), (1, [1, 1, 1])]
Freed list: [0, 1]; freed 0 persons

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM