@@ -17,6 +17,39 @@ struct Rule {
17
17
op : Op ,
18
18
}
19
19
20
+ fn part1 ( rules : & HashMap < String , Rule > , values : & mut HashMap < String , bool > ) {
21
+ let mut todo = rules. clone ( ) ;
22
+
23
+ while !todo. is_empty ( ) {
24
+ let dup = todo. clone ( ) ;
25
+ let ( k, r) = dup
26
+ . into_iter ( )
27
+ . filter ( |( _, v) | values. contains_key ( & v. a ) && values. contains_key ( & v. b ) )
28
+ . next ( )
29
+ . unwrap ( ) ;
30
+ todo. remove ( & k) ;
31
+ values. insert (
32
+ k,
33
+ match r. op {
34
+ Op :: AND => * values. get ( & r. a ) . unwrap ( ) && * values. get ( & r. b ) . unwrap ( ) ,
35
+ Op :: OR => * values. get ( & r. a ) . unwrap ( ) || * values. get ( & r. b ) . unwrap ( ) ,
36
+ Op :: XOR => * values. get ( & r. a ) . unwrap ( ) != * values. get ( & r. b ) . unwrap ( ) ,
37
+ } ,
38
+ ) ;
39
+ }
40
+
41
+ let mut i = 0u32 ;
42
+ let mut res = 0i64 ;
43
+ while let Some ( ( _, v) ) = values. get_key_value ( & format ! ( "z{:02}" , i) ) {
44
+ if * v {
45
+ res += 2i64 . pow ( i) ;
46
+ }
47
+ i += 1 ;
48
+ }
49
+
50
+ println ! ( "Part 1: {}" , res) ;
51
+ }
52
+
20
53
fn main ( ) {
21
54
let start = Instant :: now ( ) ;
22
55
let mut input = AocInput :: new ( "inputs/day24.txt" ) ;
@@ -40,39 +73,14 @@ fn main() {
40
73
"AND" => Op :: AND ,
41
74
"OR" => Op :: OR ,
42
75
"XOR" => Op :: XOR ,
43
- _ => panic ! ( "Unknown operation" )
76
+ _ => panic ! ( "Unknown operation" ) ,
44
77
} ;
45
78
rules. insert ( out, Rule { a, b, op } ) ;
46
79
}
47
80
}
48
81
49
- let mut todo = rules. clone ( ) ;
50
-
51
- while !todo. is_empty ( ) {
52
- let dup = todo. clone ( ) ;
53
- let ( k, r) = dup. into_iter ( ) . filter (
54
- |( _, v) | values. contains_key ( & v. a ) && values. contains_key ( & v. b )
55
- ) . next ( ) . unwrap ( ) ;
56
- todo. remove ( & k) ;
57
- values. insert ( k, match r. op {
58
- Op :: AND => * values. get ( & r. a ) . unwrap ( ) && * values. get ( & r. b ) . unwrap ( ) ,
59
- Op :: OR => * values. get ( & r. a ) . unwrap ( ) || * values. get ( & r. b ) . unwrap ( ) ,
60
- Op :: XOR => * values. get ( & r. a ) . unwrap ( ) != * values. get ( & r. b ) . unwrap ( )
61
- } ) ;
62
- }
63
-
64
- let mut i = 0u32 ;
65
- let mut res = 0i64 ;
66
- while let Some ( ( _, v) ) = values. get_key_value ( & format ! ( "z{:02}" , i) ) {
67
- if * v {
68
- res += 2i64 . pow ( i) ;
69
- }
70
- i += 1 ;
71
- }
72
-
73
- println ! ( "Part 1: {}" , res) ;
74
-
75
-
82
+ part1 ( & rules, & mut values) ;
83
+
76
84
let duration = start. elapsed ( ) ;
77
85
println ! ( "Time: {:?}" , duration) ;
78
86
}
0 commit comments