回答してみる

昨日書いた問題をやってみる。

何も考えずただただ書きたいように書いてみた。

def usage
    puts "usage: #{$PROGRAM_NAME} mad_libs_templage"
    exit
end

usage unless ARGV.size == 1

result  =  String.new
reuse_map = Hash.new
stack = Array.new

open(ARGV.shift).each_line do |line|
    line.split(/(\(\(|\)\))/).each do |token|
        if token == '))'
            prompt = stack.pop
            stack.pop # '(('を空読み
            raise "Syntax error near by '#{prompt}'" unless stack.empty?

            if prompt.index(/:/)
                tag, new_prompt = prompt.split(/:/)
                print "#{new_prompt} :"
                s = gets.chomp
                result << s
                reuse_map[tag] = s
            else
                s = reuse_map[prompt]

                unless s
                    print "#{prompt} :"
                    s = gets.chomp
                end

                result << s
            end

        elsif token == '((' or not stack.empty?
            stack.push token
        else
            result << token
        end
    end
end

print result

昨日の例題をファイルに書いてこのスクリプトに読ませると、色々聞いてくるので答えてあげると最後に'(('と'))'の部分を埋めて表示してくれる。
工夫したところは特にない、今は反省している

まぁあれだ書いてて思ったのは今更言うまでもないが、Rubyは便利ってこと。Javaで書いてたらこんなに簡単に作れなかったなきっと。

さてさて明日は解答を見てみよう。
どんなテクニックが使われているか楽しみ:-)

続く