diff options
author | Leah Neukirchen <leah@vuxu.org> | 2019-11-28 17:38:10 +0100 |
---|---|---|
committer | Leah Neukirchen <leah@vuxu.org> | 2019-11-28 17:38:10 +0100 |
commit | e12436c99bb04897d6344b6351d0336e4c627573 (patch) | |
tree | 74f8afb9de5d2a466e5fe6225df3661e1280519e /day21.rb | |
parent | 05050c3b5e20d5d475894788df6c31f867d2c51a (diff) | |
download | adventofcode2018-e12436c99bb04897d6344b6351d0336e4c627573.tar.gz adventofcode2018-e12436c99bb04897d6344b6351d0336e4c627573.tar.xz adventofcode2018-e12436c99bb04897d6344b6351d0336e4c627573.zip |
Diffstat (limited to 'day21.rb')
-rw-r--r-- | day21.rb | 67 |
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 |