diff options
Diffstat (limited to 'day10/part2.rb')
-rw-r--r-- | day10/part2.rb | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/day10/part2.rb b/day10/part2.rb new file mode 100644 index 0000000..461f275 --- /dev/null +++ b/day10/part2.rb @@ -0,0 +1,50 @@ +class CPU + def initialize + @x = 1 + @cycle = 1 + @iq = [] + end + + attr_reader :x, :cycle + + def enq(op, arg = 0) + @iq << [ + arg, + case op + when 'noop'; 1 + when 'addx'; 2 + end + ] + end + + def done? + @iq.empty? + end + + def clock + istr = @iq[0] + istr[1] -= 1 + if istr[1] == 0 + @x += istr[0] + @iq.shift + end + @cycle += 1 + end +end + +cpu = CPU.new + +istrs = $stdin.readlines.map(&:strip).map(&:split) +istrs.each do |istr| + cpu.enq(istr[0], istr[1]&.to_i || 0) +end + +until cpu.cycle == 241 + hp = (cpu.cycle - 1) % 40 + px = (hp - cpu.x).abs < 2 + + print px ? ?█ : ?\s + puts if hp == 39 + + cpu.clock +end |