寝たり起きたりするうちになんとなく実装したのがソレっぽく動いた。睡眠回数が多いほうがアイデアが浮かぶに違いない。
positive_mode = [] negative_mode = [] mode = positive_mode arg_pos = 0 message[1].each_byte do |c| case c when ?+ mode = positive_mode when ?- mode = negative_mode when ?o, ?v, ?k, ?l, ?b, ?e mode << [c.chr, message[2+arg_pos]] arg_pos += 1 else mode << [c.chr, nil] end end mode = nil # when message is ["#chokan", "-o+v", "chokan", "chokan"] p negative_mode #=> [["o", "chokan"]] p positive_mode #=> [["v", "chokan"]]
うっさい