> It looks like it's been 48 hours

Already. Ok, so here is mine.


#!/usr/bin/env ruby

def tm(rules, q, input)
    directions = {'L' => -1, 'R' => 1}
    tape = input ? input.split(//) : []
    p = 0
    loop do
        q, c, d = rules[[q, tape[p] || '_']]
        return tape.join unless q
        tape[p] = c == '_' ? nil : c
        p += directions[d] || raise('Unknown direction: %s' % d)
        if p == -1
            tape.unshift(nil)
            p = 0
        end
    end
end

def read_rules(file)
    rules = {}
    q = nil
    File.readlines(file).each do |l|
        a = l.scan(/#|\S+/)
        next if a[0] == '#' or a.empty?
        q ||= a[0]
        rules[a[0,2]] = a[2,5]
    end
    return [rules, q]
end

if __FILE__ == $0
    file, input = ARGV
    puts tm(*read_rules(file), input)
end