2011-05-19 3 views
2

Попытка создать телевизионное игровое шоу «Lingo» в Python.Python - Заменить все вхождения буквы в определенном месте на строку

В игре игроки пытаются угадать слово из пяти букв. Они начинают с моего случайного угадывания пятибуквенного слова. Затем игровое поле загорится, показывая, как слово, которое они угадывают, совпадает с фактическим словом.

Например, если настоящее слово «ущелье», а игроки угадают «орел» - доска покажет, что «e» и «g» находятся в реальном слове, но что они не в правильном положение относительно реального слова «ущелье». (G находятся в индексе [0] и [3], а в орле они находятся в индексе [2]).

Если слово было «счастливым», и пользователи догадались, что «гарпия», доска покажет, что три буквы были в реальном слове, и они были правильно расположены. (Ч-а-у).

В реализации 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] 

В приведенном выше коде «счастливый» можно заменить установленным пересечением первого фрагмента.

Наконец, чтобы получить логический флаг для каждой позиции, указывающей ли буква находится в правильном положении:

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

+0

Я использовал этот код, чтобы сделать то, что сделал ваш метод «zip»: «allMatches = [match.start() для соответствия в re.finditer (re.escape (wordGuess), realWord)]« Немного более полезно, потому что он вернул начальный индекс каждой найденной буквы – Parseltongue

+0

блестящий! большое спасибо – Parseltongue

Смежные вопросы