Created
December 23, 2015 10:04
-
-
Save desrtfx/0b8e12d76c4a92615a0e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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