diff --git a/2016/ruby/day_23.rb b/2016/ruby/day_23.rb
new file mode 100644
index 0000000..906c0c3
--- /dev/null
+++ b/2016/ruby/day_23.rb
@@ -0,0 +1,55 @@
+registers = { ?a => 7, ?b => 0, ?c => 0, ?d => 0 }
+pc = 0
+data = DATA.each_line.map(&:chomp).to_a
+
+while pc < data.size
+ line = data[pc]
+ puts "#{registers}"
+ puts "#{pc}: #{line}"
+
+ 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+) ([a-d]|-?\d+)/
+ value = registers.fetch($1) { $1.to_i }
+ count = registers.fetch($2) { $2.to_i }
+ pc += value.zero? ? 1 : count
+ when /tgl ([a-d]|-?\d+)/
+ value = registers.fetch($1) { $1.to_i }
+ line = data[pc + value]
+ if line.nil?
+ pc +=1
+ next
+ end
+
+ instruction, *args = line.split(/\s+/)
+
+ case args.size
+ when 1
+ instruction = (instruction == 'inc') ? 'dec' : 'inc'
+ when 2
+ instruction = (instruction == 'jnz') ? 'cpy' : 'jnz'
+ else
+ raise 'omg'
+ end
+
+ data[pc + value] = "#{instruction} #{args.join(' ')}"
+
+ pc += 1
+ else
+ puts "skipping line: #{line}"
+ pc += 1
+ end
+end
+
+p registers
+
+__END__