2011-05-19 126 views
2

试图在Python中创建电视游戏节目“Lingo”。Python-替换字符串上特定位置的所有出现的字符

在游戏中,玩家试图猜测一个五个字母的单词。他们从我随机猜测一个五个字母的单词开始。然后游戏板会亮起来,显示他们猜测的单词与实际单词的匹配程度。

例如,如果真正的单词是“峡谷”,玩家猜测“鹰” - 董事会将显示'e'和'g'是真实的单词,但它们不在正确的关于真正的单词“峡谷”的位置。 (g的值在[0]和[3]索引中,而老鹰则在[2]索引中)。

如果这个词是“开心”,而用户猜到“harpy”,董事会将显示三个字母是真实的字,并且他们被正确定位。 (干草)。

在Python实现中,我强调一个字母是正确的,但是在错误的位置上有一个'〜'。如果它是正确的并且处于正确的位置,我会放一个'!'在它下面。

的重要作用如下:

wordGuess = input("Guess a letter: ")[0:5] 
    for letter in wordGuess: 
     if letter in realWord: 
      if wordGuess.find(letter) == realWord.find(letter) 

//不知道如何从这里

办?如果有一个正确的字母出现了多次,用字母之一不正确地匹配realWord中字母的位置 - 我如何检测它?例如,如果真正的单词是“持续”并且有人猜测“黄铜”,那么第一个'黄铜'是正确的字母,但是在不正确的位置,而第二个'是'是正确的字母和正确的位置。

那么实现一个函数的最好方法是什么,它可以检查一个字母是否正确并且位置正确(并用!表示)或者表示它是错误位置的正确字母〜

回答

5

找到共同的信件,无论位置:

In [1]: set('harpy') & set('happy') 
Out[1]: set(['a', 'h', 'p', 'y']) 

为了得到一个布尔值标志,指示“哈比”中的每个字母是否存在于“高兴”在任何位置:

In [17]: [l in 'happy' for l in 'harpy'] 
Out[17]: [True, True, False, True, True] 

在上面的代码中,'happy'可以替换为第一个片段的设置交集。

最后,为了得到一个布尔标志每个位置指示信是否在正确的位置:

In [2]: [l==r for l,r in zip('happy','harpy')] 
Out[2]: [True, True, False, True, True] 

为上述组合成一个完整的解决方案:

In [49]: real='lasts' 

In [50]: guess='brass' 

In [51]: exact=[l==r for l,r in zip(real,guess)] 

In [52]: approx=[l in real for l in guess] 

In [53]: chars=[[' ','~'],['!','!']] 

In [54]: print guess, '\n', ''.join(chars[e][a] for e,a in zip(exact,approx)) 
brass 
    ~~! 

(万一你想知道如何使用布尔值索引到一个数组中,它们被隐含地转换为整数:False = 0和True = 1。)

+0

布尔标志技术有助于找到直接匹配,但它d oes无助于确定“guessWord”中的一个字母是否在IN“realWord”中,但不在正确的位置。同样重要的是要注意,realWord可能不止一次出现一个字母,而不是在guessWord中。 – Parseltongue 2011-05-19 07:01:02

+0

我正在使用此代码来完成你的'zip'方法: “allMatches = [match.start()用于匹配re.finditer(re.escape(wordGuess),realWord)]” 稍微有用,因为它返回每个字母的起始索引,发现 – Parseltongue 2011-05-19 07:01:35

+0

辉煌!非常感谢 – Parseltongue 2011-05-19 07:34:46

相关问题