1
0

Day02 2019

This commit is contained in:
2020-12-30 19:18:24 +01:00
parent 4a90257257
commit 4fef41464e
5 changed files with 119 additions and 3 deletions
@@ -0,0 +1,48 @@
package be.vandewalleh.aoc.intcode;
import java.util.Arrays;
public class IntCodeInterpreter {
private final long[] memory;
public IntCodeInterpreter(long[] memory) {
var copy = new long[memory.length];
System.arraycopy(memory, 0, copy, 0, memory.length);
this.memory = copy;
}
public IntCodeInterpreter(int[] memory) {
this.memory = Arrays.stream(memory).asLongStream().toArray();
}
public void setNoun(long noun) {
memory[1] = noun;
}
public void setVerb(long verb) {
memory[2] = verb;
}
public long getOutput() {
return memory[0];
}
public void run() {
var pointer = 0;
loop:
while (true) {
var optionalOpCode = OpCode.from((int) memory[pointer]);
var opCode = optionalOpCode.orElseThrow(() -> new IllegalArgumentException("Invalid OpCode"));
var args = Arrays.copyOfRange(memory, pointer + 1, pointer + opCode.params + 1);
switch (opCode) {
case Add -> memory[(int) args[2]] = memory[(int) args[0]] + memory[(int) args[1]];
case Multiply -> memory[(int) args[2]] = memory[(int) args[0]] * memory[(int) args[1]];
case Halt -> {
break loop;
}
}
pointer += opCode.params + 1;
}
}
}
@@ -0,0 +1,24 @@
package be.vandewalleh.aoc.intcode;
import java.util.Optional;
public enum OpCode {
Add(1, 3),
Multiply(2, 3),
Halt(99, 0);
public final int value;
public final int params;
OpCode(int value, int params) {
this.value = value;
this.params = params;
}
public static Optional<OpCode> from(int value) {
for (OpCode opCode : OpCode.values()) {
if (opCode.value == value) return Optional.of(opCode);
}
return Optional.empty();
}
}