diff --git a/ruby/day_23.rb b/ruby/day_23.rb
new file mode 100644
index 0000000..9330ebf
--- /dev/null
+++ b/ruby/day_23.rb
@@ -0,0 +1,86 @@
+class Computer < Struct.new(:instructions)
+ INSTRUCTIONS = {
+ hlf: ->(c,r) { c.registers[r] /= 2; c.pc += 1 },
+ tpl: ->(c,r) { c.registers[r] *= 3; c.pc += 1 },
+ inc: ->(c,r) { c.registers[r] += 1; c.pc += 1 },
+ jmp: ->(c,o) { c.pc += o.to_i },
+ jie: ->(c,r,o) { c.pc += (c.registers[r].even?) ? o.to_i : 1 },
+ jio: ->(c,r,o) { c.pc += (c.registers[r] == 1) ? o.to_i : 1 },
+ }
+
+ attr_reader :registers
+ attr_accessor :pc
+
+ def initialize(*)
+ super
+
+ @registers = Hash.new(0)
+ @pc = 0
+ end
+
+ def run!
+ loop do
+ instruction, *args = self.instructions[self.pc]
+ break if instruction.nil?
+
+ INSTRUCTIONS[instruction.to_sym].call(self, *args)
+ end
+ end
+end
+
+instructions = DATA.read.split("\n").map {|line| line.split(/,? /) }
+
+c = Computer.new(instructions)
+c.run!
+p c.registers
+
+__END__
+jio a, +19
+inc a
+tpl a
+inc a
+tpl a
+inc a
+tpl a
+tpl a
+inc a
+inc a
+tpl a
+tpl a
+inc a
+inc a
+tpl a
+inc a
+inc a
+tpl a
+jmp +23
+tpl a
+tpl a
+inc a
+inc a
+tpl a
+inc a
+inc a
+tpl a
+inc a
+tpl a
+inc a
+tpl a
+inc a
+tpl a
+inc a
+inc a
+tpl a
+inc a
+inc a
+tpl a
+tpl a
+inc a
+jio a, +8
+inc b
+jie a, +4
+tpl a
+inc a
+jmp +2
+hlf a
+jmp -7