有任务:


  我有一个灯板,编号为0,1,2,...,1023。
  每个指示灯可以打开或关闭。最初所有指示灯均熄灭。
  
  步骤1:
  
  我翻转所有从0开始的灯光。
  至此,所有的灯都亮了。
  
  第2步:我从0开始,每隔一秒翻转一次Light。
  此时,灯光0,2,4,6,8,...熄灭。
  灯1,3,5,7,9,...仍然亮着。
  
  第3步:我从0开始翻转每三个Light。
  所以我翻转灯0,3,6,9,12,...
  也就是说,如果灯亮着,我将其关闭。
  如果灯熄灭,我将其打开。
  
  ...
  
  步骤1023:
  我从0开始翻转每1023盏灯。
  所以我翻转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 visualizer,发现LightBoard中的all_steps不起作用。


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


我迷失了它。
请帮助纠正/评论我的代码。谢谢!

最佳答案

一个问题是

    self.light = [Light()] * num_lights


这需要更改为

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


否则,self.light由对同一Light对象的引用组成。

还有其他问题,包括:


您需要两个级别的循环,而不仅仅是一个。
下面有几个错误:self.light = self.light.step(self.light, i)。一个问题是您要在step列表中调用self.light


附言您是否需要为此编写程序?这是使用笔和纸可以很容易解决的问题之一。

关于python - 用类解决光的难题,但有翻转的麻烦。 (Python 3),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14537477/

10-10 16:36