Skip to content

Commit e53b9c1

Browse files
committed
Solve Codysii problem 18 (rough)
1 parent 11b7ae3 commit e53b9c1

1 file changed

Lines changed: 71 additions & 0 deletions

File tree

codyssi/problem18.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
"""Codyssi Day N."""
2+
3+
import functools
4+
import logging
5+
6+
log = logging.info
7+
8+
def solve(part: int, data: str, testing: bool) -> int:
9+
"""Solve the parts."""
10+
lines = data.splitlines()
11+
items = []
12+
byname = {}
13+
for line in lines:
14+
for p in ["| Quality :", ", Cost :", ", Unique Materials :"]:
15+
line = line.replace(p, "")
16+
num, name, quality, cost, materials = line.split()
17+
items.append((int(quality), int(cost), name, int(materials)))
18+
byname[name] = (int(cost), int(quality), int(materials))
19+
20+
items.sort(reverse=True)
21+
22+
@functools.cache
23+
def optimal_production(items, budget):
24+
available = sorted((i for i in items if byname[i][0] <= budget), key=lambda i: byname[i][0])
25+
if not available:
26+
return 0, 0
27+
one, *rest = available
28+
f_rest = frozenset(rest)
29+
q_with, m_with = optimal_production(f_rest, budget - byname[one][0])
30+
q_with += byname[one][1]
31+
m_with += byname[one][2]
32+
q_wout, m_wout = optimal_production(f_rest, budget)
33+
if q_wout > q_with:
34+
return q_wout, m_wout
35+
if q_with > q_wout:
36+
return q_with, m_with
37+
return q_with, min(m_with, m_wout)
38+
39+
if part == 1:
40+
return sum(i[-1] for i in items[:5])
41+
if part == 2:
42+
budget = 30
43+
elif testing:
44+
budget = 150
45+
else:
46+
budget = 300
47+
q, m = optimal_production(frozenset(byname), budget)
48+
return q * m
49+
50+
51+
TEST_DATA = """\
52+
1 ETdhCGi | Quality : 36, Cost : 25, Unique Materials : 7
53+
2 GWgcpkv | Quality : 38, Cost : 17, Unique Materials : 25
54+
3 ODVdJYM | Quality : 1, Cost : 1, Unique Materials : 26
55+
4 wTdbhEr | Quality : 23, Cost : 10, Unique Materials : 18
56+
5 hoOYtHQ | Quality : 25, Cost : 15, Unique Materials : 27
57+
6 jxRouXI | Quality : 31, Cost : 17, Unique Materials : 7
58+
7 dOXpCyA | Quality : 23, Cost : 2, Unique Materials : 28
59+
8 LtCtwHO | Quality : 37, Cost : 26, Unique Materials : 29
60+
9 DLxTAif | Quality : 32, Cost : 24, Unique Materials : 1
61+
10 XCUJAZF | Quality : 22, Cost : 25, Unique Materials : 29
62+
11 cwoqgJA | Quality : 38, Cost : 28, Unique Materials : 7
63+
12 ROPdFSh | Quality : 41, Cost : 29, Unique Materials : 15
64+
13 iYypXES | Quality : 37, Cost : 12, Unique Materials : 15
65+
14 srwmKYA | Quality : 48, Cost : 25, Unique Materials : 14
66+
15 xRbzjOM | Quality : 36, Cost : 20, Unique Materials : 21"""
67+
TESTS = [
68+
(1, TEST_DATA, 90),
69+
(2, TEST_DATA, 8256),
70+
(3, TEST_DATA, 59388),
71+
]

0 commit comments

Comments
 (0)