[2016][ruby][23.0]
change okrorquwopxtlrqtrxykrmpruzuqwwry
commit 55dd153911113720d0e52b2c171552f508cb8a82
author Alpha Chen <alpha.chen@gmail.com>
date
parent mzulkwup
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__