这是一个有三位数的游戏Cows and Bulls的模拟
我试图得到两个数字之间的牛和公牛数量.其中一个是由计算机生成的,另一个是由用户猜测的.我已经解析了我拥有的两个数字,现在我有两个列表,每个列表包含三个元素,每个元素都是数字中的一个数字.所以:
237将列出清单[2,3,7].并且我确保保持相对指数(hundreds, tens, units).一般模式是:.
这两个列表存储在两个列表中:machine和person.
所以,我写了下面的代码,最直观的算法:
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
Run Code Online (Sandbox Code Playgroud)
我开始使用计算机猜测的不同类型的数字来测试它.
很随意,我决定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
Run Code Online (Sandbox Code Playgroud)
很明显,当计算机随机选择的数字中有重复数字时,此算法无效.
我试图理解为什么会发生这些错误,但我不能.我已经尝试了很多,但我在算法中看不到任何错误(可能是因为我写了它!)
在考虑这几天后,我尝试了这个:
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
Run Code Online (Sandbox Code Playgroud)
我对这个更有希望.但是当我测试这个时,这就是我得到的:
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
Run Code Online (Sandbox Code Playgroud)
我所犯的错误在这里很清楚,我明白这些数字一次又一次被计算在内.
即:277对477
当你计算公牛时,那么2只公牛就会出现,那就好了.但是当你算上奶牛时:
这里的匹配完全正确,因为我按照这个编写了代码.但这不是我想要的.而且我不知道在此之后该怎么做.
我想强调的是,如果计算机选择的数字中没有重复的数字,两种算法都能正常工作.
def digits(number):
return [int(d) for d in str(number)]
def bulls_and_cows(guess, target):
guess, target = digits(guess), digits(target)
bulls = [d1 == d2 for d1, d2 in zip(guess, target)].count(True)
bovine = 0
for digit in set(guess):
bovine += min(guess.count(digit), target.count(digit))
return bulls, bovine - bulls
Run Code Online (Sandbox Code Playgroud)
请注意,bulls_and_cows(277, 447)将返回1头牛和0头奶牛.这就是我个人的期望:为什么277中的前7个算作牛,因为已经有447的7牛?