@@ -22,41 +22,31 @@ def solve_part1(diagram, buttons):
2222 for i , ch in enumerate (lights )
2323 )
2424 q .append ((n + 1 , new_lights ))
25-
2625
27- # Part 1
28- ans = 0
29- for line in inp :
30- diagram , * buttons , reqs = line .split (" " )
31- diagram = diagram [1 :- 1 ]
32- buttons = [set (map (int , re .findall (r"\d+" , bs ))) for bs in buttons ]
33- ans += solve_part1 (diagram , buttons )
3426
35- print (ans )
36-
37- # Part 2
3827def solve_part2 (reqs , buttons ):
39- buttons_vecs = [tuple (1 if i in bs else 0 for i in range (len (reqs ))) for bs in buttons ]
28+ buttons = [tuple (1 if i in bs else 0 for i in range (len (reqs ))) for bs in buttons ]
4029 ns = [Int (f"n{ i } " ) for i in range (len (buttons ))]
4130 opt = Optimize ()
4231 for n in ns :
4332 opt .add (n >= 0 )
44- for i in range (len (reqs )):
45- eq = sum (button [i ]* ns [j ] for j , button in enumerate (buttons_vecs ))
46- opt .add (eq == reqs [i ])
47-
33+ for i , req in enumerate (reqs ):
34+ opt .add (sum (button [i ]* ns [j ] for j , button in enumerate (buttons )) == req )
4835 opt .minimize (sum (ns ))
4936 opt .check ()
5037 model = opt .model ()
5138 return sum ([model [n ].as_long () for n in ns ])
52-
5339
54- ans = 0
40+
41+ # Part 1 and 2
42+ ans_pt1 = ans_pt2 = 0
5543for line in inp :
5644 diagram , * buttons , reqs = line .split (" " )
5745 diagram = diagram [1 :- 1 ]
5846 buttons = [set (map (int , re .findall (r"\d+" , bs ))) for bs in buttons ]
5947 reqs = tuple (map (int , re .findall (r"\d+" , reqs )))
60- ans += solve_part2 (reqs , buttons )
48+ ans_pt1 += solve_part1 (diagram , buttons )
49+ ans_pt2 += solve_part2 (reqs , buttons )
6150
62- print (ans )
51+ print (ans_pt1 )
52+ print (ans_pt2 )
0 commit comments