/
Ananev
/
python_gen_advenced
Обзор
Документация
Войти
/
Ananev
/
python_gen_advenced
Код
Запросы
0
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
2.6.py
53 строки
6 KB
GolosCD
Камень, ножницы, бумага, ящерица, Спок 🌶️
02 май 2023, 11:43
Не верифицирован
02 май 2023, 11:43
10af391
Код
Авторство
О чём код?
''' Проиграв 10 10 раз Тимуру, Руслан понял, что так дело дальше не пойдет, и решил усложнить игру. Теперь Тимур и Руслан играют в игру Камень, ножницы, бумага, ящерица, Спок. Помогите ребятам вновь бросить честный жребий и определить, кто будет делать следующий модуль в новом курсе. Формат входных данных На вход программе подаются две строки текста, содержащие по одному слову из перечня "камень", "ножницы", "бумага", "ящерица" или "Спок". На первой строке записан выбор Тимура, на второй – выбор Руслана. Формат выходных данных Программа должна вывести результат жеребьёвки: кто победил - Тимур или Руслан, или они сыграли вничью. Примечание. Правила игры стандартные: ножницы режут бумагу. Бумага заворачивает камень. Камень давит ящерицу, а ящерица травит Спока, в то время как Спок ломает ножницы, которые, в свою очередь, отрезают голову ящерице, которая ест бумагу, на которой улики против Спока. Спок испаряет камень, а камень, разумеется, затупляет ножницы. ''' inp = {'камень': 1, 'ножницы': 2, 'бумага': 3, 'ящерица': 4, 'Спок': 5} comb = {12: 1, 21: 2, 13: 2, 31: 1, 32: 2, 23: 1, 14: 1, 41: 2, 45: 1, 54: 2, 52: 1, 25: 2, 24: 1, 42: 2, 43: 1, 34: 2, 35: 1, 53: 2, 51: 1, 15: 2} winer = {1: 'Тимур', 2: 'Руслан'} k = '' for i in range(2): k += str(inp.get(input())) if int(k) in comb.keys(): print(winer.get(comb.get(int(k)))) else: print('ничья') ''' если найти индексы персонажей в списке, в котором они перечисленны по часовой стрелке и вычесть из первого второй, то геометрически мы как бы измеряем расстояние от второго к первому по часовой стрелке! Можно заметить закономерность: элементы, находящиеся на чётном расстоянии от выбранного персонажа выигрывают у него, а элементы стоящие на нечётном расстоянии - проигрывают. Например, если отслеживать расстояние от ножниц по часовой стрелке, то бумага и ящерица находятся от ножниц на нечетных расстояниях 1,3 соотвественно и они проигрывают ножницам. Зато камень и Спок находятся на четных расстояниях 2,4 и они выигрывают у ножниц. Но есть проблема если разность индексов персонажей получаетя отрицательной. Например, если первым персонажем будут ножницы, а вторым камень, то разность их индексов в списке будет 0 - 2 = -2. Геометрически, можно считать что мы отмерили расстояние от камня до ножниц против часовой стрелки. В этом случае установленное нами свойство меняется на противоположное. Чтобы не проверять каждый раз знак разности можно взять отсаток от деления на 5 (кол-во персонажей). В результате отрицательное расстояние поменяется на соответствующее ему положительное по часовой стрелке: -2 % 5 = 3. Это одно из любопытных свойств остатка, которое полезно знать и понимать. Дальше, для выяснения того кто победил достаточно выяснить чётность расстояния. Другая проблема возникает если персонажи совпадают. Нулевое расстояние является чётным числом и будет получен неверный ответ - вместо ничьи, второму персонажу будет защитано порожение. Т.е. этот случай придётся рассматривать отдельно. Заключительная идея заключаетя в том, чтобы преобразовать условное выражение, определяющее исход игры в индекс [0..2] в кортеже возможных ответов ('ничья', 'Тимур', 'Руслан'). Предидущее решение использует примерно ту же идею, но без преобразования индексов. ''' g = ('ножницы', 'бумага', 'камень', 'ящерица', 'Спок') dist = (g.index(input()) - g.index(input())) % len(g) print(('ничья', 'Тимур', 'Руслан')[dist and dist % 2 + 1])