3
3
4
4
def parse (protocol ):
5
5
top , bottom = protocol .split ("\n \n " )
6
- ordering_rules = defaultdict (list )
6
+ ordering_rules = defaultdict (set )
7
7
for line in top .splitlines ():
8
8
key , value = map (int , line .split ("|" ))
9
- ordering_rules [key ].append (value )
9
+ ordering_rules [key ].add (value )
10
10
updates = [list (map (int , line .split ("," ))) for line in bottom .splitlines ()]
11
11
return ordering_rules , updates
12
12
13
13
14
14
def in_right_order (update , ordering_rules ):
15
15
for i in range (len (update )):
16
16
number , * rest = update [i :]
17
- if not set (rest ).issubset (set ( ordering_rules [number ]) ):
17
+ if not set (rest ).issubset (ordering_rules [number ]):
18
18
return False
19
19
return True
20
20
21
21
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
+
22
29
def middle_page_number (protocol , part = 1 ):
23
30
total = 0
24
31
ordering_rules , updates = parse (protocol )
@@ -28,7 +35,9 @@ def middle_page_number(protocol, part=1):
28
35
idx = len (update ) // 2
29
36
total += update [idx ]
30
37
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 ]
32
41
return total
33
42
34
43
@@ -71,3 +80,7 @@ def main(part: int = 1) -> int:
71
80
assert middle_page_number (protocol ) == 143
72
81
73
82
print (main ())
83
+
84
+ assert middle_page_number (protocol , part = 2 ) == 123
85
+
86
+ print (main (part = 2 ))
0 commit comments