シークワーズが好きだ。あるいはシークワーズをSugar制約ソルバーで作る


Sugarという制約ソルバーがあります。
という書き出しをこんなに間を置かずに書くとは思っていませんでした。まいなすよんですこんにちは。


カナオレをSugarを使って解いてみる、という試みを前回書きました。
開発元である田村先生のページはこちら。
ニコリのカナオレの紹介ページはこちら。


前回、Sugarに文字のつながりを教えてカナオレを解いてもらったわけですが、文字のつながりといえばシークワーズを作ることもできるんでない? と思ったのでやってみました。


とはいえ、普通のシークワーズを作るのは大変なので、以下のようにルールを変更します。


・タテヨコナナメにつながった文字列を探します。リストはある場合もない場合もあります。一度使った文字は使いません。


こんな。例えば、ということで例をあげます。
Sugar君に単語リストと盤面サイズを指定して作ってもらいました。
エンジェル隊の中の人の名前を5人分探してください。

ほら、リストなくてもなんとかなるでしょ? その筋の人は、ですけど。


ちなみにリストは以下の通り(敬称略)。
しんたにりょうこ
たむらゆかり
さわしろみゆき
やまぐちまゆみ
かないみか


答えはこんな。


プログラム的には、
・文字の定義をしてるところと、XY座標と1次元位置指定を結びつけるところは同じです。
・文字の連続を表現してるところは以下のようにします。
(<= -1 ( - W_0_0_X W_0_1_X))
(>= 1 ( - W_0_0_X W_0_1_X))
(<= -1 ( - W_0_0_Y W_0_1_Y))
(>= 1 ( - W_0_0_Y W_0_1_Y))
・すべてのマスをalldifferentで別にします。


なにか乱雑性を入れることが必要かな、と思っていたのですが、なにもしなくても結果、いい感じに絡んでくれました。
後でプログラムを上げるかも。



制約が緩いせいか多少大きくしても現実的な時間で解けます。
たとえば、「一握の砂」から石川啄木の和歌を5つ探してください。
ただし、3行の分かち書きの部分でも切れています。


たとえば、


公園の木の間に
小鳥あそべるを
ながめてしばし憩ひけるかな


だと、「公園の木の間に」や「小鳥あそべるを」はタテヨコナナメにひとつながりになりますが、「公園の木の間に小鳥あそべるを」までつながっているかどうかはわからない、ということですね。


以下問題


テキストでも。
■,ゆ,あ,歩,三,て,れ,そ,を,聴,に,く,
ま,ご,人,の,場,車,停,ぬ,そ,わ,き,ゆ,
ず,心,み,十,と,ふ,に,き,れ,の,軽,り,
に,の,の,五,の,さ,る,砂,泣,き,あ,ま,
中,空,は,訛,な,か,し,白,泣,に,の,島,
に,た,ら,む,る,つ,は,き,の,磯,り,小,
と,吸,た,け,ど,た,ど,て,な,ざ,の,東,
蟹,は,は,猶,ら,け,活,に,る,ら,を,海,
て,れ,し,た,わ,生,楽,の,に,見,ぢ,手,
ひ,を,れ,に,は,が,方,草,お,寝,と,っ,
負,背,母,む,不,来,の,城,こ,ろ,び,て,



「蟹ということは……ははあ、『我泣きぬれて蟹とたはむる』だな! えーと上の句はなんだっけ?」
とかやってると意外に面白かったですよ。ビジネスのにおいがほのかにします。誰か雑誌にしてみません? パズルの面白さとは違う気もしますけど。


リストは以下。

たはむれに母を背負ひて
そのあまり軽きに泣きて
三歩あゆまず

不来方のお城の草に寝ころびて
空に吸はれし
十五の心

はたらけど
はたらけど猶わが生活楽にならざり
ぢっと手を見る

東海の小島の磯の白砂に
われ泣きぬれて
蟹とたはむる

ふるさとの訛なつかし
停車場の人ごみの中に
そを聴きにゆく


答えはこちら