Create Intcode module
This commit is contained in:
parent
33567160ec
commit
02849a6af9
1 changed files with 41 additions and 0 deletions
41
2019/day5/intcode.rb
Normal file
41
2019/day5/intcode.rb
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Intcode
|
||||
def self.read(filename)
|
||||
Program.new File.read(filename).split(',').map(&:to_i)
|
||||
end
|
||||
|
||||
class Program
|
||||
attr_reader :mem
|
||||
def initialize(mem)
|
||||
@mem = mem
|
||||
end
|
||||
|
||||
def run(noun, verb)
|
||||
mem = @mem.clone
|
||||
mem[1] = noun
|
||||
mem[2] = verb
|
||||
pc = 0
|
||||
loop do
|
||||
case mem[pc]
|
||||
when 1
|
||||
r1 = mem[pc + 1]
|
||||
r2 = mem[pc + 2]
|
||||
r3 = mem[pc + 3]
|
||||
mem[r3] = mem[r1] + mem[r2]
|
||||
pc += 4
|
||||
when 2
|
||||
r1 = mem[pc + 1]
|
||||
r2 = mem[pc + 2]
|
||||
r3 = mem[pc + 3]
|
||||
mem[r3] = mem[r1] * mem[r2]
|
||||
pc += 4
|
||||
when 99
|
||||
return mem[0]
|
||||
else
|
||||
raise StandardError, "unexpected opcode: #{opcode}"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Loading…
Reference in a new issue