有任务:
我有一个灯板,编号为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/