Python 使用ADT方法转换程序
我是一名初级程序员 我一直在为一项作业的六猜算法中的智囊团解算器编写代码 (有关智囊团及其算法的更多信息:) 我几天前就知道了。但是我们的教授设置了固定的模板,然后我不知道如何将我的代码转换成它 下面是我的代码。可能会很尴尬,但它很有效,而且速度也不慢Python 使用ADT方法转换程序,python,class,Python,Class,我是一名初级程序员 我一直在为一项作业的六猜算法中的智囊团解算器编写代码 (有关智囊团及其算法的更多信息:) 我几天前就知道了。但是我们的教授设置了固定的模板,然后我不知道如何将我的代码转换成它 下面是我的代码。可能会很尴尬,但它很有效,而且速度也不慢 引擎 from mastermind import CodeBreaker def computeFeedback(code,guess): # Given a code and guess computes the feedbac
引擎
from mastermind import CodeBreaker
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
code = input()
while (code != None):
guesscount = 0
myBreaker = CodeBreaker()
while (guesscount < 8):
guess = myBreaker.makeGuess()
print("My guess is:",guess)
guesscount += 1
feedback = computeFeedback(code, guess)
print(feedback)
if feedback == "0w4b":
print("Game Over in", guesscount,"steps")
break
myBreaker.getFeedback(feedback)
if guesscount == 8:
print("Failed to find the solution in 8 steps")
code = input()
来自mastermind import CodeBreaker
def计算反馈(代码、猜测):
#给定一个代码并猜测计算反馈字符串
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}
对于范围(0,4)内的i:
如果代码[i]==猜测[i]:
b+=1
inCodeCount[代码[i]+=1
inGuessCount[猜测[i]]+=1
对于ch in退计:
w+=min(不计数[ch],不计数[ch])
w-=b
反馈=str(w)+'w'+str(b)+'b'
回馈
代码=输入()
while(代码!=无):
猜测计数=0
myBreaker=CodeBreaker()
而(猜测计数<8):
guess=myBreaker.makeGuess()
打印(“我的猜测是:”,猜测)
猜测计数+=1
反馈=计算反馈(代码、猜测)
打印(反馈)
如果反馈==“0w4b”:
打印(“游戏结束”,猜数,“步骤”)
打破
myBreaker.getFeedback(反馈)
如果guesscount==8:
打印(“在8个步骤中找不到解决方案”)
代码=输入()
我上课不好。我甚至不知道init应该包含什么。有人能帮忙吗
非常感谢 将代码转换为类的最简单方法是将所有代码放入
getFeedback
方法,除了不计算要计算的猜测之外,请记住属性self.guess
中的猜测,并在下次调用makeGuess
函数时返回该值。您还需要将所有全局变量(如common
)转换为属性(如self.common
)。这是一张草图:
class CodeBreaker:
def __init__(self):
self.guess_count = 0
self.guess = 'ABCD'
self.common = []
def makeGuess(self):
return self.guess
def getFeedback(self, feedback):
self.guess_count += 1
if self.guess_count == 1:
# ... your code here ...
self.guess = 'BCDE'
elif self.guess_count == 2:
# ... your code here ...
self.guess = 'CDEF'
elif self.guess_count == 3:
# ... your code here ...
# ... and so on ...
我应该补充一点,您的代码非常重复。以下改变是值得的:
产品
的工作(尽管它以不同的方式接受其参数),因此您最好改用它common
等等)。将此代码放入一个方法中应该很简单,这样您就不必将其复制太多次,并同时处理它们)
from itertools import product
from random import choice
from copy import copy
class CodeBreaker(object):
all_codes = [''.join(c) for c in product(*['ABCDEF'] * 4)]
def __init__(self):
self.codes = copy(self.all_codes)
self.guess = 'AABB' # Best first guess!
def makeGuess(self):
return self.guess
def getFeedback(self, feedback):
self.codes = [c for c in self.codes if computeFeedback(c, self.guess) == feedback]
self.guess = choice(self.codes)
在最坏的情况下,该算法最多可以进行八次猜测,但您有八次猜测,所以这没问题。如果你只有六个猜测,那么你需要一个更聪明的方法。下面的替代算法基于一次向前看进行最佳猜测,最多需要六次猜测。(然而,它运行得非常慢!)同样,你可能会发现研究它是如何工作的很有趣(提示:它需要时间)
以下是(运行速度更慢):
另外,你教授的密码也不完美!除了不遵循传统的Python风格外(请参阅),它似乎还相当复杂和冗长。为什么不利用Python的类编写一些简短的东西:
from collections import Counter
def computeFeedback(code, guess):
"""
Return the string `{white}w{black}b` where `black` is a count of the
characters in `guess` that appear at the same position in `code`
and `white` is a count of the characters in `guess` that appear at
a different position in `code`.
>>> computeFeedback('ABCD', 'ACAD')
'1w2b'
>>> computeFeedback('ABAB', 'AABB')
'2w2b'
>>> computeFeedback('ABCD', 'DCBA')
'4w0b'
"""
w = sum((Counter(code) & Counter(guess)).values())
b = sum(c == g for c, g in zip(code, guess))
return '{}w{}b'.format(w - b, b)
将代码转换为类的最简单方法是将所有代码放入
getFeedback
方法中,只是不要计算要计算的猜测,而是记住属性self.guess
中的猜测,并在下次调用makeGuess
函数时返回该值。您还需要将所有全局变量(如common
)转换为属性(如self.common
)。这是一张草图:
class CodeBreaker:
def __init__(self):
self.guess_count = 0
self.guess = 'ABCD'
self.common = []
def makeGuess(self):
return self.guess
def getFeedback(self, feedback):
self.guess_count += 1
if self.guess_count == 1:
# ... your code here ...
self.guess = 'BCDE'
elif self.guess_count == 2:
# ... your code here ...
self.guess = 'CDEF'
elif self.guess_count == 3:
# ... your code here ...
# ... and so on ...
我应该补充一点,您的代码非常重复。以下改变是值得的:
产品
的工作(尽管它以不同的方式接受其参数),因此您最好改用它common
等等)。将此代码放入一个方法中应该很简单,这样您就不必将其复制太多次,并同时处理它们)
from itertools import product
from random import choice
from copy import copy
class CodeBreaker(object):
all_codes = [''.join(c) for c in product(*['ABCDEF'] * 4)]
def __init__(self):
self.codes = copy(self.all_codes)
self.guess = 'AABB' # Best first guess!
def makeGuess(self):
return self.guess
def getFeedback(self, feedback):
self.codes = [c for c in self.codes if computeFeedback(c, self.guess) == feedback]
self.guess = choice(self.codes)
在最坏的情况下,该算法最多可以进行八次猜测,但您有八次猜测,所以这没问题。如果你只有六个猜测,那么你需要一个更聪明的方法。下面的替代算法基于一次向前看进行最佳猜测,最多需要六次猜测。(然而,它运行得非常慢!)同样,你可能会发现研究它是如何工作的很有趣(提示:它需要时间)
以下是(运行速度更慢):
另外,你教授的密码也不完美!除了不遵循传统的pythonst之外
def getFeedback(self, feedback):
self.codes = [c for c in self.codes if computeFeedback(c, self.guess) == feedback]
if len(self.codes) == 1:
self.guess = self.codes[0]
else:
def key(g): return max(Counter(computeFeedback(c, g) for c in self.codes).values())
self.guess = min(self.all_codes, key = key)
from collections import Counter
def computeFeedback(code, guess):
"""
Return the string `{white}w{black}b` where `black` is a count of the
characters in `guess` that appear at the same position in `code`
and `white` is a count of the characters in `guess` that appear at
a different position in `code`.
>>> computeFeedback('ABCD', 'ACAD')
'1w2b'
>>> computeFeedback('ABAB', 'AABB')
'2w2b'
>>> computeFeedback('ABCD', 'DCBA')
'4w0b'
"""
w = sum((Counter(code) & Counter(guess)).values())
b = sum(c == g for c, g in zip(code, guess))
return '{}w{}b'.format(w - b, b)