1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
registers = { ?a => 0, ?b => 0, ?c => 1, ?d => 0 }
pc = 0
data = DATA.each_line.to_a
while pc < data.size
line = data[pc]
case line
when /cpy ([a-d]|\d+) ([a-d])/
value = registers.fetch($1) { $1.to_i }
registers[$2] = value
pc += 1
when /inc ([a-d])/
registers[$1] += 1
pc += 1
when /dec ([a-d])/
registers[$1] -= 1
pc += 1
when /jnz ([a-d]|\d+) (-?\d+)/
value = registers.fetch($1) { $1.to_i }
pc += value.zero? ? 1 : $2.to_i
else
raise "invalid line: #{line}"
end
end
p registers
__END__