#!/usr/bin/env ruby class Program def initialize(program) @mem = program @pc = 0 end def dis_next opcode = @mem[@pc] % 100 p3, p2, p1 = ("%03d" % (@mem[@pc] / 100)).chars print "#{@pc}: " case opcode when 1 puts "add #{Program.sigil(p1)}#{@mem[@pc+1]}, #{Program.sigil(p2)}#{@mem[@pc+2]}, #{Program.sigil(p3)}#{@mem[@pc+3]}" @pc += 4 when 2 puts "mul #{Program.sigil(p1)}#{@mem[@pc+1]}, #{Program.sigil(p2)}#{@mem[@pc+2]}, #{Program.sigil(p3)}#{@mem[@pc+3]}" @pc += 4 when 3 puts "inp #{Program.sigil(p1)}#{@mem[@pc+1]}" @pc += 2 when 4 puts "out #{Program.sigil(p1)}#{@mem[@pc+1]}" @pc += 2 when 5 puts "jnz #{Program.sigil(p1)}#{@mem[@pc+1]}, #{Program.sigil(p2)}#{@mem[@pc+2]}" @pc += 3 when 6 puts "jez #{Program.sigil(p1)}#{@mem[@pc+1]}, #{Program.sigil(p2)}#{@mem[@pc+2]}" @pc += 3 when 7 puts "tlt #{Program.sigil(p1)}#{@mem[@pc+1]}, #{Program.sigil(p2)}#{@mem[@pc+2]}, #{Program.sigil(p3)}#{@mem[@pc+3]}" @pc += 4 when 8 puts "teq #{Program.sigil(p1)}#{@mem[@pc+1]}, #{Program.sigil(p2)}#{@mem[@pc+2]}, #{Program.sigil(p3)}#{@mem[@pc+3]}" @pc += 4 when 9 puts "arb #{Program.sigil(p1)}#{@mem[@pc+1]}" @pc += 2 when 99 puts "hlt" @pc += 1 else puts "@dat #{@mem[@pc]}" @pc += 1 end end def dis_all until @pc >= @mem.length do dis_next end end private def self.sigil(p) case p when "0" "@" when "2" "&" end end end exit 1 if ARGV.length != 1 source = ARGV.shift.strip input = File.readlines(source)[0].strip.split(",").map(&:to_i) p = Program.new(input) p.dis_all