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

问题描述

说明

越狱

监狱可以表示为一个牢房列表。每个牢房只关押一名囚犯。 1 代表未锁定单元格,0 代表锁定单元格。

[1,1,0]

从最左边的牢房内开始,您的任务是查看一次可以释放多少囚犯。你是第一个牢房的囚犯。如果第一个单元格被锁定,则无法释放任何人。每次释放囚犯时,锁定的牢房解锁,解锁的牢房再次锁定。

所以,如果我们使用上面的例子:

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

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

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

[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,0]) ➞ 4

freed_prisoners([1,1]) ➞ 1

freed_prisoners([0,0]) ➞ 0

freed_prisoners([0,1]) ➞ 0

注意事项

  • 你是第一个牢房的囚犯。你必须被释放才能释放其他人。

  • 你必须释放一名囚犯才能打开锁。因此,在释放第一个囚犯后输入为 [1,1] 的第二个示例中,锁更改为 [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. 如果我的牢房被锁定,则没有人被释放 (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])  # ➞ 4
freed_prisoners([1,0])           # ➞ 4
freed_prisoners([1,1])              # ➞ 1
freed_prisoners([0,0])              # ➞ 0
freed_prisoners([0,1])           # ➞ 0

输出

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...