parent
67a85cad42
commit
4179982a82
@ -0,0 +1,52 @@
|
|||||||
|
OPCODES = ARGF.read.split(?,).map(&:to_i)
|
||||||
|
|
||||||
|
def run(memory)
|
||||||
|
pc = 0
|
||||||
|
loop do
|
||||||
|
instruction = memory[pc]
|
||||||
|
return if instruction == 99
|
||||||
|
|
||||||
|
p pc
|
||||||
|
a, b, c, opcode = instruction.to_s.rjust(5, ?0).scan(/^(0|1)(0|1)(0|1)(\d\d)$/)[0].map(&:to_i)
|
||||||
|
c = c.zero? ? memory[memory[pc+1]] : memory[pc+1]
|
||||||
|
b = b.zero? ? memory[memory[pc+2]] : memory[pc+2]
|
||||||
|
a = a.zero? ? memory[memory[pc+3]] : memory[pc+3]
|
||||||
|
|
||||||
|
case opcode
|
||||||
|
when 1
|
||||||
|
memory[memory[pc+3]] = c + b
|
||||||
|
pc += 4
|
||||||
|
when 2
|
||||||
|
memory[memory[pc+3]] = c * b
|
||||||
|
pc += 4
|
||||||
|
when 3
|
||||||
|
memory[memory[pc+1]] = 5
|
||||||
|
pc += 2
|
||||||
|
when 4
|
||||||
|
puts c
|
||||||
|
pc += 2
|
||||||
|
when 5
|
||||||
|
if c.nonzero?
|
||||||
|
pc = b
|
||||||
|
else
|
||||||
|
pc += 3
|
||||||
|
end
|
||||||
|
when 6
|
||||||
|
if c.zero?
|
||||||
|
pc = b
|
||||||
|
else
|
||||||
|
pc += 3
|
||||||
|
end
|
||||||
|
when 7
|
||||||
|
memory[memory[pc+3]] = (c < b) ? 1 : 0
|
||||||
|
pc += 4
|
||||||
|
when 8
|
||||||
|
memory[memory[pc+3]] = (c == b) ? 1 : 0
|
||||||
|
pc += 4
|
||||||
|
else
|
||||||
|
fail "unrecognized instruction: #{instruction}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
run(OPCODES)
|
Loading…
Reference in new issue