任天堂の参考課題
採用情報:キャリア採用 - ネットワークアプリケーションエンジニア(参考課題)
見かけたのでやってみたら、こんな時間に・・。
どうでもいいけど、ウチの会社も採用ページにこういうのを載せるくらいなエンジニアリングの会社になって欲しい。
---
wikipediaと正規表現の組み合わせの力業。
もっと格好良くやりたいけど、俺じゃあこれが限界だなぁ。
あと、ルーズにサジェストならもっと最適化できるけど、完璧に一語を出すとなるとやっぱり力業になりがち。
DBに突っ込んでそっちにIndexを任せればもっと早くなるけどねぇ。
$KCODE='UTF8' dic = open('./jawiki-20120220-all-titles-in-ns0').read.split("\n")
def search_by_miss(keyword, dic)
pattern = "^.{0,1}#{keyword.split(//).join(".{0,1}")}.{0,1}$"
keyword_size = keyword.split(//).size
dic[keyword_size+1].select{|word|
word.match(/#{pattern}/)
}.sort_by{|i| i.size}.first
enddef search_by_over(keyword, dic)
chars = keyword.split(//)
array = []
chars.size.times{|i|
array.push "#{i == 0 ? '' : chars[0..i-1]}#{i == chars.size ? '' : chars[i+1..-1]}"
}
pattern = "^(#{array.join("|")})$"
keyword_size = keyword.split(//).size
dic[keyword_size-1].select{|word|
word.match(/#{pattern}/)
}.sort_by{|i| i.size}.first
enddef search_by_none(keyword, dic)
chars = keyword.split(//)
array = []
chars.size.times{|i|
array.push "#{i == 0 ? '' : chars[0..i-1]}.#{i == chars.size ? '' : chars[i+1..-1]}"
}
pattern = "^(#{array.join("|")})$"
keyword_size = keyword.split(//).size
dic[keyword_size].select{|word|
word.match(/#{pattern}/)
}.sort_by{|i| num=-1;i.split(//).select{|v| num +=1; v == chars[num]}}.reverse.first
endkeywords = ['インターネト', 'プログラミングル', '東強都', '任人堂', '東京特許許許可局', 'マロオブラザーズ', 'イーサネッット', 'コソトローラ']
max_size = keywords.collect{|i| i.split(//).size}.sort.reverse.first + 1
min_size = keywords.collect{|i| i.split(//).size}.sort.first - 1hash = Hash.new
(max_size+1).times{|i|
hash[i] = Array.new
}
dic.each{|word|
size = word.split(//).size
if size >= min_size && size <= max_size then
hash[size].push word
end
}keywords.each{|word|
puts [word, search_by_none(word, hash) || search_by_miss(word, hash) || search_by_over(word, hash)].join(" => ")
}
インターネト => インターネット
プログラミングル => プログラミング
東強都 => 東京都
任人堂 => 任天堂
東京特許許許可局 => 東京特許許可局
マロオブラザーズ => マリオブラザーズ
イーサネッット => イーサネット
コソトローラ => コントローラ
| 固定リンク | コメント (4) | トラックバック (0)
最近のコメント