@@ -23,67 +23,47 @@ struct Computer {
2323 }
2424
2525 mutating func executeOp( _ ops: Int , _ operand: Int , combo comboOp: Int , pointer: Int ) -> Int {
26- var p = pointer
2726 func div( _ num: Int , _ denomShift: Int ) -> Int {
2827 let denom = 1 << denomShift
2928 if denom > num || denomShift > num {
3029 return 0
3130 }
32- if denom == 0 {
33- print ( " division by zero " )
34- print ( " denomShift " , denomShift)
35- }
3631 return num / denom
3732 }
3833
3934 switch ops {
4035 case 0 :
4136 // adv
42- let res = div ( comboOp, registers. A)
43- print ( " adv " , res)
44- registers. A = res
45- p += 2
37+ registers. A = div ( registers. A, comboOp)
4638 case 1 :
4739 // bxl
4840 let res = registers. B ^ operand
49- print ( " bxl " , res)
5041 registers. B = res
51- p += 2
5242 case 2 :
5343 //bst
5444 let res = comboOp % 8
55- print ( " bst " , operand, res)
5645 registers. B = res
57- p += 2
5846 case 3 :
5947 // jnz
6048 if registers. A != 0 {
61- // jump by the value of the operand
62- p += comboOp
63- } else {
64- // simple increase
65- p += 2
49+ // set the pointer to the value of the operand
50+ return operand
6651 }
6752 case 4 :
6853 // bxc
6954 registers. B ^= registers. C
70- // do nothing with operand
71- p += 2
7255 case 5 :
7356 // out
7457 output. append ( comboOp % 8 )
75- p += 2
7658 case 6 :
7759 // bdv
78- registers. B = div ( comboOp, registers. A)
79- p += 2
60+ registers. B = div ( registers. A, comboOp)
8061 case 7 :
8162 // cdv
82- registers. C = div ( comboOp, registers. A)
83- p += 2
63+ registers. C = div ( registers. A, comboOp)
8464 default : break
8565 }
86- return p
66+ return pointer + 2
8767 }
8868
8969 mutating func execute( ) -> String {
@@ -104,7 +84,7 @@ struct Day17: AdventDay {
10484 var data : String
10585
10686 func initialize( ) -> ( instructions: [ Int ] , registers: Registers ) {
107- let parts = data. split ( separator: " \n \n " )
87+ let parts = data. trimmed ( ) . split ( separator: " \n \n " )
10888 let instructions = parts [ 1 ] . trimmingPrefix ( " Program: " ) . integers ( separator: " , " )
10989 var registers = Registers ( )
11090 if let match = parts [ 0 ] . firstMatch (
@@ -120,6 +100,7 @@ struct Day17: AdventDay {
120100 func part1( ) -> String {
121101 let ( instructions, registers) = initialize ( )
122102 var computer = Computer ( instructions: instructions, registers: registers)
103+
123104 return computer. execute ( )
124105 }
125106
0 commit comments