公牛和奶牛游戏 - 编程算法(python)

Icy*_*ame 0 python algorithm

这是一个有三位数的游戏Cows and Bulls的模拟

我试图得到两个数字之间的牛和公牛数量.其中一个是由计算机生成的,另一个是由用户猜测的.我已经解析了我拥有的两个数字,现在我有两个列表,每个列表包含三个元素,每个元素都是数字中的一个数字.所以:

237将列出清单[2,3,7].并且我确保保持相对指数(hundreds, tens, units).一般模式是:.

这两个列表存储在两个列表中:machineperson.

算法1

所以,我写了下面的代码,最直观的算法:

cowsbulls在此循环开始之前初始化为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)

很明显,当计算机随机选择的数字中有重复数字时,此算法无效.

我试图理解为什么会发生这些错误,但我不能.我已经尝试了很多,但我在算法中看不到任何错误(可能是因为我写了它!)

算法2

在考虑这几天后,我尝试了这个:

cowsbulls在此循环开始之前初始化为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只公牛就会出现,那就好了.但是当你算上奶牛时:

  1. 在单位处的277中的7与在477中的7位相匹配,因此产生了一头母牛.
  2. 在277处的数字位置中,7位数与477处的单位数相匹配,因此产生了一头母牛.

这里的匹配完全正确,因为我按照这个编写了代码.但这不是我想要的.而且我不知道在此之后该怎么做.

此外...

我想强调的是,如果计算机选择的数字中没有重复的数字,两种算法都能正常工作.

Min*_*ark 5

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牛?