Skip to content

Commit 942b44a

Browse files
committed
AoC 2019 Day 13 - java
1 parent c8deae4 commit 942b44a

File tree

3 files changed

+119
-1
lines changed

3 files changed

+119
-1
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
| | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
6161
| ---| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
6262
| python3 | [](src/main/python/AoC2019_01.py) | [](src/main/python/AoC2019_02.py) | [](src/main/python/AoC2019_03.py) | [](src/main/python/AoC2019_04.py) | [](src/main/python/AoC2019_05.py) | [](src/main/python/AoC2019_06.py) | [](src/main/python/AoC2019_07.py) | [](src/main/python/AoC2019_08.py) | [](src/main/python/AoC2019_09.py) | | | | | | | | | | | | | | | | |
63-
| java | [](src/main/java/AoC2019_01.java) | [](src/main/java/AoC2019_02.java) | [](src/main/java/AoC2019_03.java) | [](src/main/java/AoC2019_04.java) | [](src/main/java/AoC2019_05.java) | [](src/main/java/AoC2019_06.java) | [](src/main/java/AoC2019_07.java) | [](src/main/java/AoC2019_08.java) | [](src/main/java/AoC2019_09.java) | [](src/main/java/AoC2019_10.java) | [](src/main/java/AoC2019_11.java) | [](src/main/java/AoC2019_12.java) | | | | | | | | | | | | | |
63+
| java | [](src/main/java/AoC2019_01.java) | [](src/main/java/AoC2019_02.java) | [](src/main/java/AoC2019_03.java) | [](src/main/java/AoC2019_04.java) | [](src/main/java/AoC2019_05.java) | [](src/main/java/AoC2019_06.java) | [](src/main/java/AoC2019_07.java) | [](src/main/java/AoC2019_08.java) | [](src/main/java/AoC2019_09.java) | [](src/main/java/AoC2019_10.java) | [](src/main/java/AoC2019_11.java) | [](src/main/java/AoC2019_12.java) | [](src/main/java/AoC2019_13.java) | | | | | | | | | | | | |
6464
| bash | | | | | | | | [](src/main/bash/AoC2019_08.sh) | | | | | | | | | | | | | | | | | |
6565
| c++ | | | | | | | | [](src/main/cpp/2019/08/AoC2019_08.cpp) | | | | | | | | | | | | | | | | | |
6666
| julia | | | | | | | | | | | | | | | | | | | | | | | | | |

src/main/java/AoC2019_13.java

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
import static com.github.pareronia.aoc.IntegerSequence.Range.range;
2+
import static java.util.stream.Collectors.toList;
3+
4+
import java.util.ArrayDeque;
5+
import java.util.ArrayList;
6+
import java.util.Deque;
7+
import java.util.List;
8+
9+
import com.github.pareronia.aoc.intcode.IntCode;
10+
import com.github.pareronia.aocd.Aocd;
11+
import com.github.pareronia.aocd.Puzzle;
12+
13+
public class AoC2019_13 extends AoCBase {
14+
15+
private final List<Long> program;
16+
17+
private AoC2019_13(final List<String> input, final boolean debug) {
18+
super(debug);
19+
assert input.size() == 1;
20+
this.program = IntCode.parse(input.get(0));
21+
}
22+
23+
public static AoC2019_13 create(final List<String> input) {
24+
return new AoC2019_13(input, false);
25+
}
26+
27+
public static AoC2019_13 createDebug(final List<String> input) {
28+
return new AoC2019_13(input, true);
29+
}
30+
31+
@Override
32+
public Long solvePart1() {
33+
final IntCode intCode = new IntCode(this.debug);
34+
final Deque<Long> input = new ArrayDeque<>();
35+
final Deque<Long> output = new ArrayDeque<>();
36+
intCode.run(this.program, input, output);
37+
final List<Long> list = output.stream().collect(toList());
38+
return range(2, list.size(), 3).intStream()
39+
.mapToLong(i -> list.get(i))
40+
.filter(o -> o == 2L)
41+
.count();
42+
}
43+
44+
@Override
45+
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<>();
49+
final List<Long> quarters = new ArrayList<>();
50+
quarters.add(2L);
51+
quarters.addAll(this.program.subList(1, this.program.size()));
52+
final List<Long> buffer = new ArrayList<>();
53+
Long ball = null, paddle = null;
54+
long score = 0;
55+
56+
intCode.runTillHasOutput(quarters, input, output);
57+
while (!intCode.isHalted()) {
58+
buffer.add(output.pop());
59+
if (buffer.size() < 3) {
60+
intCode.continueTillHasOutput(input, output);
61+
continue;
62+
}
63+
64+
final long x = buffer.get(0);
65+
final long y = buffer.get(1);
66+
final long id = buffer.get(2);
67+
log(buffer);
68+
buffer.clear();
69+
if (x == -1 && y == 0) {
70+
score = id;
71+
} else if (id == 3) {
72+
paddle = x;
73+
} else if (id == 4) {
74+
ball = x;
75+
}
76+
if (ball != null && paddle != null) {
77+
final long joystick = Long.compare(ball, paddle);
78+
log(" -> " + joystick);
79+
input.add(joystick);
80+
ball = null;
81+
}
82+
83+
intCode.continueTillHasOutput(input, output);
84+
}
85+
return score;
86+
}
87+
88+
public static void main(final String[] args) throws Exception {
89+
final Puzzle puzzle = Aocd.puzzle(2019, 13);
90+
final List<String> inputData = puzzle.getInputData();
91+
puzzle.check(
92+
() -> lap("Part 1", AoC2019_13.create(inputData)::solvePart1),
93+
() -> lap("Part 2", AoC2019_13.create(inputData)::solvePart2)
94+
);
95+
}
96+
}

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

+22
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public class IntCode {
3434
private int base;
3535
private List<Long> program;
3636
private boolean runTillInputRequired;
37+
private boolean runTillHasOutput;
3738
private boolean halted;
3839

3940
public IntCode(final boolean debug) {
@@ -72,6 +73,15 @@ public void runTillInputRequired(
7273
run(instructions, input, output);
7374
}
7475

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+
7585
public void continueTillInputRequired(
7686
final Deque<Long> input,
7787
final Deque<Long> output
@@ -80,6 +90,14 @@ public void continueTillInputRequired(
8090
doRun(input, output);
8191
}
8292

93+
public void continueTillHasOutput(
94+
final Deque<Long> input,
95+
final Deque<Long> output
96+
) {
97+
this.runTillHasOutput = true;
98+
doRun(input, output);
99+
}
100+
83101
private List<Long> doRun(
84102
final Deque<Long> input,
85103
final Deque<Long> output
@@ -114,6 +132,10 @@ private List<Long> doRun(
114132
case OUTPUT:
115133
output.add(get(addr[1]));
116134
ip += 2;
135+
if (this.runTillHasOutput) {
136+
this.runTillHasOutput = false;
137+
return this.program;
138+
}
117139
break;
118140
case JIT:
119141
ip = get(addr[1]) != 0 ? getInt(addr[2]) : ip + 3;

0 commit comments

Comments
 (0)