Skip to content

Commit 8b6876c

Browse files
committed
IntCode - java - refactor
1 parent 942b44a commit 8b6876c

File tree

9 files changed

+70
-79
lines changed

9 files changed

+70
-79
lines changed

src/main/java/AoC2019_02.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ private Long runProgram(final long noun, final long verb) {
2929
final List<Long> theProgram = new ArrayList<>(this.program);
3030
theProgram.set(1, noun);
3131
theProgram.set(2, verb);
32-
return new IntCode(this.debug).run(theProgram).get(0);
32+
final IntCode intCode = new IntCode(theProgram, this.debug);
33+
intCode.run(theProgram);
34+
return intCode.getProgram().get(0);
3335
}
3436

3537
@Override

src/main/java/AoC2019_05.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ public static AoC2019_05 createDebug(final List<String> input) {
2525
}
2626

2727
private Long solve(final long input) {
28-
final IntCode intCode = new IntCode(this.debug);
28+
final IntCode intCode = new IntCode(this.program, this.debug);
2929
final Deque<Long> output = new ArrayDeque<>();
30-
intCode.run(this.program, input, output);
30+
intCode.run(input, output);
3131
return output.getLast();
3232
}
3333

src/main/java/AoC2019_07.java

+5-9
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,12 @@ private Long run(final List<Integer> phaseSettings) {
4242
.toArray(Deque[]::new);
4343
queues[0].add(0L);
4444
final IntCode[] intCode = range(5).intStream()
45-
.mapToObj(i -> new IntCode(false))
45+
.mapToObj(i -> new IntCode(this.program, false))
4646
.toArray(IntCode[]::new);
47-
range(5).forEach(i -> {
48-
intCode[i].runTillInputRequired(this.program, queues[i], queues[(i + 1) % 5]);
49-
});
50-
while (!Arrays.stream(intCode).allMatch(IntCode::isHalted)) {
51-
range(5).forEach(i -> {
52-
intCode[i].continueTillInputRequired(queues[i], queues[(i + 1) % 5]);
53-
});
54-
}
47+
do {
48+
range(5).forEach(i ->
49+
intCode[i].runTillInputRequired(queues[i], queues[(i + 1) % 5]));
50+
} while (!Arrays.stream(intCode).allMatch(IntCode::isHalted));
5551
return queues[0].getLast();
5652
}
5753

src/main/java/AoC2019_09.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ public static AoC2019_09 createDebug(final List<String> input) {
2525
}
2626

2727
private Long solve(final long input) {
28-
final IntCode intCode = new IntCode(this.debug);
28+
final IntCode intCode = new IntCode(this.program, this.debug);
2929
final Deque<Long> output = new ArrayDeque<>();
30-
intCode.run(this.program, input, output);
30+
intCode.run(input, output);
3131
return output.getLast();
3232
}
3333

src/main/java/AoC2019_11.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,11 @@ private PaintJob paint(final long start) {
4646
final Set<Position> white = new HashSet<>();
4747
final NavigationWithHeading nav
4848
= new NavigationWithHeading(Position.of(0, 0), Headings.NORTH.get());
49-
final IntCode intCode = new IntCode(false);
49+
final IntCode intCode = new IntCode(this.program, false);
5050
final Deque<Long> input = new ArrayDeque<>(List.of(start));
5151
final Deque<Long> output = new ArrayDeque<>();
52-
intCode.runTillInputRequired(this.program, input, output);
53-
while (!intCode.isHalted()) {
52+
do {
53+
intCode.runTillInputRequired(input, output);
5454
if (output.pop() == WHITE) {
5555
white.add(nav.getPosition());
5656
} else {
@@ -63,8 +63,8 @@ private PaintJob paint(final long start) {
6363
}
6464
nav.forward(1);
6565
input.add(white.contains(nav.getPosition()) ? 1L : 0L);
66-
intCode.continueTillInputRequired(input, output);
67-
}
66+
intCode.runTillInputRequired(input, output);
67+
} while (!intCode.isHalted());
6868
final Set<Position> visited = nav.getVisitedPositions(false).stream()
6969
.distinct().collect(toSet());
7070
return new PaintJob(visited, white);

src/main/java/AoC2019_13.java

+10-10
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ public static AoC2019_13 createDebug(final List<String> input) {
3030

3131
@Override
3232
public Long solvePart1() {
33-
final IntCode intCode = new IntCode(this.debug);
33+
final IntCode intCode = new IntCode(this.program, this.debug);
3434
final Deque<Long> input = new ArrayDeque<>();
3535
final Deque<Long> output = new ArrayDeque<>();
36-
intCode.run(this.program, input, output);
36+
intCode.run(input, output);
3737
final List<Long> list = output.stream().collect(toList());
3838
return range(2, list.size(), 3).intStream()
3939
.mapToLong(i -> list.get(i))
@@ -43,21 +43,23 @@ public Long solvePart1() {
4343

4444
@Override
4545
public Long solvePart2() {
46-
final IntCode intCode = new IntCode(this.debug);
47-
final Deque<Long> input = new ArrayDeque<>();
48-
final Deque<Long> output = new ArrayDeque<>();
4946
final List<Long> quarters = new ArrayList<>();
5047
quarters.add(2L);
5148
quarters.addAll(this.program.subList(1, this.program.size()));
49+
final IntCode intCode = new IntCode(quarters, this.debug);
50+
final Deque<Long> input = new ArrayDeque<>();
51+
final Deque<Long> output = new ArrayDeque<>();
5252
final List<Long> buffer = new ArrayList<>();
5353
Long ball = null, paddle = null;
5454
long score = 0;
5555

56-
intCode.runTillHasOutput(quarters, input, output);
57-
while (!intCode.isHalted()) {
56+
while (true) {
57+
intCode.runTillHasOutput(input, output);
58+
if (intCode.isHalted()) {
59+
break;
60+
}
5861
buffer.add(output.pop());
5962
if (buffer.size() < 3) {
60-
intCode.continueTillHasOutput(input, output);
6163
continue;
6264
}
6365

@@ -79,8 +81,6 @@ public Long solvePart2() {
7981
input.add(joystick);
8082
ball = null;
8183
}
82-
83-
intCode.continueTillHasOutput(input, output);
8484
}
8585
return score;
8686
}

src/main/java/IntCodeDaysRunner.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ public class IntCodeDaysRunner {
1111
Day.at(2019, 5),
1212
Day.at(2019, 7),
1313
Day.at(2019, 9),
14-
Day.at(2019, 11)
14+
Day.at(2019, 11),
15+
Day.at(2019, 13)
1516
);
1617

1718
public static void main(final String[] args) throws Exception {

src/main/java/com/github/pareronia/aoc/intcode/IntCode.java

+19-34
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import java.util.ArrayDeque;
66
import java.util.ArrayList;
7+
import java.util.Collections;
78
import java.util.Deque;
89
import java.util.List;
910
import java.util.stream.IntStream;
@@ -32,73 +33,53 @@ public class IntCode {
3233

3334
private int ip;
3435
private int base;
35-
private List<Long> program;
36+
private final List<Long> program;
3637
private boolean runTillInputRequired;
3738
private boolean runTillHasOutput;
3839
private boolean halted;
3940

40-
public IntCode(final boolean debug) {
41+
public IntCode(final List<Long> instructions, final boolean debug) {
4142
this.debug = debug;
43+
this.program = new ArrayList<>(instructions);
4244
}
4345

44-
public List<Long> run(final List<Long> program) {
45-
return run(program, new ArrayDeque<>(), new ArrayDeque<>());
46+
public void run(final List<Long> program) {
47+
run(new ArrayDeque<>(), new ArrayDeque<>());
4648
}
4749

48-
public List<Long> run(
49-
final List<Long> program,
50+
public void run(
5051
final long input,
5152
final Deque<Long> output
5253
) {
53-
return run(program, new ArrayDeque<>(List.of(input)), output);
54+
run(new ArrayDeque<>(List.of(input)), output);
5455
}
5556

56-
public List<Long> run(
57-
final List<Long> instructions,
57+
public void run(
5858
final Deque<Long> input,
5959
final Deque<Long> output
6060
) {
6161
this.ip = 0;
6262
this.base = 0;
63-
this.program = new ArrayList<>(instructions);
64-
return doRun(input, output);
63+
doRun(input, output);
6564
}
6665

6766
public void runTillInputRequired(
68-
final List<Long> instructions,
69-
final Deque<Long> input,
70-
final Deque<Long> output
71-
) {
72-
this.runTillInputRequired = true;
73-
run(instructions, input, output);
74-
}
75-
76-
public void runTillHasOutput(
77-
final List<Long> instructions,
78-
final Deque<Long> input,
79-
final Deque<Long> output
80-
) {
81-
this.runTillHasOutput = true;
82-
run(instructions, input, output);
83-
}
84-
85-
public void continueTillInputRequired(
8667
final Deque<Long> input,
8768
final Deque<Long> output
8869
) {
8970
this.runTillInputRequired = true;
9071
doRun(input, output);
9172
}
9273

93-
public void continueTillHasOutput(
74+
public void runTillHasOutput(
9475
final Deque<Long> input,
9576
final Deque<Long> output
9677
) {
9778
this.runTillHasOutput = true;
9879
doRun(input, output);
9980
}
10081

101-
private List<Long> doRun(
82+
private void doRun(
10283
final Deque<Long> input,
10384
final Deque<Long> output
10485
) {
@@ -124,7 +105,7 @@ private List<Long> doRun(
124105
case INPUT:
125106
if (this.runTillInputRequired && input.isEmpty()) {
126107
this.runTillInputRequired = false;
127-
return this.program;
108+
return;
128109
}
129110
set(addr[1], input.pop());
130111
ip += 2;
@@ -134,7 +115,7 @@ private List<Long> doRun(
134115
ip += 2;
135116
if (this.runTillHasOutput) {
136117
this.runTillHasOutput = false;
137-
return this.program;
118+
return;
138119
}
139120
break;
140121
case JIT:
@@ -158,7 +139,7 @@ private List<Long> doRun(
158139
case EXIT:
159140
log(String.format("%d: EXIT", ip));
160141
this.halted = true;
161-
return program;
142+
return;
162143
default:
163144
throw new IllegalStateException(
164145
String.format("Invalid opcode: '%d'", opcode));
@@ -211,6 +192,10 @@ private int[] getAddr(final int[] modes) {
211192
public boolean isHalted() {
212193
return halted;
213194
}
195+
196+
public List<Long> getProgram() {
197+
return Collections.unmodifiableList(this.program);
198+
}
214199

215200
private void log(final Object obj) {
216201
if (!debug) {

src/test/java/com/github/pareronia/aoc/intcode/IntCodeTestCase.java

+22-15
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public class IntCodeTestCase {
1616
public void test1() {
1717
final List<Long> program = asList(1, 9, 10, 3, 2, 3, 11, 0, 99, 30, 40, 50);
1818

19-
final List<Long> result = setUpIntCode().run(program);
19+
final List<Long> result = runIntCode(program);
2020

2121
assertThat(result).isEqualTo(asList(3500, 9, 10, 70, 2, 3, 11, 0, 99, 30, 40, 50));
2222
}
@@ -25,7 +25,7 @@ public void test1() {
2525
public void test2() {
2626
final List<Long> program = asList(1, 0, 0, 0, 99);
2727

28-
final List<Long> result = setUpIntCode().run(program);
28+
final List<Long> result = runIntCode(program);
2929

3030
assertThat(result).isEqualTo(asList(2, 0, 0, 0, 99));
3131
}
@@ -34,18 +34,19 @@ public void test2() {
3434
public void test3() {
3535
final List<Long> program = asList(1, 1, 1, 4, 99, 5, 6, 0, 99);
3636

37-
final List<Long> result = setUpIntCode().run(program);
37+
final List<Long> result = runIntCode(program);
3838

3939
assertThat(result).isEqualTo(asList(30, 1, 1, 4, 2, 5, 6, 0, 99));
4040
}
4141

4242
@Test
4343
public void testInputOutput() {
4444
final List<Long> program = asList(3, 0, 4, 0, 99);
45-
final IntCode intCode = setUpIntCode();
45+
final IntCode intCode = setUpIntCode(program);
4646
final Deque<Long> output = new ArrayDeque<>();
4747

48-
final List<Long> result = intCode.run(program, 123, output);
48+
intCode.run(123, output);
49+
final List<Long> result = intCode.getProgram();
4950

5051
assertThat(output.getLast()).isEqualTo(123);
5152
assertThat(result).isEqualTo(asList(123, 0, 4, 0, 99));
@@ -55,7 +56,7 @@ public void testInputOutput() {
5556
public void testModes1() {
5657
final List<Long> program = asList(1002, 4, 3, 4, 33);
5758

58-
final List<Long> result = setUpIntCode().run(program);
59+
final List<Long> result = runIntCode(program);
5960

6061
assertThat(result).isEqualTo(asList(1002, 4, 3, 4, 99));
6162
}
@@ -64,7 +65,7 @@ public void testModes1() {
6465
public void testModes2() {
6566
final List<Long> program = asList(1101, 100, -1, 4, 0);
6667

67-
final List<Long> result = setUpIntCode().run(program);
68+
final List<Long> result = runIntCode(program);
6869

6970
assertThat(result).isEqualTo(asList(1101, 100, -1, 4, 99));
7071
}
@@ -187,7 +188,7 @@ public void test6() {
187188
public void testExpand() {
188189
final List<Long> program = asList(1001, 5, 10, 7, 99);
189190

190-
final List<Long> result = setUpIntCode().run(program);
191+
final List<Long> result = runIntCode(program);
191192

192193
assertThat(result).isEqualTo(asList(1001, 5, 10, 7, 99, 0, 0, 10));
193194
}
@@ -198,7 +199,7 @@ public void test7() {
198199
1008, 100, 16, 101, 1006, 101, 0, 99);
199200
final Deque<Long> output = new ArrayDeque<>();
200201

201-
setUpIntCode().run(program, null, output);
202+
setUpIntCode(program).run(null, output);
202203

203204
assertThat(output.stream().collect(toList())).isEqualTo(program);
204205
}
@@ -208,7 +209,7 @@ public void test8() {
208209
final List<Long> program = asList(1102, 34915192, 34915192, 7, 4, 7, 99, 0);
209210
final Deque<Long> output = new ArrayDeque<>();
210211

211-
setUpIntCode().run(program, null, output);
212+
setUpIntCode(program).run(null, output);
212213

213214
assertThat(output.getLast()).isEqualTo(34_915_192L * 34_915_192L);
214215
}
@@ -218,16 +219,16 @@ public void test9() {
218219
final List<Long> program = List.of(104L, 1125899906842624L, 99L);
219220
final Deque<Long> output = new ArrayDeque<>();
220221

221-
setUpIntCode().run(program, null, output);
222+
setUpIntCode(program).run(null, output);
222223

223224
assertThat(output.getLast()).isEqualTo(1_125_899_906_842_624L);
224225
}
225226

226227
private void assertIntCode(final List<Long> program, final long input, final long result) {
227-
final IntCode intCode = setUpIntCode();
228+
final IntCode intCode = setUpIntCode(program);
228229
final Deque<Long> output = new ArrayDeque<>();
229230

230-
intCode.run(program, input, output);
231+
intCode.run(input, output);
231232

232233
assertThat(output.getLast()).isEqualTo(result);
233234
}
@@ -236,7 +237,13 @@ private List<Long> asList(final Integer... ints) {
236237
return Stream.of(ints).map(Integer::longValue).collect(toList());
237238
}
238239

239-
private IntCode setUpIntCode() {
240-
return new IntCode(!System.getProperties().containsKey("NDEBUG"));
240+
private List<Long> runIntCode(final List<Long> program) {
241+
final IntCode intCode = setUpIntCode(program);
242+
intCode.run(program);
243+
return intCode.getProgram();
244+
}
245+
246+
private IntCode setUpIntCode(final List<Long> program) {
247+
return new IntCode(program, !System.getProperties().containsKey("NDEBUG"));
241248
}
242249
}

0 commit comments

Comments
 (0)