Skip to content

Instantly share code, notes, and snippets.

@zenwerk
Created October 1, 2011 16:28
Show Gist options
  • Save zenwerk/1256279 to your computer and use it in GitHub Desktop.
Save zenwerk/1256279 to your computer and use it in GitHub Desktop.
google code jam practice A-small
# coding:utf-8
# Snapperクラス
class Snapper(object):
def __init__(self):
self.state = 'OFF'
self.hasPower = False # 電源が供給されているか
self.isWorking = False # Snapperが稼働しているか
self.previous = None # 前に接続しているSnapper
self.follow = None # 次に接続しているSnapper
# Snapperを接続する
def connect(self, previous, follow):
# print 'connecting...', previous, 'and', follow
self.previous = previous
self.follow = follow
# 電力が供給されている場合はON/OFFを切り替える
def changeState(self):
if self.hasPower:
if self.state == 'ON':
self.state = 'OFF'
elif self.state == 'OFF':
self.state = 'ON'
# 電源供給の可否の判断
def transmitPower(self):
if self.state == 'ON' and self.hasPower:
self.follow.hasPower = True
elif self.state == 'OFF' or self.hasPower == False:
self.follow.hasPower = False
def getPreviousPowerState(self):
if self.previous.state == 'ON' and self.previous.hasPower:
self.hasPower = True
elif self.previous.state == 'OFF':
self.hasPower = False
return self.hasPower
# 電源クラス
class Power(object):
def __init__(self):
self.hasPower = True # 電源は常にON
self.state = 'ON'
def connect(self, follow):
self.follow = follow
def transmitPower(self):
self.follow.hasPower = True
# 電球クラス
class Lamp(object):
def __init__(self):
self.state = 'OFF'
self.hasPower = False
def connect(self, previous):
self.previous = previous
def changeState(self):
if self.hasPower:
self.state = 'ON'
elif not self.hasPower:
self.state = 'OFF'
def getState(self):
return self.state
if __name__ == '__main__':
f = open('./A-small-practice.in', 'r')
T = str(f.readline())
conditions = [] # N,Kの条件
for i in f.readlines():
N, K = i.split(' ')
conditions.append((int(N), int(K)))
count = 1
for i in conditions:
snappers = []
N = i[0] # Snapper数
if N == 0:
print 'Case%d:OFF'%(count)
continue
for j in range(N):
snappers.append(Snapper())
for j in range(1, N-1):
# print 'CONNECTING...', 'snapper[%d]'%(j), 'to', 'snapper[%d]'%(j-1), 'snapper[%d]'%(j+1)
snappers[j].connect(snappers[j-1], snappers[j+1])
power = Power()
lamp = Lamp()
if N == 1:
power.connect(snappers[0])
snappers[0].connect(power,lamp)
lamp.connect(snappers[0])
else:
#print 'CONNECTING POWER AND LAMP...'
power.connect(snappers[0])
snappers[0].connect(power, snappers[1])
snappers[N-1].connect(snappers[N-2], lamp)
lamp.connect(snappers[N-1])
K=i[1] # 指パッチン数
power.transmitPower() # 電源からの電源供給
for j in range(K):
# ON/OFFの状態更新
for l in range(len(snappers)):
snappers[l].changeState()
# 電源供給状態の更新
for l in range(len(snappers)):
power.transmitPower()
snappers[l].transmitPower()
#print '[%d, Power:%s State:%s] ->'%(l, snappers[l].hasPower, snappers[l].state)
lamp.changeState()
print 'Case #%d: %s' % (count, lamp.getState())
count = count+1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment