Skip to content

Instantly share code, notes, and snippets.

@desrtfx
Created December 23, 2015 10:04
Show Gist options
  • Save desrtfx/0b8e12d76c4a92615a0e to your computer and use it in GitHub Desktop.
Save desrtfx/0b8e12d76c4a92615a0e to your computer and use it in GitHub Desktop.
import java.util.ArrayList;
import java.util.List;
public class Day23 {
private final static String FILENAME = "./InputDay23.txt";
private List<String> input;
private List<Instruction> program;
private Register a;
private Register b;
private int ip; // Instruction Pointer
private enum Cmd {
hlf, tpl, inc, jmp, jie, jio;
}
class Instruction {
Cmd cmd;
Register register;
int offset;
public Instruction(String line) {
String[] data = line.split("[ ,]+");
cmd = Cmd.valueOf(data[0]);
switch (cmd) {
case hlf:
case tpl:
case inc:
register = getRegister(data[1]);
offset = 0;
break;
case jmp:
register = a;
offset = Integer.parseInt(data[1]);
break;
case jie:
case jio:
register = getRegister(data[1]);
offset = Integer.parseInt(data[2]);
break;
default:
break;
}
}
private Register getRegister(String data) {
return "a".equals(data) ? a : "b".equals(data) ? b : a;
}
public void execute() {
switch (cmd) {
case hlf:
register.value = register.value / 2;
ip++;
break;
case tpl:
register.value = register.value * 3;
ip++;
break;
case inc:
register.value++;
ip++;
break;
case jmp:
ip += offset;
break;
case jie:
ip += (register.value % 2 == 0) ? offset : 1;
break;
case jio:
ip += (register.value == 1) ? offset : 1;
break;
default:
break;
}
}
}
class Register {
int value = 0;
}
public Day23() {
input = FileIO.getFileAsList(Day23.FILENAME);
a = new Register();
b = new Register();
program = new ArrayList<>();
for (String line : input) {
program.add(new Instruction(line));
}
ip = 0;
}
public void reset() {
ip = 0;
a.value = 0;
b.value = 0;
}
public void run() {
while (ip < program.size()) {
Instruction cmd = program.get(ip);
cmd.execute();
if (ip >= program.size())
break;
}
}
public static void main(String[] args) {
Day23 day23 = new Day23();
day23.reset();
day23.run();
System.out.println("Part 1: Value of Register b is: " + day23.b.value);
day23.reset();
day23.a.value++;
day23.run();
System.out.println("Part 2: Value of Register b is: " + day23.b.value);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment