@@ -12,33 +12,33 @@ const POSITION_MODE = '0';
12
12
const IMMEDIATE_MODE = '1' ;
13
13
14
14
class Computer {
15
- constructor ( input , input_value = 1 ) {
16
- this . original_input = input . slice ( 0 ) ;
17
- this . input = input . slice ( 0 ) ;
15
+ constructor ( memory , inputs , clone_memory = false ) {
16
+ this . original_memory = clone_memory && memory . slice ( 0 ) ;
17
+ this . memory = memory . slice ( 0 ) ;
18
18
this . pointer = 0 ;
19
19
20
- this . input_value = input_value ;
21
- this . output_value = null ;
20
+ this . inputs = Array . isArray ( inputs ) ? inputs . slice ( 0 ) : [ inputs ] ;
21
+ this . outputs = [ ] ;
22
22
23
23
this . OPS = {
24
24
[ ADD ] : {
25
25
name : ADD ,
26
26
params : 3 ,
27
- fn : ( a , b , c ) => ( this . input [ c ] = a + b ) ,
27
+ fn : ( a , b , c ) => ( this . memory [ c ] = a + b ) ,
28
28
write : true ,
29
29
} ,
30
30
31
31
[ MUL ] : {
32
32
name : MUL ,
33
33
params : 3 ,
34
- fn : ( a , b , c ) => ( this . input [ c ] = a * b ) ,
34
+ fn : ( a , b , c ) => ( this . memory [ c ] = a * b ) ,
35
35
write : true ,
36
36
} ,
37
37
38
38
[ INP ] : {
39
39
name : INP ,
40
40
params : 1 ,
41
- fn : a => ( this . input [ a ] = this . input_value ) ,
41
+ fn : a => ( this . memory [ a ] = this . inputs . shift ( ) ) ,
42
42
write : true ,
43
43
} ,
44
44
@@ -83,14 +83,14 @@ class Computer {
83
83
[ LTH ] : {
84
84
name : LTH ,
85
85
params : 3 ,
86
- fn : ( a , b , c ) => ( this . input [ c ] = a < b ? 1 : 0 ) ,
86
+ fn : ( a , b , c ) => ( this . memory [ c ] = a < b ? 1 : 0 ) ,
87
87
write : true ,
88
88
} ,
89
89
90
90
[ EQU ] : {
91
91
name : EQU ,
92
92
params : 3 ,
93
- fn : ( a , b , c ) => ( this . input [ c ] = a === b ? 1 : 0 ) ,
93
+ fn : ( a , b , c ) => ( this . memory [ c ] = a === b ? 1 : 0 ) ,
94
94
write : true ,
95
95
} ,
96
96
} ;
@@ -103,10 +103,12 @@ class Computer {
103
103
this . runOp ( op ) ;
104
104
op = this . parseOp ( ) ;
105
105
}
106
+
107
+ return this . outputs ;
106
108
}
107
109
108
110
parseOp ( ) {
109
- let temp_op = String ( this . input [ this . pointer ] ) . padStart ( 2 , '0' ) ;
111
+ let temp_op = String ( this . memory [ this . pointer ] ) . padStart ( 2 , '0' ) ;
110
112
let op = this . OPS [ temp_op . substr ( - 2 , 2 ) ] ;
111
113
112
114
let full_op = temp_op . padStart ( op . params + 2 , '0' ) ;
@@ -128,11 +130,11 @@ class Computer {
128
130
let values = [ ] ;
129
131
for ( let i = 0 ; i < modes . length ; i ++ ) {
130
132
let mode = modes [ i ] ;
131
- let value = this . input [ this . pointer + i ] ;
133
+ let value = this . memory [ this . pointer + i ] ;
132
134
133
135
const can_switch_to_position = ! write || i < modes . length - 1 ;
134
136
if ( can_switch_to_position && mode === POSITION_MODE ) {
135
- value = this . input [ value ] ;
137
+ value = this . memory [ value ] ;
136
138
}
137
139
138
140
values . push ( value ) ;
@@ -147,9 +149,7 @@ class Computer {
147
149
}
148
150
149
151
output ( v ) {
150
- if ( v !== 0 ) {
151
- console . log ( v ) ;
152
- }
152
+ this . outputs . push ( v ) ;
153
153
}
154
154
155
155
// For debugging
@@ -158,4 +158,29 @@ class Computer {
158
158
// }
159
159
}
160
160
161
- module . exports = Computer ;
161
+ class Circuit {
162
+ constructor ( memory , phase_settings ) {
163
+ this . memory = memory ;
164
+ this . phase_settings = phase_settings ;
165
+ }
166
+
167
+ run ( return_last_output = true ) {
168
+ // First computer gets 0 as its second input
169
+ let last_computer_output = [ 0 ] ;
170
+ for ( let phase_seting of this . phase_settings ) {
171
+ let computer = new Computer ( this . memory , [
172
+ phase_seting ,
173
+ ...last_computer_output ,
174
+ ] ) ;
175
+ last_computer_output = computer . run ( ) ;
176
+ }
177
+
178
+
179
+ return return_last_output ? last_computer_output . pop ( ) : last_computer_output ;
180
+ }
181
+ }
182
+
183
+ module . exports = {
184
+ Computer,
185
+ Circuit,
186
+ } ;
0 commit comments