0

私はMasterMindのソルバーを書いています。推測と答えを取り、黒と白のペグの数の表現を返す必要があります.黒のペグは正しい場所の正しい色を表し、白いペグは正しい色を表します.間違った場所に。このコードを約 200 万回繰り返し実行する必要があるため、できるだけ高速にする必要があります。現在、これの最大の時間の浪費は分割とインデックスの呼び出しですが、それらを削除する方法がわかりません。機能を維持しながらこのコードをより速く実行する方法についてのアイデアはありますか?

def returnPegs(guess, answer):
        guessList = guess.split(" ")
        answerList = answer.split(" ")
        response = ""
        iterator = [0,1,2,3]
        for i in iterator:
            if answerList[i] == guessList[i]:
                response = response + "B"
                guessList[i] = "alsoNotAColor"
                answerList[i] = "notAColor"
        for j in iterator:
            if guessList[j] in answerList:
                response = response + "W"
                answerList[answerList.index(guessList[j])] = "notAColor"
                guessList[j] = "alsoNotAColor"
        return response

明確にするため。私の入力は、スペースで区切られた 4 つの色の文字列です。出力は、黒と白のペグのすべての組み合わせに対して一意である限り、特定の形式である必要はありません。

かなりの最適化を行った後のコードの現在の状態は次のとおりです。

 def returnPegs(guess, answer):
    pegs = 0 
    for answerPeg, guessPeg in zip(answer, guess):
        if answerPeg == guessPeg:
            pegs += 5
        elif guessPeg in answer:
            pegs +=1
    return pegs

さらに最適化して、元のコードに戻ると、このバージョンは実際にはすべての中で最速です。最初の約 4 倍、2 番目の約 2 倍です。

def returnPegs(guess, answer):
    response = 0
    iterator = [0,1,2,3]
    for i in iterator:
        if guess[i] == answer[i]:
            response += 5
            guess[i] = "alsoNotAColor"
            answer[i] = "notAColor"
        elif guess[i] in answer:
            response += 1
            answer[answer.index(guess[i])] = "notAColor"
            guess[i] = "alsoNotAColor"
    return response
4

1 に答える 1

1

あなたの質問を正しく読んでいれば、このコードはあなたが必要とすることをするはずです:

def returnPegs(guess, answer):
    guesses = guess.split()
    answers = answer.split()

    pegs = []

    for answer, guess in zip(answers, guesses):
        if answer == guess:
            pegs.append('B')
        elif guess in answers:
            pegs.append('W')

    return ''.join(pegs)

zip()2 つのシーケンスを圧縮します。

>>> a = [1, 2, 3, 4]
>>> b = [5, 6, 7, 8]
>>> zip(a, b)
[(1, 5), (2, 6), (3, 7), (4, 8)]
于 2012-12-05T04:13:47.457 に答える