diff --git a/2015/day13/solution.py b/2015/day13/solution.py index 400812e..c2ee8f2 100644 --- a/2015/day13/solution.py +++ b/2015/day13/solution.py @@ -75,6 +75,6 @@ if __name__ == '__main__': puzzle_input += open("self_input.txt", "r").read().splitlines() converted_input = load_puzzle_input(puzzle_input) - print(converted_input) - print("Part2: ", get_perfect_seating(converted_input)) - print("solution: ", ) + print("Part2: ") + print("solution: ", get_perfect_seating(converted_input)) + diff --git a/2015/day14/input.txt b/2015/day14/input.txt new file mode 100644 index 0000000..d02f15d --- /dev/null +++ b/2015/day14/input.txt @@ -0,0 +1,9 @@ +Vixen can fly 19 km/s for 7 seconds, but then must rest for 124 seconds. +Rudolph can fly 3 km/s for 15 seconds, but then must rest for 28 seconds. +Donner can fly 19 km/s for 9 seconds, but then must rest for 164 seconds. +Blitzen can fly 19 km/s for 9 seconds, but then must rest for 158 seconds. +Comet can fly 13 km/s for 7 seconds, but then must rest for 82 seconds. +Cupid can fly 25 km/s for 6 seconds, but then must rest for 145 seconds. +Dasher can fly 14 km/s for 3 seconds, but then must rest for 38 seconds. +Dancer can fly 3 km/s for 16 seconds, but then must rest for 37 seconds. +Prancer can fly 25 km/s for 6 seconds, but then must rest for 143 seconds. \ No newline at end of file diff --git a/2015/day14/problem.txt b/2015/day14/problem.txt new file mode 100644 index 0000000..e69de29 diff --git a/2015/day14/solution.py b/2015/day14/solution.py new file mode 100644 index 0000000..bfac4de --- /dev/null +++ b/2015/day14/solution.py @@ -0,0 +1,75 @@ +class Reindeer: + def __init__(self, name: str, speed: int, sprint_duration: int, rest_duration: int) -> None: + self.name = name + self.speed = speed + self.sprint_duration = sprint_duration + self.rest_duration = rest_duration + self.currently_sprinting = True + self.current_duration = sprint_duration + self.distance = 0 + + def step(self) -> None: + if self.currently_sprinting and self.current_duration >= 1: + self.current_duration -= 1 + self.distance += self.speed + elif not self.currently_sprinting and self.current_duration >= 1: + self.current_duration -= 1 + else: + self.currently_sprinting = not self.currently_sprinting + if self.currently_sprinting: + self.current_duration = self.sprint_duration + else: + self.current_duration = self.rest_duration + self.step() + + def get_distance(self) -> int: + return self.distance + + +class Race: + def __init__(self): + self.reindeers = [] + + def load_reindeers(self, reindeers: list) -> None: + for reindeer in reindeers: + name, rest = reindeer.split(" can fly ") + speed, rest = rest.split(" km/s for ") + sprint_duration, rest = rest.split(" seconds, but then must rest for ") + rest_duration = rest.split(" ")[0] + + speed = int(speed) + sprint_duration = int(sprint_duration) + rest_duration = int(rest_duration) + + self.reindeers.append(Reindeer(name, speed, sprint_duration, rest_duration)) + + def run_race(self, ticks) -> int: + for i in range(ticks): + for reindeer in self.reindeers: + reindeer.step() + + max_distance = 0 + for reindeer in self.reindeers: + distance = reindeer.get_distance() + if distance > max_distance: + max_distance = distance + return max_distance + + +if __name__ == '__main__': + test_input = [ + "Comet can fly 14 km/s for 10 seconds, but then must rest for 127 seconds.", + "Dancer can fly 16 km/s for 11 seconds, but then must rest for 162 seconds." + ] + test_race = Race() + test_race.load_reindeers(test_input) + assert test_race.run_race(1000) == 1120, "Error, Example couldn't compute" + print("All test passed") + + puzzle_input = open("input.txt", "r").read().splitlines() + race = Race() + race.load_reindeers(puzzle_input) + print("solution: ", race.run_race(2503)) + + print("Part2: ") + print("solution: ", )