1

有任务:

我有一块灯板,编号为 0,1,2,...,1023。
每个灯都可以打开或关闭。所有灯最初都是关闭的。

第1步:

我从 0 开始翻转所有的灯。
此时,所有的灯都打开了。

第 2 步:我从 0 开始每隔一秒翻转一次 Light。
此时,Lights 0,2,4,6,8,... 已关闭。
灯 1,3,5,7,9,... 仍然亮着。

第 3 步:我从 0 开始每隔三个灯翻转一次。
所以我翻转灯 0、3、6、9、12,...
也就是说,如果灯打开,我将其翻转为关闭。
如果灯熄灭,我将其打开。

...

步骤 1023:
我从 0 开始每隔 1023'rd Light 翻转一次。
所以我翻转 0 和 1023。

问题:此时,哪些灯亮,哪些灯熄灭?



这是我的代码:

class Light:

    def __init__(self):
        self.state = 'OFF'

    def turn_on(self):
        self.state = 'ON'

    def turn_off(self):
        self.state = 'OFF'

    def flip(self):
        if self.state == 'OFF':
            self.state = 'ON'
        else:
            self.state = 'OFF'

    def __str__(self):
        return str(self.state)


class LightBoard:

    def __init__(self, num_lights):
        self.light = [Light()] * num_lights

    def step(self,i):
        for element in self.light:
            if self.light.index(element) % i == 0:
                self.light[self.light.index(element)] = self.light[self.light.index(element)].flip()

    def all_steps(self):
        i = 0
        while i != len(self.light):
            self.light = self.light.step(self.light, i)
            i += 1

    def __str__(self):
        return str(self.light)



我使用了 python 可视化工具,发现 LightBoard 中的 all_steps 不起作用。

AttributeError:“列表”对象没有属性“步骤”

我迷失在纠正它。
请帮助更正/对我的代码发表评论。谢谢!

4

1 回答 1

1

一个问题在于

    self.light = [Light()] * num_lights

这需要更改为

    self.light = [Light() for _ in range(num_lights)]

否则,self.light包含对同一Light对象的引用。

还有其他问题,包括:

  1. 您需要两级循环,而不仅仅是一层。
  2. 以下有几个错误:self.light = self.light.step(self.light, i)。一个问题是您正在调用stepself.light这是一个列表。

PS你必须为此编写程序吗?这是使用笔和纸可以很容易解决的问题之一。

于 2013-01-26T13:45:10.600 回答