registers, program = DATA.read.split("\n\n") a, b, c = registers.scan(/\d+/).map(&:to_i) program = program.scan(/\d+/).map(&:to_i) combo = ->(operand) { case operand when 0, 1, 2, 3 then operand when 4 then a when 5 then b when 6 then c else fail end } ip = 0 out = [] while (0...program.size).cover?(ip) opcode = program.fetch(ip) operand = program.fetch(ip+1) case opcode when 0 a = (a / 2**combo[operand]).to_i ip += 2 when 1 b = b ^ operand ip += 2 when 2 b = combo[operand] % 8 ip += 2 when 3 if a.zero? ip += 2 else ip = operand end when 4 b = b ^ c ip += 2 when 5 out << combo[operand] % 8 ip += 2 when 6 b = (a / 2**combo[operand]).to_i ip += 2 when 7 c = (a / 2**combo[operand]).to_i ip += 2 else fail end end puts out.join(?,) __END__ Register A: 729 Register B: 0 Register C: 0 Program: 0,1,5,4,3,0