diff --git a/2019/ruby/day_05.rb b/2019/ruby/day_05.rb new file mode 100644 index 0000000..b6681a9 --- /dev/null +++ b/2019/ruby/day_05.rb @@ -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)