これは3 桁の数字を使った牛と牛のゲームのシミュレーションです
2 つの数値の間で牛と雄牛の数を取得しようとしています。1 つはコンピューターによって生成され、もう 1 つはユーザーによって推測されます。私が持っている 2 つの数値を解析したので、それぞれ 3 つの要素を持つ 2 つのリストがあり、各要素は数値の数字の 1 つです。そう:
237 でリストが表示され[2,3,7]
ます。そして、相対インデックスが維持されるようにします。一般的なパターンは次のとおり(hundreds, tens, units)
です。
machine
そして、これら 2 つのリストはとの 2 つのリストに格納されますperson
。
アルゴリズム 1
そこで、次のコードを書きました。最も直感的なアルゴリズム:
cows
bulls
このループの開始前に 0 に初期化されます。
for x in person:
if x in machine:
if machine.index(x) == person.index(x):
bulls += 1
print x,' in correct place'
else:
print x,' in wrong place'
cows += 1
そして、コンピューターが推測したさまざまな種類の数字でこれをテストし始めました。
かなり無作為に 277 に決めました。そして推測では 447 でした。ここで、このアルゴリズムが機能しない可能性があるという最初の手がかりを得ました。牛1頭、雄牛0頭です。雄牛1頭と牛1頭を飼うべきだったのに。
これは、最初のアルゴリズムを使用した出力の表です。
Guess Output Expected Output
447 0 bull, 1 cow 1 bull, 0 cow
477 2 bulls, 0 cows 2 bulls, 0 cows
777 0 bulls, 3 cows 2 bulls, 0 cows
したがって、コンピューターによってランダムに選択された数字に数字が繰り返されている場合、明らかにこのアルゴリズムは機能していませんでした。
これらのエラーが発生する理由を理解しようとしましたが、できませんでした。私はたくさん試しましたが、アルゴリズムに間違いは見られませんでした(おそらく私が書いたからです!)
アルゴリズム 2
これについて数日間考えたとき、私はこれを試しました:
cows
bulls
このループの開始前に 0 に初期化されます。
for x in range(3):
for y in range(3):
if x == y and machine[x] == person[y]:
bulls += 1
if not (x == y) and machine[x] == person[y]:
cows += 1
こっちの方が期待できました。しかし、私がこれをテストしたとき、これは私が得たものです:
Guess Output Expected Output
447 1 bull, 1 cow 1 bull, 0 cow
477 2 bulls, 2 cows 2 bulls, 0 cows
777 2 bulls, 4 cows 2 bulls, 0 cows
ここで私が犯している間違いは明らかです。数字が何度も何度も数えられていることがわかりました。
例: 277 対 477
雄牛を数えると、2頭の雄牛が出てきて大丈夫です。しかし、牛を数える場合:
- 1 位の 277 の 7 は 10 位の 477 の 7 と一致するため、牛が生成されます。
- 10 の位の 277 の 7 は、1 の位の 477 の 7 と一致するため、牛が生成されます。
ここで、コードをそのように書いたので、一致は正確です。しかし、これは私が望むものではありません。そして、この後どうすればいいのか全くわかりません。
さらに...
コンピューターによって選択された数字に数字が繰り返されていない場合、両方のアルゴリズムが完全に機能することを強調したいと思います。