2006-03-03から1日間の記事一覧

longest match

Enumerable#injectを使ってみた。 require 'strscan' def longest_match(scanner, res) sz,regexp = res.inject([0,nil]) {|(sz,regexp),re| x = scanner.match?(re) (x ||= 0) > sz ? [x,re] : [sz,regexp] } yield(regexp, regexp ? scanner.scan(regexp) …

longest match

最長最左マッチ。 require 'strscan' def longest_match(scanner, res) sz = 0 regexp = nil res.each {|re| x = scanner.match?(re) if (x ||= 0) > sz regexp = re sz = x end } yield(regexp, regexp ? scanner.scan(regexp) : nil) end longest_match(St…

私には珍しく、カリカリ最適化してみる。*1 injectは遅かったのでeachに変更 正規表現リテラルを定数に代入して利用 String#+をString#concatに変更 メソッド呼び出しを最小限に 正規表現を見直して、eachのループ回数を最小限に 末尾再帰になっているメソッ…