challenge 四字熟語パズルの作成

与えられた四字熟語のリストから下のように四角く配置することのできる熟語の組み合わせを探すプログラムを作成してください。

出力例:

無憂無風
礼  林
千  火
万水千山

知行合一
者  筆
不  勾
言語道断

四字熟語は左から右、上から下へ読むものとします。また右上隅の漢字と左下隅の漢字は異なるものでなければいけません。

四字熟語のデータは扱いやすい形(たとえばユニコード文字列のリスト)で与えられていると仮定して構いません。サンプルデータが必要であれば FOR Microsoft IME The四字熟語辞典(データ / 文書作成) にテキスト形式のデータが入っているのでそれを使えると思います。

問題の規模の参考までに、40行程度のPythonスクリプトでこのデータ(重複をのぞいて8312件)を処理してみたところ2.4GHzのCPUで13秒程度かかりました。結果は8133件出力されました。

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])

Index

Feed

Other

Link

Pathtraq

loading...