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

Combine parameter reads

This commit is contained in:
Jeremy Kaplan 2019-12-05 23:56:37 -08:00
commit 45bc074396

View file

@ -71,74 +71,54 @@ module Intcode
mode = modes(@mem[@ip]) mode = modes(@mem[@ip])
case opcode case opcode
when 1 when 1
r1, r2, r3 = @mem[@ip + 1, 3] a = read(@ip + 1, mode[0])
a = param(r1, mode[0]) b = read(@ip + 2, mode[1])
b = param(r2, mode[1]) r = @mem[@ip + 3]
raise StandardError, "unexpected mode: #{mode[2]}" if mode[2] != 0 raise StandardError, "unexpected mode: #{mode[2]}" if mode[2] != 0
@mem[r3] = a + b @mem[r] = a + b
@ip += 4 @ip += 4
when 2 when 2
r1 = @mem[@ip + 1] a = read(@ip + 1, mode[0])
r2 = @mem[@ip + 2] b = read(@ip + 2, mode[1])
r3 = @mem[@ip + 3] r = @mem[@ip + 3]
a = param(r1, mode[0])
b = param(r2, mode[1])
raise StandardError, "unexpected mode: #{mode[2]}" if mode[2] != 0 raise StandardError, "unexpected mode: #{mode[2]}" if mode[2] != 0
@mem[r3] = a * b @mem[r] = a * b
@ip += 4 @ip += 4
when 3 when 3
r1 = @mem[@ip + 1] r = @mem[@ip + 1]
raise StandardError, "unexpected mode: #{mode[0]}" if mode[0] != 0 raise StandardError, "unexpected mode: #{mode[0]}" if mode[0] != 0
@mem[r1] = user_input.nil? ? input : user_input.call @mem[r] = user_input.nil? ? input : user_input.call
@ip += 2 @ip += 2
when 4 when 4
r1 = @mem[@ip + 1] output = read(@ip + 1, mode[0])
output = param(r1, mode[0])
puts "output: #{output}" puts "output: #{output}"
@ip += 2 @ip += 2
when 5 when 5
r1 = @mem[@ip + 1] a = read(@ip + 1, mode[0])
r2 = @mem[@ip + 2] b = read(@ip + 2, mode[1])
a = param(r1, mode[0]) @ip = a.zero? ? @ip + 3 : b
b = param(r2, mode[1])
if !a.zero?
@ip = b
else
@ip += 3
end
when 6 when 6
r1 = @mem[@ip + 1] a = read(@ip + 1, mode[0])
r2 = @mem[@ip + 2] b = read(@ip + 2, mode[1])
a = param(r1, mode[0]) @ip = a.zero? ? b : @ip + 3
b = param(r2, mode[1])
if a.zero?
@ip = b
else
@ip += 3
end
when 7 when 7
r1 = @mem[@ip + 1] a = read(@ip + 1, mode[0])
r2 = @mem[@ip + 2] b = read(@ip + 2, mode[1])
r3 = @mem[@ip + 3] r = @mem[@ip + 3]
a = param(r1, mode[0])
b = param(r2, mode[1])
raise StandardError, "unexpected mode: #{mode[2]}" if mode[2] != 0 raise StandardError, "unexpected mode: #{mode[2]}" if mode[2] != 0
@mem[r3] = a < b ? 1 : 0 @mem[r] = a < b ? 1 : 0
@ip += 4 @ip += 4
when 8 when 8
r1 = @mem[@ip + 1] a = read(@ip + 1, mode[0])
r2 = @mem[@ip + 2] b = read(@ip + 2, mode[1])
r3 = @mem[@ip + 3] r = @mem[@ip + 3]
a = param(r1, mode[0])
b = param(r2, mode[1])
raise StandardError, "unexpected mode: #{mode[2]}" if mode[2] != 0 raise StandardError, "unexpected mode: #{mode[2]}" if mode[2] != 0
@mem[r3] = a == b ? 1 : 0 @mem[r] = a == b ? 1 : 0
@ip += 4 @ip += 4
when 99 when 99
raise DoneExecuting raise DoneExecuting
@ -185,6 +165,10 @@ module Intcode
end end
end end
def read(addr, mode)
param(@mem[addr], mode)
end
# Operators # Operators
def add; end def add; end