@@ -18,52 +18,34 @@ func do(fileName string) (int, int) {
1818 defer file .Close ()
1919 scanner := bufio .NewScanner (file )
2020
21- memory := make (map [int ]uint64 , 100 )
22- mask1 := 0
23- mask2 := 0
21+ memory := make (map [int ]uint64 )
22+ mask1 , mask2 := 0 , 0
2423 for scanner .Scan () {
2524 l := scanner .Text ()
2625
2726 tok := strings .Split (l , " " )
28- mask := ""
29- sp := 0
30- dst := 0
27+ mask , sp , dst := "" , 0 , 0
3128
32- if len (tok ) < 2 {
33- continue
34- }
3529 if tok [0 ] == "mask" {
36- mask = tok [2 ]
30+ mask , mask1 , mask2 = tok [2 ], 0 , 0
3731 // log.Println("mask", mask)
38- mask1 = 0
39- mask2 = 0
4032 for _ , v := range mask {
33+ mask1 <<= 1
34+ mask2 <<= 1
4135 switch v {
4236 case 'X' :
43- mask1 <<= 1
44- mask2 <<= 1
4537 mask2 |= 1
4638 case '1' :
47- mask1 <<= 1
48- mask2 <<= 1
4939 mask1 |= 1
50- case '0' :
51- mask1 <<= 1
52- mask2 <<= 1
5340 }
5441 }
55- // log.Println("masks ", mask1, mask2)
5642 } else {
5743 fmt .Sscanf (tok [0 ], "mem[%d]" , & sp )
5844 fmt .Sscanf (tok [2 ], "%d" , & dst )
59- // log.Println(sp, dst)
6045 val := (dst & mask2 ) | mask1
6146 memory [sp ] = uint64 (val )
62- // log.Println(val)
6347 }
64- // fmt.Sscanf(l, "%s %d", &opcode.Op, &opcode.Arg)
6548 }
66- // log.Println(memory)
6749
6850 for _ , v := range memory {
6951 ret1 += int (v )
@@ -81,83 +63,53 @@ func do2(fileName string) (int, int) {
8163 defer file .Close ()
8264 scanner := bufio .NewScanner (file )
8365
84- memory := make (map [int ]uint64 , 100 )
66+ memory := make (map [int ]uint64 )
8567 masks1 := make ([]int , 0 )
8668 masks2 := make ([]int , 0 )
8769 // masks3 := make([]int, 0)
8870 for scanner .Scan () {
8971 l := scanner .Text ()
9072
9173 tok := strings .Split (l , " " )
92- mask := ""
93- sp := 0
94- dst := 0
95-
96- if len (tok ) < 2 {
97- continue
98- }
74+ mask , sp , dst := "" , 0 , 0
9975 if tok [0 ] == "mask" {
10076 mask = tok [2 ]
101- // log.Println("mask", mask)
10277 masks1 = make ([]int , 1 )
10378 masks2 = make ([]int , 1 )
104- // masks3 = make([]int, 1)
10579
106- for k , v := range mask {
80+ for _ , v := range mask {
81+ for k := range masks1 {
82+ masks1 [k ] <<= 1
83+ masks2 [k ] <<= 1
84+ }
10785 switch v {
10886 case 'X' :
109- for k := range masks1 {
110- masks1 [k ] <<= 1
111- masks2 [k ] <<= 1
112- // masks2[k] |= 1
113- }
11487 masks1 = append (masks1 , masks1 ... )
11588 masks2 = append (masks2 , masks2 ... )
11689
117- for k = len ( masks1 ) / 2 ; k < len (masks1 ); k ++ {
90+ for k := 0 ; k < len (masks1 )/ 2 ; k ++ {
11891 masks1 [k ] |= 1
119- // masks2[k] &= 1
12092 }
121- // for k = 0; k < len(masks1)/2; k++ {
122- // // masks2[k] |= 1
123- // }
12493 case '1' :
12594 for k := range masks1 {
126- masks1 [k ] <<= 1
127- masks2 [k ] <<= 1
12895 masks1 [k ] |= 1
12996 }
13097 case '0' :
13198 for k := range masks1 {
132- masks1 [k ] <<= 1
133- masks2 [k ] <<= 1
13499 masks2 [k ] |= 1
135100 }
136101 }
137102 }
138- // for k := range masks1 {
139- // log.Printf("mask %b %b\n", masks1[k]+1024, masks2[k]+1024)
140- // }
141- // log.Println("masks ", masks1, masks2)
142103 } else {
143104 fmt .Sscanf (tok [0 ], "mem[%d]" , & sp )
144105 fmt .Sscanf (tok [2 ], "%d" , & dst )
145- // log.Println(sp, dst)
146- // val := (sp & mask2) | mask1
147- val := dst
148106
149- // log.Println("sp is ", sp)
150- // oldsp :=
151107 for k := range masks1 {
152108 sp2 := (sp & masks2 [k ]) | masks1 [k ]
153- // log.Printf("sp %d %b %b\n", sp2, masks2[k], masks1[k])
154- memory [sp2 ] = uint64 (val )
109+ memory [sp2 ] = uint64 (dst )
155110 }
156- // log.Println(val)
157111 }
158- // fmt.Sscanf(l, "%s %d", &opcode.Op, &opcode.Arg)
159112 }
160- // log.Println(memory)
161113
162114 for _ , v := range memory {
163115 ret1 += int (v )
0 commit comments