parent
18daaa3e49
commit
ef8e420215
@ -0,0 +1,62 @@
|
|||||||
|
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
|
Loading…
Reference in new issue