class A0A0
OPS = Hash[*%w[S + D - M * L <=>]]
def initialize source
@program = *source.lines
@line = @program.index { |p| p['>'] } || 0
@program.map! { |p| p.scan /\w-?\d+/ }
end
def debug
@program.each_with_index do |p, i|
puts "%c%d\t%s" % ['* '[i <=> @line], i, (p || []) * ' ']
end
puts '-' * 20
end
def line
@program[@line]
end
def operand modify
v = line.index { |l| l['V'] }
line[v] = line[v].sub(/-?\d+/) { |o| modify[o.to_i] } rescue nil
end
def run
until line.empty?
debug if $DEBUG
insn = line.shift or exit
arg = insn[1..-1].to_i
case insn
when /A/ then (@program[@line + arg] ||= []).concat line
when /C/ then @program[@line + arg] = []
when /G/ then @line += arg
when /V/ then line[0].sub! /-?\d+/, arg.to_s
when /O/ then print arg
when /P/ then print (arg % 256).chr
when /I/ then operand -> _ { STDIN.getc.send %w[to_i ord][arg] }
when /([SDML])/ then operand -> o { o.send OPS[$1], arg }
end
@line += 1 unless insn['G']
break unless line
end
end
end
cat = "A0 A0
A0 C3 G1 G1 A0
A0 I1 V0 P0 A0
A0 A1 G-3 G-3 A0
G-3"
A0A0.new(cat).run
Y2xhc3MgQTBBMAogIE9QUyA9IEhhc2hbKiV3W1MgKyBEIC0gTSAqIEwgPD0+XV0KCiAgZGVmIGluaXRpYWxpemUgc291cmNlCiAgICBAcHJvZ3JhbSA9ICpzb3VyY2UubGluZXMKICAgIEBsaW5lID0gQHByb2dyYW0uaW5kZXggeyB8cHwgcFsnPiddIH0gfHwgMAogICAgQHByb2dyYW0ubWFwISB7IHxwfCBwLnNjYW4gL1x3LT9cZCsvIH0KICBlbmQKCiAgZGVmIGRlYnVnCiAgICBAcHJvZ3JhbS5lYWNoX3dpdGhfaW5kZXggZG8gfHAsIGl8CiAgICAgIHB1dHMgIiVjJWRcdCVzIiAlIFsnKiAnW2kgPD0+IEBsaW5lXSwgaSwgKHAgfHwgW10pICogJyAnXQogICAgZW5kCiAgICBwdXRzICctJyAqIDIwCiAgZW5kCgogIGRlZiBsaW5lCiAgICBAcHJvZ3JhbVtAbGluZV0KICBlbmQKCiAgZGVmIG9wZXJhbmQgbW9kaWZ5CiAgICAgIHYgPSBsaW5lLmluZGV4IHsgfGx8IGxbJ1YnXSB9CiAgICAgIGxpbmVbdl0gPSBsaW5lW3ZdLnN1YigvLT9cZCsvKSB7IHxvfCBtb2RpZnlbby50b19pXSB9IHJlc2N1ZSBuaWwKICBlbmQKCiAgZGVmIHJ1bgogICAgdW50aWwgbGluZS5lbXB0eT8KICAgICAgZGVidWcgaWYgJERFQlVHCiAgICAgIGluc24gPSBsaW5lLnNoaWZ0IG9yIGV4aXQKICAgICAgYXJnID0gaW5zblsxLi4tMV0udG9faQoKICAgICAgY2FzZSBpbnNuCiAgICAgIHdoZW4gL0EvIHRoZW4gKEBwcm9ncmFtW0BsaW5lICsgYXJnXSB8fD0gW10pLmNvbmNhdCBsaW5lCiAgICAgIHdoZW4gL0MvIHRoZW4gQHByb2dyYW1bQGxpbmUgKyBhcmddID0gW10KICAgICAgd2hlbiAvRy8gdGhlbiBAbGluZSArPSBhcmcKICAgICAgd2hlbiAvVi8gdGhlbiBsaW5lWzBdLnN1YiEgLy0/XGQrLywgYXJnLnRvX3MKICAgICAgd2hlbiAvTy8gdGhlbiBwcmludCBhcmcKICAgICAgd2hlbiAvUC8gdGhlbiBwcmludCAoYXJnICUgMjU2KS5jaHIKICAgICAgd2hlbiAvSS8gdGhlbiBvcGVyYW5kIC0+IF8geyBTVERJTi5nZXRjLnNlbmQgJXdbdG9faSBvcmRdW2FyZ10gfQogICAgICB3aGVuIC8oW1NETUxdKS8gdGhlbiBvcGVyYW5kIC0+IG8geyBvLnNlbmQgT1BTWyQxXSwgYXJnIH0KICAgICAgZW5kCgogICAgICBAbGluZSArPSAxIHVubGVzcyBpbnNuWydHJ10KICAgICAgYnJlYWsgdW5sZXNzIGxpbmUKICAgIGVuZAogIGVuZAplbmQKCmNhdCA9ICJBMCBBMApBMCBDMyBHMSBHMSBBMApBMCBJMSBWMCBQMCBBMApBMCBBMSBHLTMgRy0zIEEwCkctMyIKQTBBMC5uZXcoY2F0KS5ydW4=
U29mdCBraXR0eSwKd2FybSBraXR0eSwKbGl0dGxlIGJhbGwgb2YgZnVyLgpIYXBweSBraXR0eSwKc2xlZXB5IGtpdHR5LApwdXJyLCBwdXJyLCBwdXJyLg==
Soft kitty,
warm kitty,
little ball of fur.
Happy kitty,
sleepy kitty,
purr, purr, purr.