I18nはユニークではない
$ grep -E '^i.{18}n$' /usr/share/dict/words
institutionalisation
institutionalization
internationalisation
internationalization
4件引っかかった。このうち2つはsとzの違いなので無視するにしても、I18nにはinstitutionalisationとinternationalisationの2つの候補があることがわかる。
では、I18nのような表記を行った時にユニークとなるような単語はどれだけ存在するのであろうか?
問題
I18n形式で記述した際に一意となるような単語を出力せよ。なお、単語はcase insensitiveで扱うこと。
単語の一覧は/usr/share/dict/wordsファイルに改行区切りで与えられる。
また、I18n形式とは、以下を全て満たす形式のことを言う。
- 3文字以上の単語であること
 - ある単語をI18n形式で表した時、以下のようになる
 
I18n形式の例
また、一意であるとは単語をI18n形式で表した時に、その単語意外にそのI18n形式で表される単語が存在しないことを言う。
例えばi18nはinstitutionalisation, internationalisationなど複数の単語が該当するため、一意ではない。
また、v1mはvimしか該当する単語が存在しないため、一意である1。
解答例
hash = {}
File.read('/usr/share/dict/words').each_line.map(&:chomp).map(&:downcase).uniq.each do |word|
  key = [word[0], word[-1], word.size]
  (hash[key] ||= []) << word
end
w = hash.values.select do |words|
  words.size == 1
end.flatten.select do |word|
  word.size > 2
end
puts(*w)
これを実行すると、非常に多くの単語が表示される。
$ ruby test.rb | wc -l 1160
どうやらI18n形式で一意となるような単語は1160単語存在するようだ。