Watch
1
0
Fork
You've already forked advent-of-code
0

Factor out instruction methods

This commit is contained in:
Jeremy Kaplan 2019-12-06 10:25:53 -08:00
commit 911855e479

View file

@ -67,59 +67,23 @@ module Intcode
end end
def tick(&user_input) def tick(&user_input)
opcode = operation(@mem[@ip]) case operation(@mem[@ip])
mode = modes(@mem[@ip])
case opcode
when 1 when 1
a = read(@ip + 1, mode[0]) add!
b = read(@ip + 2, mode[1])
r = @mem[@ip + 3]
raise StandardError, "unexpected mode: #{mode[2]}" if mode[2] != 0
@mem[r] = a + b
@ip += 4
when 2 when 2
a = read(@ip + 1, mode[0]) mul!
b = read(@ip + 2, mode[1])
r = @mem[@ip + 3]
raise StandardError, "unexpected mode: #{mode[2]}" if mode[2] != 0
@mem[r] = a * b
@ip += 4
when 3 when 3
r = @mem[@ip + 1] input!(&user_input)
raise StandardError, "unexpected mode: #{mode[0]}" if mode[0] != 0
@mem[r] = input(&user_input)
@ip += 2
when 4 when 4
output = read(@ip + 1, mode[0]) output!
puts "output: #{output}"
@ip += 2
when 5 when 5
a = read(@ip + 1, mode[0]) branch_if_not_zero!
b = read(@ip + 2, mode[1])
@ip = a.zero? ? @ip + 3 : b
when 6 when 6
a = read(@ip + 1, mode[0]) branch_if_zero!
b = read(@ip + 2, mode[1])
@ip = a.zero? ? b : @ip + 3
when 7 when 7
a = read(@ip + 1, mode[0]) less_than!
b = read(@ip + 2, mode[1])
r = @mem[@ip + 3]
raise StandardError, "unexpected mode: #{mode[2]}" if mode[2] != 0
@mem[r] = a < b ? 1 : 0
@ip += 4
when 8 when 8
a = read(@ip + 1, mode[0]) equal!
b = read(@ip + 2, mode[1])
r = @mem[@ip + 3]
raise StandardError, "unexpected mode: #{mode[2]}" if mode[2] != 0
@mem[r] = a == b ? 1 : 0
@ip += 4
when 99 when 99
raise DoneExecuting raise DoneExecuting
else else
@ -129,6 +93,80 @@ module Intcode
private private
def add!
mode = modes(@mem[@ip])
a = read(@ip + 1, mode[0])
b = read(@ip + 2, mode[1])
r = @mem[@ip + 3]
raise StandardError, "unexpected mode: #{mode[2]}" if mode[2] != 0
@mem[r] = a + b
@ip += 4
end
def mul!
mode = modes(@mem[@ip])
a = read(@ip + 1, mode[0])
b = read(@ip + 2, mode[1])
r = @mem[@ip + 3]
raise StandardError, "unexpected mode: #{mode[2]}" if mode[2] != 0
@mem[r] = a * b
@ip += 4
end
def input!(&user_input)
mode = modes(@mem[@ip])
r = @mem[@ip + 1]
raise StandardError, "unexpected mode: #{mode[0]}" if mode[0] != 0
@mem[r] = input(&user_input)
@ip += 2
end
def output!
mode = modes(@mem[@ip])
output = read(@ip + 1, mode[0])
puts "output: #{output}"
@ip += 2
end
def branch_if_not_zero!
mode = modes(@mem[@ip])
a = read(@ip + 1, mode[0])
b = read(@ip + 2, mode[1])
@ip = a.zero? ? @ip + 3 : b
end
def branch_if_zero!
mode = modes(@mem[@ip])
a = read(@ip + 1, mode[0])
b = read(@ip + 2, mode[1])
@ip = a.zero? ? b : @ip + 3
end
def less_than!
mode = modes(@mem[@ip])
a = read(@ip + 1, mode[0])
b = read(@ip + 2, mode[1])
r = @mem[@ip + 3]
raise StandardError, "unexpected mode: #{mode[2]}" if mode[2] != 0
@mem[r] = a < b ? 1 : 0
@ip += 4
end
def equal!
mode = modes(@mem[@ip])
a = read(@ip + 1, mode[0])
b = read(@ip + 2, mode[1])
r = @mem[@ip + 3]
raise StandardError, "unexpected mode: #{mode[2]}" if mode[2] != 0
@mem[r] = a == b ? 1 : 0
@ip += 4
end
def input def input
print 'input> ' print 'input> '
if block_given? if block_given?