star-code.net

スーパー和同開珎ソルバーを作った

はじめに

和同開珎ソルバー(リンク)とスーパー和同開珎ソルバー(リンク)を作りました.

和同開珎とは,古代日本で作られた貨幣です. これに形が類似している漢字パズルのことも和同開珎と呼ばれます.

和同開珎の例

例えば,上の例だと,答えがです.

と,4 方向全てについて二字熟語が成立します.

ですが,想定していない答えが存在するかもしれません. 和同開珎ソルバーを使えば想定解以外が存在するかを確認することができます. もちろん,わからない和同開珎の解を調べることもできます.

この和同開珎をつなげて,もっと大きい和同開珎(以下,スーパー和同開珎)を作れないかと考えました. 1 時間くらいかけて手で作ったものが以下になります.

スーパー和同開珎(人力)

今回作成したスーパー和同開珎ソルバーを使うと,どうやら一意ではないらしいです. ですが,それなりにメジャーな熟語で構成している想定解があり,これは本記事の最後に載せておきます.

人力だとそれなりに時間がかかってしまいます. ですが私はプログラムが書けるので,コンピュータを頼ってみることにしました. ソルバーという名前をつけていますが,やりたかったこととしてはスーパー和同開珎の自動生成です.

作り方

兎にも角にも,熟語リストが必要です.

The JMDict Project という,日本語を中心とする多言語語彙リストを作成するプロジェクトが存在します. 今回はこちらのプロジェクトの語彙リストを用いました.

具体的には,jmdict-simplified という,JMdict を JSON フォーマットに加工されているものがあり,JSON から今回の語彙リストを作成しています.

JMdict にはマイナーな単語も数多く含まれています. ただ,common というフラグが存在しており,メジャーな単語のみをこのフラグを用いて持ってくることが可能です. そのため,今回は common フラグのみの語彙リスト,JMdict 全ての語彙リストどちらでもソルバーを動かせるようにしています. また,熟語を追加したり,NG 漢字や熟語を設定できるようにもしています.

解の探索には深さ優先探索を用いています. なるべく効率的な探索をするために,その時点で置ける漢字が最も少ないマスから優先して埋めていくように実装しました.

おわりに

最初に Rust で試しに作り,それを Web 版に移植する形で実装しています. 手元の Rust では 7x7 の盤面まで試しましたが,common 版で丸 1 日実行にかかったので,Web サイト版では 6x6 に制限しています. とはいえ Web サイト版の 6x6 はかなり実行時間的に限界で,厳しさも感じるところではあります.

想定解

はじめにで触れたスーパー和同開珎の想定解は以下です.

common フラグのみの語彙リストに含まれていない熟語が存在したらしく,common のみで調べると 1 つも解がヒットしません. かなりメジャーどころで頑張った気持ちではいたのですが,一体どれが含まれていなかったのだろう?

スーパー和同開珎(想定解)