33
44def parse (protocol ):
55 top , bottom = protocol .split ("\n \n " )
6- ordering_rules = defaultdict (list )
6+ ordering_rules = defaultdict (set )
77 for line in top .splitlines ():
88 key , value = map (int , line .split ("|" ))
9- ordering_rules [key ].append (value )
9+ ordering_rules [key ].add (value )
1010 updates = [list (map (int , line .split ("," ))) for line in bottom .splitlines ()]
1111 return ordering_rules , updates
1212
1313
1414def in_right_order (update , ordering_rules ):
1515 for i in range (len (update )):
1616 number , * rest = update [i :]
17- if not set (rest ).issubset (set ( ordering_rules [number ]) ):
17+ if not set (rest ).issubset (ordering_rules [number ]):
1818 return False
1919 return True
2020
2121
22+ def order (update , ordering_rules ):
23+ print (update )
24+ for n in update :
25+ print (n , ordering_rules [n ])
26+ return sorted (update , key = lambda n : len (ordering_rules [n ]), reverse = True )
27+
28+
2229def middle_page_number (protocol , part = 1 ):
2330 total = 0
2431 ordering_rules , updates = parse (protocol )
@@ -28,7 +35,9 @@ def middle_page_number(protocol, part=1):
2835 idx = len (update ) // 2
2936 total += update [idx ]
3037 if not is_in_right_order and part == 2 :
31- pass
38+ new_update = order (update , ordering_rules )
39+ idx = len (new_update ) // 2
40+ total += new_update [idx ]
3241 return total
3342
3443
@@ -71,3 +80,7 @@ def main(part: int = 1) -> int:
7180 assert middle_page_number (protocol ) == 143
7281
7382 print (main ())
83+
84+ assert middle_page_number (protocol , part = 2 ) == 123
85+
86+ print (main (part = 2 ))
0 commit comments