四字熟語パズルの作成
Posted feedbacks - Ruby
サンプルデータ(8312件),CPU1.8GHz,3秒で14,456件出力されました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | def jukugo(f)
r, ht, a, h, t = {}, {}, {}, {}, {}
open(f) {|fin|
cnt = 0
while line = fin.gets
a[cnt] = line
h[line[0..1]] = [] if not h[line[0..1]]
h[line[0..1]] << cnt #--- head
t[cnt] = line[6..7] #--- tail
cnt+=1
end
}
t.each{|c,i|
next if not h[i]
hh = a[c][0..1]
h[i].each{|k|
tt = a[k][6..7]
next if hh == tt
hhtt = hh+tt
ht[hhtt] = [] if not ht[hhtt]
ht[hhtt].each {|m|
mm = [a[m[0]], a[m[1]], a[c], a[k]].flatten.sort
r[sprintf("%s\n",mm)] = true if mm.uniq.size == 4
}
ht[hhtt] << [c, k]
}
}
r.each {|i|puts i}
end
jukugo(ARGV[0])
|

にしお
#3644()
Rating-1/1=-1.00
与えられた四字熟語のリストから下のように四角く配置することのできる熟語の組み合わせを探すプログラムを作成してください。
出力例:
四字熟語は左から右、上から下へ読むものとします。また右上隅の漢字と左下隅の漢字は異なるものでなければいけません。
四字熟語のデータは扱いやすい形(たとえばユニコード文字列のリスト)で与えられていると仮定して構いません。サンプルデータが必要であれば FOR Microsoft IME The四字熟語辞典(データ / 文書作成) にテキスト形式のデータが入っているのでそれを使えると思います。
問題の規模の参考までに、40行程度のPythonスクリプトでこのデータ(重複をのぞいて8312件)を処理してみたところ2.4GHzのCPUで13秒程度かかりました。結果は8133件出力されました。
[ reply ]