1
+ from functools import lru_cache , partial
2
+ from typing import List
3
+
4
+
5
+ @lru_cache (None )
6
+ def count_eval (form : str , result : bool ):
7
+ if len (form ) == 1 :
8
+ literal = int (form )
9
+ return 1 if bool (literal ) == result else 0
10
+
11
+ ways = 0
12
+ for i in range (0 , len (form )- 1 , 2 ):
13
+ current_op = form [i + 1 ]
14
+ left_side = partial (count_eval , form [:i + 1 ])
15
+ right_side = partial (count_eval , form [i + 2 :])
16
+
17
+ if current_op == "&" :
18
+ if result == True :
19
+ ways += left_side (True ) * right_side (True )
20
+ else :
21
+ ways += left_side (False ) * right_side (True ) \
22
+ + left_side (True ) * right_side (False ) \
23
+ + left_side (False ) * right_side (False )
24
+ elif current_op == "^" :
25
+ if result == False :
26
+ ways += left_side (False ) * right_side (False ) \
27
+ + left_side (True ) * right_side (True )
28
+ else :
29
+ ways += left_side (True ) * right_side (False ) \
30
+ + left_side (False ) * right_side (True )
31
+ elif current_op == "|" :
32
+ if result == False :
33
+ ways += left_side (False ) * right_side (False )
34
+ else :
35
+ ways += left_side (True ) * right_side (True ) \
36
+ + left_side (False ) * right_side (True ) \
37
+ + left_side (True ) * right_side (False )
38
+
39
+ # print(f"Looking to package {form} for {result}, ways for this {ways}")
40
+ return ways
41
+
42
+ if __name__ == "__main__" :
43
+ exs = [
44
+ ("1^0" , True ),
45
+ ("1^0|0|1" , False ),
46
+ ("0&0&0&1^1|0" , True )
47
+ ]
48
+
49
+ for formula , target in exs :
50
+ print (f"Ways to partition { formula } for { target } are { count_eval (formula , target )} " )
0 commit comments