Advertisement
Guest User

Untitled

a guest
Dec 21st, 2018
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.89 KB | None | 0 0
  1. package Advent2018;
  2.  
  3. import AssemBunny.Command2018;
  4. import AssemBunny.Operation;
  5. import util.AdventOfCode;
  6.  
  7. import java.util.*;
  8.  
  9. public class Day21 extends AdventOfCode {
  10.  
  11.     public Day21(List<String> input) {
  12.         super(input);
  13.     }
  14.  
  15.     int pointer;
  16.     int boundRegister;
  17.     List<Operation> instr;
  18.     Set<Integer> seen = new LinkedHashSet<>();
  19.  
  20.     int[] reg = new int[6];
  21.  
  22.     @Override
  23.     public Object part1() {
  24.         while (pointer < instr.size()) {
  25.             if (runProgram()) break;
  26.         }
  27.         return seen.stream().findFirst().orElse(0);
  28.     }
  29.  
  30.     boolean runProgram() {
  31.         Operation op = instr.get(pointer);
  32.         reg[boundRegister] = pointer;
  33.         if (!op.cmd.firstReg) {
  34.             op.aReg = reg[op.aVal];
  35.         }
  36.         if (!op.cmd.secondReg ) {
  37.             op.bReg = reg[op.bVal];
  38.         }
  39.         reg[op.c] = op.cmd.opcode.applyAsInt(op);
  40.  
  41.         // found
  42.         if (pointer == 28) {
  43.             if (!seen.add(reg[1])) {
  44.                 return true;
  45.             }
  46.         }
  47.  
  48.         pointer = reg[boundRegister];
  49.         pointer++;
  50.         return false;
  51.     }
  52.  
  53.     @Override
  54.     public Object part2() {
  55.         return seen.toArray()[seen.size() - 1];
  56.     }
  57.  
  58.     @Override
  59.     public void parse() {
  60.         instr = new ArrayList<>();
  61.         for (int i = 0; i < input.size(); i++) {
  62.             String[] split = input.get(i).split(" ");
  63.             if (i == 0) {
  64.                 boundRegister = Integer.parseInt(split[1]);
  65.             } else {
  66.                 Command2018 cmd = Command2018.valueOf(split[0].toUpperCase());
  67.                 int a = Integer.parseInt(split[1]);
  68.                 int b = Integer.parseInt(split[2]);
  69.                 int c = Integer.parseInt(split[3]);
  70.                 Operation op = new Operation(a, a, b, b, c, cmd);
  71.                 instr.add(op);
  72.             }
  73.         }
  74.     }
  75.  
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement