我需要编写一个具有4个字母代码(从字母A到F)的策划者求解器。
但是,我的猜测消除器留下了应该消除的猜测。
这是我的猜测消除器代码:

def getFeedback(self, feedbackStr):
    if guesscount == 1:
        import itertools #i know this shouldnt be here but homework comes with limitations
        global guesslist
        guesslist=list("".join(k) for k in itertools.product('ABCDEF', repeat=4))
    guess_score=feedbackStr
    for i in guesslist:
        i_score=computeFeedback(guess, i)#compares possible code to current guess
        if i_score != guess_score: #remove all non matching guesses
            guesslist.remove(i)
    return guesslist


这是计算机的反馈代码:

def computeFeedback(code,guess):
    # Given a code and guess computes the feedback string

    b = 0
    w = 0
    inCodeCount = {'A':0,'B':0,'C':0,'D':0, 'E':0, 'F':0}
    inGuessCount = {'A':0,'B':0,'C':0,'D':0, 'E':0, 'F':0}
    for i in range(0,4):
        if code[i] == guess [i]:
            b += 1
        inCodeCount[code[i]] += 1
        inGuessCount[guess[i]] += 1
    for ch in inCodeCount:
        w += min(inCodeCount [ch], inGuessCount [ch])
    w -= b
    feedback = str(w)+'w'+str(b)+'b'
    return feedback


但是,例如,当代码= BBAA且第一个猜测是AABB时,
猜测列表为['BBAA','CCAE','DDBC','EECA','FFCE']
我的程序应该消除除BBAA之外的所有内容,但事实并非如此。
它消除了1290/1295错误的猜测,但是似乎总是会漏掉一些错误的猜测。

取决于输入的代码,错误的错误猜测总是相同的。

我已经逐行浏览了,例如

  computeFeedback('BBAA','AABB')  <----- this is my guess vs the code

  '4w0b'
 computeFeedback('AABB','DDBC')   <----- this is my guess vs a
  possible code.

 '0w1b'

 computeFeedback('AABB','CCAE')
'1w0b'
  computeFeedback('AABB','EECA')
 '1w0b'
 computeFeedback('AABB','FFCE')
 '0w0b'


没有一个反馈字符串匹配,因此应将其消除。
如果这个问题太具体,我深表歉意,但是我不知道为什么会这样。

最佳答案

您的问题出在getFeedback函数上。

我怀疑是因为您同时迭代并修改了列表,所以您的代码表现得很差劲。如果我将其更改为更具功能性的样式(以便不修改列表,而是不断返回一个新样式),则它将按预期工作。

(注意:我从getFeedback中删除​​了一些代码,因为它使测试变得有些困难。您说您有不同寻常的约束,因此您可能需要更改它以将猜测列表生成代码重新添加进去。使其成为一个单独的函数,但我想这是切线的。)

import itertools

def generateInitialGuesslist():
    return list("".join(k) for k in itertools.product('ABCDEF', repeat=4))

def getFeedback(guess, feedbackStr, guess_list):
    guess_score = feedbackStr
    new_guess_list = []
    for candidate in guess_list:
        candidate_score = computeFeedback(guess, candidate)
        if candidate_score == guess_score:        #remove all non matching guesses
            new_guess_list.append(candidate)
    return new_guess_list

def computeFeedback(code,guess):
    # Given a code and guess computes the feedback string

    b = 0
    w = 0
    inCodeCount = {'A':0,'B':0,'C':0,'D':0, 'E':0, 'F':0}
    inGuessCount = {'A':0,'B':0,'C':0,'D':0, 'E':0, 'F':0}
    for i in range(0,4):
        if code[i] == guess [i]:
            b += 1
        inCodeCount[code[i]] += 1
        inGuessCount[guess[i]] += 1
    for ch in inCodeCount:
        w += min(inCodeCount [ch], inGuessCount [ch])
    w -= b
    feedback = str(w)+'w'+str(b)+'b'
    return feedback

guesslist = generateInitialGuesslist()
guesslist = getFeedback('AABB', '1w1b', guesslist)
print guesslist
print len(guesslist)


我以AABB作为猜测,以ABCD作为正确答案开始进行了测试。您的代码指出,使用1w1b作为反馈还剩下208个猜测,这与我自己的主脑求解器所说的相同。

关于python - 策划者猜测问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19057808/

10-12 15:06