33 lines
1.1 KiB
Scala
33 lines
1.1 KiB
Scala
|
package day05
|
||
|
|
||
|
import day05.opcode.{Action, Jump, OpCode99}
|
||
|
|
||
|
class Day5
|
||
|
{
|
||
|
@scala.annotation.tailrec
|
||
|
final def opCodeRunner(tape: Array[Int], nextPtr: Int = 0): Boolean =
|
||
|
{
|
||
|
//println("=======\nParsing at "+nextPtr+": ["+tape(nextPtr)+", "+tape(nextPtr+1)+", "+tape(nextPtr+2)+", "+tape(nextPtr+3)+ "]");
|
||
|
val tuple = OpCode99.parseInt(tape(nextPtr));
|
||
|
//println("Executing: " + tuple)
|
||
|
tuple match
|
||
|
{
|
||
|
case (_, _, _, OpCode99) => true // finish
|
||
|
case (m3, m2, m1, instruction: Jump) =>
|
||
|
{
|
||
|
val (bool, jmpPtr) = instruction.checkConditionAndJump(tape, tape(nextPtr+1), tape(nextPtr+2), tape(nextPtr+3), m1, m2, m3)
|
||
|
//println("Jumping?: " + bool + " " + jmpPtr)
|
||
|
if (bool) opCodeRunner(tape, jmpPtr)
|
||
|
else opCodeRunner(tape, nextPtr + instruction.length)
|
||
|
}
|
||
|
case (m3, m2, m1, instruction: Action) =>
|
||
|
{
|
||
|
instruction.exec(tape, tape(nextPtr+1), tape(nextPtr+2), tape(nextPtr+3), m1, m2, m3)
|
||
|
opCodeRunner(tape, nextPtr + instruction.length)
|
||
|
}
|
||
|
case _ => throw new Exception("Something went wrong")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|