#
# [odai_11_911 単語のグルーピング]
# @param h [type] [グルーピング用ハッシュ]
# @param words [type] [単語リスト。['goose', 'pigeon']など]
# 戦略:
# ・Hashを使う(単語 => グループ番号)
# ・単語リストを入力から得るたびに、既存のハッシュ中に該当するグループ番号が有るか調べる
# ・入力単語が全て既存のグループになければ、既存番号+1を割り当てる。
# ・入力単語が1つでも全て既存のグループにあれば、得た番号リストの小さい方に紐つける。
# 同時に、得た番号の大きい方は、番号の小さい方に紐つける。
# @return [Hash] [入力単語リスト1行分を反映した後のハッシュ]
def odai_11_911(h, words)
w = (words.map { |e| h[e] }).compact
# 新規wordの場合
if w == []
vmax = h.values.compact.uniq
vnext = vmax == [] ? 0 : vmax.max + 1
words.map { |e| h[e] = vnext }
return h
end
# 既存wordの場合
vmin = w.min
vmax = w.max
words.map { |e| h[e] = vmin }
h.map { |k, v| h[k] = vmin if v == vmax }
h
end
h = {}
while w = gets
w = w.chomp
words = w.split(' ')
h = odai_11_911(h, words)
end
h.values.uniq.map do |n|
p (h.map { |k, v| k if v == n }).compact.sort
end
IwojIFtvZGFpXzExXzkxMSDljZjoqp7jga7jgrDjg6vjg7zjg5Tjg7PjgrBdCiMgQHBhcmFtIGggW3R5cGVdIFvjgrDjg6vjg7zjg5Tjg7PjgrDnlKjjg4/jg4Pjgrfjg6VdCiMgQHBhcmFtIHdvcmRzIFt0eXBlXSBb5Y2Y6Kqe44Oq44K544OI44CCWydnb29zZScsICdwaWdlb24nXeOBquOBqV0KIyDmiKbnlaXvvJoKIyAgIOODu0hhc2jjgpLkvb/jgYYo5Y2Y6KqeID0+IOOCsOODq+ODvOODl+eVquWPtykKIyAgIOODu+WNmOiqnuODquOCueODiOOCkuWFpeWKm+OBi+OCieW+l+OCi+OBn+OBs+OBq+OAgeaXouWtmOOBruODj+ODg+OCt+ODpeS4reOBq+ipsuW9k+OBmeOCi+OCsOODq+ODvOODl+eVquWPt+OBjOacieOCi+OBi+iqv+OBueOCiwojICAg44O75YWl5Yqb5Y2Y6Kqe44GM5YWo44Gm5pei5a2Y44Gu44Kw44Or44O844OX44Gr44Gq44GR44KM44Gw44CB5pei5a2Y55Wq5Y+377yLMeOCkuWJsuOCiuW9k+OBpuOCi+OAggojICAg44O75YWl5Yqb5Y2Y6Kqe44GMMeOBpOOBp+OCguWFqOOBpuaXouWtmOOBruOCsOODq+ODvOODl+OBq+OBguOCjOOBsOOAgeW+l+OBn+eVquWPt+ODquOCueODiOOBruWwj+OBleOBhOaWueOBq+e0kOOBpOOBkeOCi+OAggojICAgICAgIOWQjOaZguOBq+OAgeW+l+OBn+eVquWPt+OBruWkp+OBjeOBhOaWueOBr+OAgeeVquWPt+OBruWwj+OBleOBhOaWueOBq+e0kOOBpOOBkeOCi+OAggojIEByZXR1cm4gW0hhc2hdIFvlhaXlipvljZjoqp7jg6rjgrnjg4gx6KGM5YiG44KS5Y+N5pig44GX44Gf5b6M44Gu44OP44OD44K344OlXQpkZWYgb2RhaV8xMV85MTEoaCwgd29yZHMpCiAgdyA9ICh3b3Jkcy5tYXAgeyB8ZXwgaFtlXSB9KS5jb21wYWN0CgogICMg5paw6KaPd29yZOOBruWgtOWQiAogIGlmIHcgPT0gW10KICAgIHZtYXggPSBoLnZhbHVlcy5jb21wYWN0LnVuaXEKICAgIHZuZXh0ID0gdm1heCA9PSBbXSA/IDAgOiB2bWF4Lm1heCArIDEKICAgIHdvcmRzLm1hcCB7IHxlfCBoW2VdID0gdm5leHQgfQogICAgcmV0dXJuIGgKICBlbmQKCiAgIyDml6LlrZh3b3Jk44Gu5aC05ZCICiAgdm1pbiA9IHcubWluCiAgdm1heCA9IHcubWF4CiAgd29yZHMubWFwIHsgfGV8IGhbZV0gPSB2bWluIH0KICBoLm1hcCB7IHxrLCB2fCBoW2tdID0gdm1pbiBpZiB2ID09IHZtYXggfQogIGgKZW5kCgpoID0ge30Kd2hpbGUgdyA9IGdldHMKICB3ID0gdy5jaG9tcAogIHdvcmRzID0gdy5zcGxpdCgnICcpCiAgaCA9IG9kYWlfMTFfOTExKGgsIHdvcmRzKQplbmQKCmgudmFsdWVzLnVuaXEubWFwIGRvIHxufAogIHAgKGgubWFwIHsgfGssIHZ8IGsgaWYgdiA9PSBuIH0pLmNvbXBhY3Quc29ydAplbmQ=
["dove", "duck", "goose", "lark", "pigeon"]
["cat", "dog", "horse", "rhino"]
["cod", "eel", "goldfish", "squid"]