首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python中,以下代码是如何工作的?

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

Stack Overflow用户
提问于 2021-02-24 20:28:56
回答 1查看 121关注 0票数 1

使用说明

越狱

监狱可以表示为一系列牢房。每间牢房只有一名囚犯。1表示未锁定的单元格,0表示锁定的单元格。

1,1,0,0,0,1,0

从最左边的牢房开始,你的任务是看看你可以用一个捕获器释放多少囚犯。你是第一牢房里的囚犯。如果第一个单元格被锁定,则无法释放任何人。每次释放一个囚犯时,锁定的牢房就会解锁,而解锁的牢房又会再次锁定。

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

代码语言:javascript
运行
复制
[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.

创建一个函数,该函数在给定这种独特的监狱安排的情况下,返回获释囚犯的数量。

示例

代码语言:javascript
运行
复制
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我在解决方案中找到了以下代码:

代码语言:javascript
运行
复制
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]

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-25 11:20:59

从囚犯的角度来看,越狱是这样的:

如果我的牢房被锁定,没有人是自由的(freed[0] == 1)。结束了。否则,请继续执行步骤2。

在我离开我的牢房后,锁就会打开,我的小组中的任何人都会留在他们的牢房里,因为它刚刚从解锁变成了锁。跳过我组中的所有人(

k, _ in groupby(prison))。

对单元格块的其余部分重复步骤1和2。

从步骤2中,我们可以推断出,每个具有相同锁定状态的组中只有一个囚犯被释放。我们还可以从下面的每一组中推断出,我们可以释放一个囚犯。因此,确定释放的囚犯数量可以简化为计算不同组的数量(如果我的牢房被锁定,则为零)。这将是len(freed)

从下面的代码中可以更容易地看出这一点。还要注意第二个示例,它解决了“每个组只释放一个”部分;与第一个示例进行比较:

代码语言:javascript
运行
复制
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

输出

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66350957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档