69 lines
1.8 KiB
Python
Raw Permalink Normal View History

2015-12-20 00:41:02 +01:00
#!/usr/bin/python
import re
RE_SPEED_INFO = re.compile(r'^(.*) can fly (\d+) km/s for (\d+) seconds, but then must rest for (\d+) seconds.$')
class Reindeer:
def __init__(self, name):
self.name = name
self.speed = None
self.speedTime = None
self.restTime = None
self.points = 0
def addPoint(self):
self.points += 1
def calculateDistance(self, time):
distance = 0
cycleTime = self.speedTime + self.restTime
cycles = int(time/cycleTime)
distance = distance + cycles*self.speed*self.speedTime
distance += min(self.speedTime, time % cycleTime)*self.speed
return distance
def read_file(filename):
file = open(filename, 'r')
while True:
line = file.readline()
if not line:
break
yield line
def main():
time = 2503
reindeers = dict()
distance = dict()
for line in read_file('input'):
match = re.search(RE_SPEED_INFO, line)
if not match:
print "wrong operation syntax"
reindeers[match.group(1)] = Reindeer(match.group(1))
reindeers[match.group(1)].speed = int(match.group(2))
reindeers[match.group(1)].speedTime = int(match.group(3))
reindeers[match.group(1)].restTime = int(match.group(4))
distance[match.group(1)] = 0
for t in range(2503):
maxDistance = 0
for r,v in reindeers.iteritems():
distance[r] = v.calculateDistance(t+1)
maxDistance = max(maxDistance, distance[r])
for r,v in distance.iteritems():
if v == maxDistance:
reindeers[r].addPoint()
for r,v in reindeers.iteritems():
print "%010d %s" % (v.points, r)
if __name__ == "__main__":
main()