def push_char_index(chrs, indexes, depth = 0) # 最小の文字を調べる minchar = "{" indexes.each do |index| if chrs[index].length > depth && chrs[index][depth] < minchar minchar = chrs[index][depth] end end # 最小の文字の位置を調べる minchar_indexes = [] indexes.each do |index| if chrs[index].length > depth && chrs[index][depth] == minchar minchar_indexes << index end end # 最小の文字が1つしかないならその文字のindexを返す # 2つ以上ある場合で、次の文字があるならばその文字で調べる # indexes内のすべてのindexについて次の文字が存在しない場合、indexes[0]を返す if minchar_indexes.length == 1 return minchar_indexes[0] elsif minchar_indexes.length == 0 return indexes[0] else return push_char_index(chrs, minchar_indexes, depth + 1) end end def any_char_is(chrs, j_char) chrs.each do |char| return false if char[0] != j_char end return true end # トップレベルの開始 input_count = gets.to_i # strs配列に文字列を格納 strs = [] input_count.times do strs << gets.chomp! end # 文字列を分割した配列を配列chrsに格納 chrs = [] strs.each do |str| chrs << str.split("") end # メソッドに渡すindexes配列の作成 ([0, 1, 2, ... ]) indexes = (0...chrs.length).collect{ |i| i} sort = "" # chrsが空になるまで until any_char_is(chrs, "~") do # 追加すべき文字のインデックスを取得 index = push_char_index(chrs, indexes) # 出力文字列sortに、追加すべき文字を挿入 sort.concat(chrs[index][0]) # 追加した文字をchrs[index]から削除 chrs[index].shift # chrs[index]が空になったら番兵として~を追加 if chrs[index].length == 0 chrs[index] << "~" end end puts sort