[解決済み] シマウマは誰のものか」をプログラムで解決する?
2022-07-22 08:07:39
質問
Edit: このパズルは、アインシュタインの謎(Einstein's Riddle)とも呼ばれます。
このパズルは シマウマは誰のもの? (あなたは オンライン版を試すにはこちら は古典的なパズルの一例で、Stack Overflowにいるほとんどの人がペンと紙で解くことができるに違いありません。しかし、プログラムによる解決策はどのようなものでしょうか?
以下に挙げるヒントに基づいて...
- 5つの家があります。
- 各家にはそれぞれ固有の色があります。
- すべての家の所有者は異なった国籍である。
- 彼らはすべて異なるペットを飼っています。
- 彼らはすべて異なる飲み物を飲む。
- 彼らは皆、異なる煙草を吸う。
- イギリス人は赤い家に住んでいる。
- スウェーデン人は犬を飼っている。
- デーン人は紅茶を飲む。
- 緑の家は、白い家の左側にあります。
- 緑の家でコーヒーを飲む。
- ポールモールを吸っている人は鳥を飼っている。
- 黄色い家で、彼らはダンヒルを吸う。
- 真ん中の家では、彼らは牛乳を飲む。
- 最初の家にノルウェー人が住んでいます。
- ブレンドの煙草を吸う男は、猫のいる家の隣の家に住んでいる。
- 馬を飼っている家の隣の家では、ダンヒルを吸っている。
- ブルーマスターを吸っている人は、ビールを飲む。
- ドイツ人はプリンスを吸っている。
- ノルウェー人は青い家の隣に住んでいます。
- 彼らはブレンドを吸う家の隣の家で水を飲みます。
...シマウマの持ち主は?
どのように解決するには?
制約プログラミングに基づくPythonでの解決方法を示します。
from constraint import AllDifferentConstraint, InSetConstraint, Problem
# variables
colors = "blue red green white yellow".split()
nationalities = "Norwegian German Dane Swede English".split()
pets = "birds dog cats horse zebra".split()
drinks = "tea coffee milk beer water".split()
cigarettes = "Blend, Prince, Blue Master, Dunhill, Pall Mall".split(", ")
# There are five houses.
minn, maxn = 1, 5
problem = Problem()
# value of a variable is the number of a house with corresponding property
variables = colors + nationalities + pets + drinks + cigarettes
problem.addVariables(variables, range(minn, maxn+1))
# Each house has its own unique color.
# All house owners are of different nationalities.
# They all have different pets.
# They all drink different drinks.
# They all smoke different cigarettes.
for vars_ in (colors, nationalities, pets, drinks, cigarettes):
problem.addConstraint(AllDifferentConstraint(), vars_)
# In the middle house they drink milk.
#NOTE: interpret "middle" in a numerical sense (not geometrical)
problem.addConstraint(InSetConstraint([(minn + maxn) // 2]), ["milk"])
# The Norwegian lives in the first house.
#NOTE: interpret "the first" as a house number
problem.addConstraint(InSetConstraint([minn]), ["Norwegian"])
# The green house is on the left side of the white house.
#XXX: what is "the left side"? (linear, circular, two sides, 2D house arrangment)
#NOTE: interpret it as 'green house number' + 1 == 'white house number'
problem.addConstraint(lambda a,b: a+1 == b, ["green", "white"])
def add_constraints(constraint, statements, variables=variables, problem=problem):
for stmt in (line for line in statements if line.strip()):
problem.addConstraint(constraint, [v for v in variables if v in stmt])
and_statements = """
They drink coffee in the green house.
The man who smokes Pall Mall has birds.
The English man lives in the red house.
The Dane drinks tea.
In the yellow house they smoke Dunhill.
The man who smokes Blue Master drinks beer.
The German smokes Prince.
The Swede has a dog.
""".split("\n")
add_constraints(lambda a,b: a == b, and_statements)
nextto_statements = """
The man who smokes Blend lives in the house next to the house with cats.
In the house next to the house where they have a horse, they smoke Dunhill.
The Norwegian lives next to the blue house.
They drink water in the house next to the house where they smoke Blend.
""".split("\n")
#XXX: what is "next to"? (linear, circular, two sides, 2D house arrangment)
add_constraints(lambda a,b: abs(a - b) == 1, nextto_statements)
def solve(variables=variables, problem=problem):
from itertools import groupby
from operator import itemgetter
# find & print solutions
for solution in problem.getSolutionIter():
for key, group in groupby(sorted(solution.iteritems(), key=itemgetter(1)), key=itemgetter(1)):
print key,
for v in sorted(dict(group).keys(), key=variables.index):
print v.ljust(9),
print
if __name__ == '__main__':
solve()
出力します。
1 yellow Norwegian cats water Dunhill
2 blue Dane horse tea Blend
3 red English birds milk Pall Mall
4 green German zebra coffee Prince
5 white Swede dog beer Blue Master
解を求めるのに0.6秒(CPU 1.5GHz)かかる。
答えは "ドイツはゼブラを所有している." です。
をインストールするには
constraint
モジュール
を経由して
pip
:
pip install python-constraint
手動でインストールする場合。
-
をダウンロードします。
-
を抽出します(Linux/Mac/BSD)。
$ bzip2 -cd python-constraint-1.2.tar.bz2 | tar xvf -.
-
を展開する (Windowsでは 7zip ):
7z で python-constraint-1.2.tar.bz2 を圧縮します。
> 7z python-constraint-1.2.tar。 -
をインストールします。
$ cd python-constraint-1.2
$ python setup.py install
関連
-
[解決済み] メソッドと関数の違いは何ですか?
-
[解決済み] ゲーム「2048」の最適なアルゴリズムとは?
-
[解決済み] ディープコピーとシャローコピーの違いは何ですか?
-
[解決済み] GUIDは100%一意ですか?
-
[解決済み] 式と文の比較
-
[解決済み] セッションとは何ですか?どのように機能するのですか?
-
[解決済み】マジックナンバーとは何ですか、なぜ悪いのですか?[クローズド]
-
[解決済み] さまざまなアプローチやコンセプトを理解するために学ぶべき重要な言語とは?[クローズド]
-
[解決済み] 単項のブーリアン・トグル演算子を持つ言語はありますか?
-
[解決済み] リンクリストはどのような場合に有効か?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] モジュラスディビジョンのしくみ
-
[解決済み] 並行処理と並列処理の違いは何ですか?
-
[解決済み] キュアリングと部分適用の違いは何ですか?
-
[解決済み] セッションとは何ですか?どのように機能するのですか?
-
[解決済み】キャメルケースの頭字語【終了しました
-
[解決済み】GOTOはまだ有害と考えられている?[クローズド]
-
[解決済み】すべての再帰は反復に変換できる?
-
[解決済み] 2つの角度の差を求めるにはどうすればよいのでしょうか?
-
[解決済み] 直交性」とは何ですか?
-
[解決済み】10行以下の簡単なコードでできる最もクールなことは何ですか?初心者を鼓舞するのに役立つ [終了しました]