まず、私は必ずしも完全なアルゴリズムを探しているわけではありません。コピーして貼り付けて、それを1日と呼ぶことができます。どんな「一般的なアプローチ」の解決策でも私には問題ありません!
この投稿全体は、仕事が遅い日、このサイトに出くわし、ジェネレーターをどのように実装したかを理解できなかったことに拍車をかけました。
問題
ご存じない方のために説明すると、「ゼブラパズル」や「アインシュタインのパズル」は、おそらく以前に遭遇したことのある有名なロジックパズルです。
完全なwiki記事はここにありますが、関連するビットを投稿します。
There are five houses.
The Englishman lives in the red house.
The Spaniard owns the dog.
Coffee is drunk in the green house.
The Ukrainian drinks tea.
The green house is immediately to the right of the ivory house.
The Old Gold smoker owns snails.
Kools are smoked in the yellow house.
Milk is drunk in the middle house.
The Norwegian lives in the first house.
The man who smokes Chesterfields lives in the house next to the man with the fox.
Kools are smoked in the house next to the house where the horse is kept.
The Lucky Strike smoker drinks orange juice.
The Japanese smokes Parliaments.
The Norwegian lives next to the blue house.
Now, who drinks water? Who owns the zebra? In the interest of clarity, it must be
added that each of the five houses is painted a different color, and their inhabitants
are of different national extractions, own different pets, drink different beverages
and smoke different brands of American cigarets [sic]. One other thing: in statement
6, right means your right.
これはすべてうまくいっています。特に制約プログラミングを使用して、この問題を解決するための簡潔で巧妙な方法をオンラインでいくつか見つけました。しかし、私が興味を持っているのは、これらのタイプのパズルをもっと作ることです。
もっと作る
明らかに、行列表現はこれについて考える論理的な方法です。各列には、人、家、飲むもの、運転する車の種類などが含まれています。
私の最初の考えは、ランダムに生成された完全な(つまり、解決された)グリッドから始めて、(何らかの方法で)解決されたバージョンからそれを一意に識別するヒントを作成することでした。何かを決定できるたびに、それはグリッドから削除されます。
最初にリストしたサイトをリッピングすると、グリッドを解決するために使用できる次の「ヒント」は次のタイプになります。
人/動物/植物は与えられた家に住んで/成長します。
人/動物/植物は特定の家に住んでいない/成長していません。
人/動物/植物は他の人/動物/植物と同じ家に住んでいます。
人/動物/植物は、他の人/動物/植物の直接の隣人です。
人/動物/植物は、他の人/動物/植物の左または右の隣人です。
人/動物/植物と他の人/動物/植物の間に1つの家があります。
左または右の人/動物/計画と他の人/動物/植物の間に1つの家があります。
人/動物/植物と他の人/動物/植物の間に2つの家があります。
左または右の人/動物/計画と他の人/動物/植物の間に2つの家があります。
人/動物/植物は、他の人/動物/植物から左または右に住んでいます。
これらを一般化、拡張する方法などを確認できます。
難しいのは、私のアプローチ(完全なグリッドから始めてこれらのヒントを生成する)を使用して、作成するヒントのセットが絶対にターゲットグリッドになることを確認する方法がわからないことです。
たとえば、「イギリス人は松の木を所有していない」と言った場合、パズルのどの時点でも2つのものを決定的に組み合わせることができません。しかし、解決する必要のある木が2つしかない場合、これは実際には決定的な証拠となる可能性があります。
私はこれを完全に間違った方法で考えていますか?より良いアプローチは、ランダム化された事前定義された既知の要素を使用してグリッドを作成し(つまり、赤い家が中央にある)、これらのヒントを構築のルールとして使用してグリッドを構築することです。
アドバイス、読むべき記事、学ぶためのプログラミング技術など、大歓迎です!