diff options
author | Nat Lasseter <Nat Lasseter nathan@bytemark.co.uk> | 2017-12-21 00:56:51 +0000 |
---|---|---|
committer | Nat Lasseter <Nat Lasseter nathan@bytemark.co.uk> | 2017-12-21 00:56:51 +0000 |
commit | 8f62ee7864320794b3f92548e122b4d6eded02c2 (patch) | |
tree | e92bcaba02a42744ea9c51fa3fd69237a3802523 /day18/part2 | |
parent | f2797d77b2abdc48bb90c716563a69d3790891f0 (diff) | |
parent | 89da553e582fc65c0d1e1007216e6ac5c1d6e8a4 (diff) |
Day18 Part2
Diffstat (limited to 'day18/part2')
-rwxr-xr-x | day18/part2 | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/day18/part2 b/day18/part2 new file mode 100755 index 0000000..862e5ce --- /dev/null +++ b/day18/part2 @@ -0,0 +1,90 @@ +#!/usr/bin/env ruby + +def valof(reg_file, reg_or_int) + if reg_or_int >= 'a' && reg_or_int <= 'z' then + return reg_file[reg_or_int] || 0 + end + return reg_or_int.to_i +end + +input = $stdin.readlines.map(&:chomp) + +reg0 = {"p" => 0} +reg1 = {"p" => 1} +pc0 = 0 +pc1 = 0 +q0 = [] +q1 = [] +running0 = true +running1 = true +count = 0 + +loop do + running0 = false if pc0 < 0 || pc0 >= input.length + running1 = false if pc1 < 0 || pc1 >= input.length + + if running0 then + istr = input[pc0].split + case istr[0] + when 'snd' + q1 << valof(reg0, istr[1]) + when 'set' + reg0[istr[1]] = valof(reg0, istr[2]) + when 'add' + reg0[istr[1]] = valof(reg0, istr[1]) + valof(reg0, istr[2]) + when 'mul' + reg0[istr[1]] = valof(reg0, istr[1]) * valof(reg0, istr[2]) + when 'mod' + reg0[istr[1]] = valof(reg0, istr[1]) % valof(reg0, istr[2]) + when 'rcv' + if q0.empty? then + pc0 -= 1 + else + reg0[istr[1]] = q0.shift + end + when 'jgz' + if valof(reg0, istr[1]) > 0 then + pc0 += valof(reg0, istr[2]) + pc0 -= 1 + end + end + pc0 += 1 + end + + if running1 then + istr = input[pc1].split + case istr[0] + when 'snd' + q0 << valof(reg1, istr[1]) + count += 1 + when 'set' + reg1[istr[1]] = valof(reg1, istr[2]) + when 'add' + reg1[istr[1]] = valof(reg1, istr[1]) + valof(reg1, istr[2]) + when 'mul' + reg1[istr[1]] = valof(reg1, istr[1]) * valof(reg1, istr[2]) + when 'mod' + reg1[istr[1]] = valof(reg1, istr[1]) % valof(reg1, istr[2]) + when 'rcv' + if q1.empty? then + pc1 -= 1 + else + reg1[istr[1]] = q1.shift + end + when 'jgz' + if valof(reg1, istr[1]) > 0 then + pc1 += valof(reg1, istr[2]) + pc1 -= 1 + end + end + pc1 += 1 + end + + break if !running0 && !running1 + break if input[pc0].split[0] == 'rcv' && q0.empty? && !running1 + break if input[pc1].split[0] == 'rcv' && q1.empty? && !running0 + break if input[pc0].split[0] == 'rcv' && q0.empty? && + input[pc1].split[0] == 'rcv' && q1.empty? +end + +puts count |