[英]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]
。
我的問題是這段代碼如何與邏輯匹配? 它只是碰巧給出了相同的答案嗎?
從犯人的角度來看,越獄是這樣的:
freed[0] == 1
)。 結束。 否則,繼續執行步驟 2。k, _ in groupby(prison)
)。 從第 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.