diff --git a/2016/ruby/day_12.rb b/2016/ruby/day_12.rb
new file mode 100644
index 0000000..edaf918
--- /dev/null
+++ b/2016/ruby/day_12.rb
@@ -0,0 +1,28 @@
+registers = Hash[(?a..?d).map {|c| [c, 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__