这是一个模拟三位数的牛和公牛游戏
我试图得到两个数字之间的奶牛和公牛的数量。其中一个由计算机生成,另一个由用户猜测。我已经解析了我拥有的两个数字,所以现在我有两个列表,每个列表包含三个元素,每个元素都是数字中的一个数字。所以:
237会给出名单[2,3,7]
。而且我确保保持相对索引。一般模式是:(hundreds, tens, units)
.
并且这两个列表存储在两个列表中:machine
和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 头多头出现,没关系。但是当你计算奶牛时:
- 个位的 277 中的 7 与十位的 477 中的 7 匹配,因此生成了一头牛。
- 十位的 277 中的 7 与单位位的 477 中的 7 匹配,因此生成了一头牛。
这里的匹配是完全正确的,因为我已经按照它编写了代码。但这不是我想要的。而且我不知道在此之后该怎么做。
此外...
我想强调的是,如果计算机选择的数字中没有重复的数字,这两种算法都可以完美运行。