2011-05-19 172 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

相關問題