Day02 2019
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user