在Python中,以下代码是如何工作的?

2024-06-16 09:52:59 发布

您现在位置:Python中文网/ 问答频道 /正文

指示

越狱

监狱可以表示为牢房列表。每个牢房里只有一个囚犯。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.

创建一个函数,根据这种独特的监狱安排,返回获释囚犯的数量。

例子

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函数将为我提供键:[1, 0, 1, 0]

我的问题是,这段代码如何与逻辑匹配?它是否恰好给出了所需的相同答案


Tags: andtheinyoufree示例列表cell
1条回答
网友
1楼 · 发布于 2024-06-16 09:52:59

从囚犯的角度来看,《越狱》是这样运作的:

  1. 如果我的单元格被锁定,则不会释放任何人(freed[0] == 1)。结束。否则 继续执行步骤2
  2. 当我离开我的牢房后,锁就打开了,我的小组中的任何人都会呆在他们的牢房里,因为牢房从解锁状态变为锁定状态。跳过我组中的所有人(k, _ in groupby(prison)
  3. 对单元块的其余部分重复步骤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

输出

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

相关问题 更多 >