カナオレが好きだ。あるいはカナオレをSugar制約ソルバーで解く。演習編。

Sugarという制約ソルバーがあります。
カナオレをSugarを使って解いてみる、という試みを前回書きました。

開発元である田村先生のページはこちら。
ニコリのカナオレの紹介ページはこちら。

前回取り上げたのは3x3サイズで、カナオレとしては少し物足りなかったでしょう。ということで今回は5x5サイズを用意しました。
ちょっと目で解くのは大変かもしれません。不可能ではないでしょうが。

吉例に倣い、アルファベットにかなをランダムに割り当てようと思うのですが、前回乱雑性にいくつかクレームがありました。そこで今回は、"abc"のaに「あいうえお」のあを対応させる程度の恣意性を入れようと思います。ついでに"abc"のbに「あいうえお」のいを対応させるくらいすれば充分でしょう。あとはランダムに埋めると以下のようになります。

ほらそこボケが弱いとか言わない。先生そういうの嫌いだな。

それはともかく。

前回と同様に入力ファイルを作成します。前回は177行でしたが、今回は1402行になりました。さっそくSugarに食わせてみます。

javaのヒープ領域の例外がどうとか言われてしまいました。
エラーメッセージには従って、ヒープ領域をどうにかするのが正しい態度だとは思いますが、少しパズル魂を発揮して足掻いてみましょう。

前回の表現だと、カナオレの各単語の各文字の座標項目について、盤面の辺の長さだけの区間内の整数と定義していました。
カナオレの1文字目の位置と2文字目の位置に関してもそうしていましたが、これは回り道で、最初から定数としてしまってかまいません。


(int W_1_1_X 0 4)
(int W_1_1_Y 0 4)
(int W_1_1 0 24)
(= W_1_1 ( + (* W_1_1_Y 5) W_1_1_X) )
(= W_1_1_X 2)
(= W_1_1_Y 1)

(int W_1_1_X 2 2)
(int W_1_1_Y 1 1)
(int W_1_1 7 7)


これでどうでしょう。各単語の1文字目と2文字目に同じ処理を施して、Sugarに処理させてみます。

まあね、この程度の処理は内部で既にしてくれていると思ってましたよ。思ってましたよ?


それでは今度は問題に手を加えてみます。「きやんでい」はもとの問題では上から下に落としていますが、これは下から上に走るように変えても成立します。この方が近接の関係でスムーズに決まるので、手で解く分には易しくなります。下のような感じ。

ではSugarに処理させるとどうなるでしょうか。

うんまああれだ。なんといっても制約ソルバーですから、手で解くと簡単になるからといって急に通るようになっちゃね、却って話がおかしいってものだ。悔しくなんかないですよ。悔しくなんかないですよ?


ということで悔しいので、試しに、「きやんでい」を削って、5x5の盤面を5x4の盤面にしてみます。この問題のファイルは978行になりました。

……通ったあ!!!


いや、でも、おかしいでしょ「すたーりーすとらいぷ」とか! もちろんランダムな文字列におかしいもおかしくないもないんですけど! でも! ダブルアンコールで三十路が流した感涙にかけて「きやんでい」は削っちゃいけないと思うんです!


ということで仕方ないので、パズル魂は放棄してヒープ領域をごにょごにょすることにします。他に方式はあるのでしょうが、コマンドラインオプションで指定するのが個人的に判りやすいのでそちらで対処します。Sugarはperlスクリプトとjarファイルから成っていますので、perlスクリプトの方をテキストエディタで開いてごにょごにょして、うまくいきそうなのでごにょごにょして、ごにょごにょすると、


ほら解けた。良かった良かった。

ということで今日の結論ですが、前回提案した方式でSugarにカナオレを解かせようとしたとき、5x5だと環境要因で動かないかもしれませんが、環境要因をごにょごにょと取り除くと動く場合もある、ということになります。ごにょごにょごにょ。

ということで今日はこれまで!