You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.4 KiB
Go
62 lines
1.4 KiB
Go
package interpreter
|
|
|
|
import "fmt"
|
|
|
|
type Interpreter struct {
|
|
program []int
|
|
instructionPointer int
|
|
}
|
|
|
|
func Init(program []int) *Interpreter {
|
|
return &Interpreter {
|
|
program: program,
|
|
instructionPointer: 0,
|
|
}
|
|
}
|
|
|
|
func (i *Interpreter) Next() bool {
|
|
opcode := i.getValueAtIndex(i.instructionPointer)
|
|
ipIncrement := 1
|
|
|
|
switch opcode {
|
|
case 1:
|
|
i.add()
|
|
ipIncrement = 4
|
|
case 2:
|
|
i.mul()
|
|
ipIncrement = 4
|
|
case 99:
|
|
return true
|
|
default:
|
|
panic(fmt.Sprintf("unhandled opcode %v at IP %v", opcode, i.instructionPointer))
|
|
}
|
|
|
|
i.instructionPointer += ipIncrement
|
|
|
|
return false
|
|
}
|
|
|
|
func (i *Interpreter) getValueAtIndex(index int) int {
|
|
return i.program[index]
|
|
}
|
|
|
|
func (i *Interpreter) setValueAtIndex(index, value int) {
|
|
i.program[index] = value
|
|
}
|
|
|
|
func (i *Interpreter) add() {
|
|
resIndex := i.getValueAtIndex(i.instructionPointer + 3)
|
|
arg1Index := i.getValueAtIndex(i.instructionPointer + 1)
|
|
arg2Index := i.getValueAtIndex(i.instructionPointer + 2)
|
|
|
|
i.setValueAtIndex(resIndex, i.getValueAtIndex(arg1Index) + i.getValueAtIndex(arg2Index))
|
|
}
|
|
|
|
func (i *Interpreter) mul() {
|
|
resIndex := i.getValueAtIndex(i.instructionPointer + 3)
|
|
arg1Index := i.getValueAtIndex(i.instructionPointer + 1)
|
|
arg2Index := i.getValueAtIndex(i.instructionPointer + 2)
|
|
|
|
i.setValueAtIndex(resIndex, i.getValueAtIndex(arg1Index) * i.getValueAtIndex(arg2Index))
|
|
}
|