Day 14: Reindeer Olympics

Day 14.1


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

Test


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()

Solution


In [84]:
reindeer = parse('inputs/input14.txt')
winner(2503)


Out[84]:
(2660, ['Vixen'])

Day 14.2


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]]

Test


In [94]:
reindeer = parse('inputs/input14.test1.txt')
new_score(1000)


Out[94]:
[('Dancer', 689)]

Solution


In [95]:
reindeer = parse('inputs/input14.txt')
print(new_score(2503))


[('Blitzen', 1256)]