1
1
use anyhow:: Result ;
2
+ use hashbrown:: HashMap ;
2
3
use libaoc:: { aoc, AocResult , Timer } ;
3
4
use regex:: Regex ;
4
- use hashbrown:: HashMap ;
5
5
6
6
#[ derive( Debug ) ]
7
7
enum Command {
@@ -15,25 +15,28 @@ pub fn solve(timer: &mut Timer, input: String) -> Result<AocResult> {
15
15
let mem_reg = Regex :: new ( r"mem\[(\d+)\] = (\d+)" ) ?;
16
16
let mask_reg = Regex :: new ( r"mask = ([X01]+)" ) ?;
17
17
18
- let lines: Vec < _ > = input. lines ( ) . map ( |x| {
19
- if let Some ( cap) = mem_reg. captures ( x) {
20
- Mem ( cap[ 1 ] . parse ( ) . unwrap ( ) , cap[ 2 ] . parse ( ) . unwrap ( ) )
21
- } else {
22
- let cap = mask_reg. captures ( x) . unwrap ( ) ;
23
- let mut zero_mask = 0 ;
24
- let mut one_mask = 0 ;
25
- let mut x_mask = vec ! [ ] ;
26
- for ( i, c) in cap[ 1 ] . chars ( ) . rev ( ) . enumerate ( ) {
27
- match c {
28
- '0' => zero_mask |= 1 << i,
29
- '1' => one_mask |= 1 << i,
30
- 'X' => x_mask. push ( i) ,
31
- _ => ( )
18
+ let lines: Vec < _ > = input
19
+ . lines ( )
20
+ . map ( |x| {
21
+ if let Some ( cap) = mem_reg. captures ( x) {
22
+ Mem ( cap[ 1 ] . parse ( ) . unwrap ( ) , cap[ 2 ] . parse ( ) . unwrap ( ) )
23
+ } else {
24
+ let cap = mask_reg. captures ( x) . unwrap ( ) ;
25
+ let mut zero_mask = 0 ;
26
+ let mut one_mask = 0 ;
27
+ let mut x_mask = vec ! [ ] ;
28
+ for ( i, c) in cap[ 1 ] . chars ( ) . rev ( ) . enumerate ( ) {
29
+ match c {
30
+ '0' => zero_mask |= 1 << i,
31
+ '1' => one_mask |= 1 << i,
32
+ 'X' => x_mask. push ( i) ,
33
+ _ => ( ) ,
34
+ }
32
35
}
36
+ Mask ( !zero_mask, one_mask, x_mask)
33
37
}
34
- Mask ( !zero_mask, one_mask, x_mask)
35
- }
36
- } ) . collect ( ) ;
38
+ } )
39
+ . collect ( ) ;
37
40
38
41
timer. lap ( "Parse" ) ;
39
42
@@ -42,12 +45,12 @@ pub fn solve(timer: &mut Timer, input: String) -> Result<AocResult> {
42
45
let mut mem = HashMap :: new ( ) ;
43
46
for line in & lines {
44
47
match line {
45
- Mask ( a, b , _) => {
48
+ Mask ( a, b , _) => {
46
49
zero_mask = * a;
47
50
one_mask = * b;
48
51
}
49
- Mem ( a, b) => {
50
- mem. insert ( a, ( b| one_mask) & zero_mask) ;
52
+ Mem ( a, b) => {
53
+ mem. insert ( a, ( b | one_mask) & zero_mask) ;
51
54
}
52
55
}
53
56
}
@@ -60,7 +63,7 @@ pub fn solve(timer: &mut Timer, input: String) -> Result<AocResult> {
60
63
let mut mem = HashMap :: new ( ) ;
61
64
for line in & lines {
62
65
match line {
63
- Mask ( _, b , c) => {
66
+ Mask ( _, b , c) => {
64
67
one_mask = * b;
65
68
x_mask = c;
66
69
}
@@ -70,7 +73,7 @@ pub fn solve(timer: &mut Timer, input: String) -> Result<AocResult> {
70
73
let mut addr = addr;
71
74
for ( i, addr_index) in x_mask. iter ( ) . enumerate ( ) {
72
75
if ( curr_change & ( 1 << i) ) != 0 {
73
- addr &= !( 1 << addr_index) ;
76
+ addr &= !( 1 << addr_index) ;
74
77
} else {
75
78
addr |= 1 << addr_index;
76
79
}
0 commit comments