Solve 2015:15 "Science for Hungry People"

This commit is contained in:
Anders Englöf Ytterström 2023-10-26 20:19:52 +02:00
parent cfd2c0f079
commit fb5a1b9381
2 changed files with 80 additions and 0 deletions

View file

@ -0,0 +1,50 @@
from itertools import permutations
from math import prod
from re import compile, findall
from solutions import BaseSolution
class Solution(BaseSolution):
input_file = "15.txt"
def __str__(self):
return "Day 15: Science for Hungry People"
def parse_input(self, data):
digits = compile(r"-?\d+")
return [
tuple(map(int, findall(digits, line))) for line in data.strip().splitlines()
]
def solve(self, puzzle_input):
scores = []
factors = list(zip(*puzzle_input))[:-1]
distributions = filter(
lambda x: sum(x) == 100, permutations(range(1, 100), len(factors[0]))
)
for distribution in distributions:
total = [sum(map(prod, zip(f, distribution))) for f in factors]
if all(map(lambda x: x > 0, total)):
scores.append(prod(total))
return max(scores)
def solve_again(self, puzzle_input):
scores = []
factors = list(zip(*puzzle_input))
props = factors[:-1]
calories = factors[-1]
distributions = filter(
lambda x: sum(x) == 100, permutations(range(1, 100), len(factors[0]))
)
for distribution in distributions:
calcount = sum(map(prod, zip(calories, distribution)))
if calcount == 500:
total = [sum(map(prod, zip(f, distribution))) for f in props]
if all(map(lambda x: x > 0, total)):
scores.append(prod(total))
return max(scores)
if __name__ == "__main__":
solution = Solution()
solution.show_results()

View file

@ -0,0 +1,30 @@
import unittest
from solutions.day_15 import Solution
class Day15TestCase(unittest.TestCase):
def setUp(self):
self.solution = Solution()
self.puzzle_input = self.solution.parse_input(
"""
Butterscotch: capacity -1, durability -2, flavor 6, texture 3, calories 8
Cinnamon: capacity 2, durability 3, flavor -2, texture -1, calories 3
"""
)
def test_parse_puzzle_input(self):
data = """
Butterscotch: capacity -1, durability -2, flavor 6, texture 3, calories 8
"""
assert self.solution.parse_input(data) == [(-1, -2, 6, 3, 8)]
def test_solve_first_part(self):
assert self.solution.solve(self.puzzle_input) == 62842880
def test_solve_second_part(self):
assert self.solution.solve_again(self.puzzle_input) == 57600000
if __name__ == "__main__":
unittest.main()