Day 14 - Advent of Code 2015

Working solutions for the day 14 puzzles.

Part One

""" day_14_01.py """

# usage: python3 day_14_01.py < input

import sys


def distance(vitals, elapsed):
    """ calculate distance at elapsed time using vitals """
    speed, sprint, rest = vitals
    cycles, partial = divmod(elapsed, sprint + rest)
    return speed * (cycles * sprint + min(partial, sprint))


greatest_distance = 0
for row in sys.stdin.read().splitlines():
    items = row.split()
    stats = [int(items[i]) for i in (3, 6, 13)]
    greatest_distance = max(greatest_distance, distance(stats, 2503))
print(greatest_distance)

Part Two

""" day_14_02.py """

# usage: python3 day_14_02.py < input

import sys


def distance(vitals, elapsed):
    """ calculate distance at elapsed time using vitals """
    speed, sprint, rest = vitals
    cycles, partial = divmod(elapsed, sprint + rest)
    return speed * (cycles * sprint + min(partial, sprint))


reindeer = {}
for row in sys.stdin.read().splitlines():
    items = row.split()
    reindeer[items[0]] = [int(items[i]) for i in (3, 6, 13)]

points = {deer: 0 for deer in reindeer}
for i in range(2503):
    positions = [(distance(stats, i + 1), deer)
                 for deer, stats in reindeer.items()]
    leading = max(positions)[0]
    for pos, deer in positions:
        if pos == leading:
            points[deer] += 1
print(max(points.values()))