Как задать правило в Python
У нас есть код который определяет победителя в игре JS
MATCH = {
scissors: ['paper', 'lizard'],
paper: ['rock', 'spock'],
rock: ['lizard', 'scissors'],
lizard: ['spock', 'paper'],
spock: ['scissors', 'rock'],
};
function rpsls(pl1, pl2) {
return MATCH[pl1].indexOf(pl2) >= 0 ? 'Player 1 Won!' :
MATCH[pl2].indexOf(pl1) >= 0 ? 'Player 2 Won!' : 'Draw!';
}
то есть, scissors имеет 1, а paper и lizard 0
paper имеет 1, в случае сравнения rock и spock,
как корректно задать такое же правило (MATCH) в Python?
Ответы (2 шт):
Автор решения: kit-kit-kit
→ Ссылка
Нашёл решение своего вопроса, но если кто-то может предложить более лучшее или оптимизированное решение, пожалуйста напишите его.
if (pl1 == pl2): return 'Draw!'
rules = {'rock': {'win': ['lizard', 'scissors']},
'paper': {'win': ['rock', 'spock']},
'scissors': {'win': ['lizard', 'paper']},
'lizard': {'win': ['paper', 'spock']},
'spock': {'win': ['rock', 'scissors']}}
if rules.get(pl1):
if pl2 in rules[pl1]['win']:
return 'Player 1 Won!'
else:
return 'Player 2 Won!'
Автор решения: Алексей Р
→ Ссылка
Небольшая оптимизация в структуре словаря - удалены ключи win, вложенные словари заменены на кортежи. Также словарь вынесен за пределы функции, т.е. создается один раз. Добавлена проверка на допустимые сущности.
rules = {'rock': ('lizard', 'scissors'),
'paper': ('rock', 'spock'),
'scissors': ('lizard', 'paper'),
'lizard': ('paper', 'spock'),
'spock': ('rock', 'scissors')}
def who_win(pl1, pl2, rules):
if pl1 in rules and pl2 in rules:
if pl1 == pl2:
return 'Draw!'
return f'Player {(2, 1)[pl2 in rules[pl1]]} Won!'
else:
return "Invalid item!"
# тест
lst = 'rock', 'flower', 'paper', 'scissors', 'lizard', 'spock'
for pl1 in lst:
for pl2 in lst:
print(pl1, pl2, ': ', who_win(pl1, pl2, rules))
rock rock : Draw!
rock flower : Invalid item!
rock paper : Player 2 Won!
rock scissors : Player 1 Won!
rock lizard : Player 1 Won!
rock spock : Player 2 Won!
...