In [57]:
import csv
from collections import defaultdict
def parse(input_path):
reindeer = defaultdict(lambda: defaultdict(int))
with open(input_path, 'rt') as f_input:
csv_reader = csv.reader(f_input, delimiter=' ')
for line in csv_reader:
reindeer[line[0]]['speed'] = int(line[3])
reindeer[line[0]]['flytime'] = int(line[6])
reindeer[line[0]]['resttime'] = int(line[-2])
return reindeer
In [81]:
def span(speed, flytime, resttime, time):
t = flytime + resttime
n = time // t
r = time % t
if r <= flytime:
return speed * flytime * n + speed * r
else:
n += 1
return speed * flytime * n
def reindeer_span(name, time):
speed = reindeer[name]['speed']
flytime = reindeer[name]['flytime']
resttime = reindeer[name]['resttime']
return span(speed, flytime, resttime, time)
def winner(time):
max_distance = 0
score = dict(zip(list(reindeer.keys()), [0] * len(reindeer)))
for name in reindeer:
score[name] = reindeer_span(name, time)
l = sorted(list(score.items()), key=lambda x: x[1], reverse=True)
reindeer_winners = [l[0][0]] + [c[0] for c in l[1:] if (c[1] == l[0][1])]
return l[0][1], reindeer_winners
In [83]:
reindeer = parse('inputs/input14.test1.txt')
def test_span():
assert(reindeer_span('Comet', 1000) == 1120)
assert(reindeer_span('Dancer', 1000) == 1056)
def test_winner():
assert(winner(1000) == (1120, ['Comet']))
test_span()
test_winner()
In [84]:
reindeer = parse('inputs/input14.txt')
winner(2503)
Out[84]:
In [93]:
def new_score(time):
score = dict(zip(list(reindeer.keys()), [0] * len(reindeer)))
for i in range(time):
max_distance, reindeer_winners = winner(i + 1)
for name in reindeer_winners:
score[name] += 1
l = sorted(list(score.items()), key=lambda x: x[1], reverse=True)
return [l[0]] + [c for c in l[1:] if c[1] == l[0][0]]
In [94]:
reindeer = parse('inputs/input14.test1.txt')
new_score(1000)
Out[94]:
In [95]:
reindeer = parse('inputs/input14.txt')
print(new_score(2503))