about summary refs log tree commit diff
path: root/day21.rb
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2019-11-28 17:38:10 +0100
committerLeah Neukirchen <leah@vuxu.org>2019-11-28 17:38:10 +0100
commite12436c99bb04897d6344b6351d0336e4c627573 (patch)
tree74f8afb9de5d2a466e5fe6225df3661e1280519e /day21.rb
parent05050c3b5e20d5d475894788df6c31f867d2c51a (diff)
downloadadventofcode2018-e12436c99bb04897d6344b6351d0336e4c627573.tar.gz
adventofcode2018-e12436c99bb04897d6344b6351d0336e4c627573.tar.xz
adventofcode2018-e12436c99bb04897d6344b6351d0336e4c627573.zip
add rest HEAD master
Diffstat (limited to 'day21.rb')
-rw-r--r--day21.rb67
1 files changed, 67 insertions, 0 deletions
diff --git a/day21.rb b/day21.rb
new file mode 100644
index 0000000..a64a16a
--- /dev/null
+++ b/day21.rb
@@ -0,0 +1,67 @@
+insn = [:eqri, :seti, :eqir, :eqrr, :addi, :setr, :gtrr, :gtir, :muli, :bori, :bani, :borr, :gtri, :banr, :addr, :mulr]
+
+def op(cmd, regs)
+  regs2 = regs.dup
+
+  case cmd[0]
+  when :addr; regs2[cmd[3]] = regs[cmd[1]] + regs[cmd[2]]
+  when :addi; regs2[cmd[3]] = regs[cmd[1]] + cmd[2]
+  when :mulr; regs2[cmd[3]] = regs[cmd[1]] * regs[cmd[2]]
+  when :muli; regs2[cmd[3]] = regs[cmd[1]] * cmd[2]
+  when :banr; regs2[cmd[3]] = regs[cmd[1]] & regs[cmd[2]]
+  when :bani; regs2[cmd[3]] = regs[cmd[1]] & cmd[2]
+  when :borr; regs2[cmd[3]] = regs[cmd[1]] | regs[cmd[2]]
+  when :bori; regs2[cmd[3]] = regs[cmd[1]] | cmd[2]
+  when :setr; regs2[cmd[3]] = regs[cmd[1]]
+  when :seti; regs2[cmd[3]] = cmd[1]
+  when :gtir; regs2[cmd[3]] = cmd[1] > regs[cmd[2]] ? 1 : 0
+  when :gtri; regs2[cmd[3]] = regs[cmd[1]] > cmd[2] ? 1 : 0
+  when :gtrr; regs2[cmd[3]] = regs[cmd[1]] > regs[cmd[2]] ? 1 : 0
+  when :eqri; regs2[cmd[3]] = regs[cmd[1]] == cmd[2] ? 1 : 0
+  when :eqir; regs2[cmd[3]] = cmd[1] == regs[cmd[2]] ? 1 : 0
+  when :eqrr; regs2[cmd[3]] = regs[cmd[1]] == regs[cmd[2]] ? 1 : 0
+  end
+
+  regs2
+end
+
+rip, *program = File.readlines("day21")
+
+rip = rip.scan(/\d/)[0].to_i
+
+program.map! { |line|
+  o,a,b,c = line.split
+  [o.to_sym, a.to_i, b.to_i, c.to_i]
+}
+
+regs = [0]*6
+regs[0] = 0
+ip = 0
+
+or5 = 0
+
+seen = []
+
+# 3_000_000.times {
+loop {
+  break  if ip < 0 || ip >= program.size
+
+  regs[rip] = ip
+  regs = op(program[ip], regs)
+
+  if program[ip][0] == :eqrr
+    p regs[5]
+    if seen.include? regs[5]
+      break
+    end
+    seen << regs[5]
+  end
+
+  ip = regs[rip] + 1
+}
+
+p regs
+p seen
+
+# 7224964
+# 13813247 first before duplicate