Вы решили организовать чемпионат по рок-ножницам, чтобы узнать, кто из них лучший. Вы не хотите, чтобы удача определяла победителя, поэтому каждый должен представить вам свою тактику в письменном виде перед соревнованиями. Вам также нравятся простые вещи, поэтому ход конкурента (показ камня, бумаги или ножниц) должен основываться только на предыдущем ходу (RvR, RvP, RvS, PvR, PvP, PvS, SvR, SvP или SvS). В первом повороте игрок должен показать фиксированный знак.
Вы решили написать программу (или функцию) для симуляции чемпионата.
Подробности конкурса
- Будут как минимум 2 участника.
- Каждый игрок играет ровно один матч со всеми остальными.
- Один матч длится 7 раундов.
- В каждом раунде победитель получает 2 очка, проигравший не получает ни одного. В случае ничьей оба игрока набирают 1 очко.
- Очки игроков в матче - это сумма его или ее очков за ходы матча.
- Финальный счет игрока в чемпионате - это сумма его или ее очков за все матчи.
Детали ввода:
- Ваша программа или функция получает
N
строки длиной 10 символов, каждая из которых соответствует стратегии игрока. Все символы (строчные)r
p
илиs
означают, что в данной ситуации игрок покажет каменную бумагу или ножницы. - Первая буква кодирует первый ход (в каждом матче для этого участника). Второй показывает, что происходит, если последний раунд был рок-рок-рок. Следующими являются RvP, RvS, PvR, PvP, PvS, SvR, SvP и SvS, где первая буква является знаком игрока, а вторая - оппонентом. Например,
rrpsrpsrps
означает, что игрок начинает с камня, а затем копирует последний ход противника. - Вы можете ввести список строк в виде списка / массива или аналогичных данных вашего языка или в виде одной строки. В последнем случае какой-то символ-разделитель является обязательным.
Детали вывода:
- Ваша программа или функция должна выводить итоговые оценки каждого игрока в том же порядке, в котором они были введены.
- Результаты должны быть разделены пробелами или переводами строки. Трейлинг или перевод строки разрешены.
Примеры:
Входные данные:
['rrpsrpsrps', 'rpppsprrpr']
Выход:
5 9
(повороты есть rvr rvp pvs svp pvr rvp pvs
)
Входные данные:
['rrpsrpsrps', 'rpppsprrpr', 'ssssssssss']
Вывод:
13 17 12
(совпадения 5-9
(1-е против 2-го), 8-6
(1-е против 3-го) и 8-6
(2-е против 3-го))
Это код-гольф, поэтому выигрывает самый короткий вход.
источник
6-8
а второй проигрывает против третьего с6-8
.Ответы:
Python 2:
201188 символовЛогика программы: преобразовать буквы в число (
r=0
,p=1
,s=2
).m
это номер первого,n
номер второго человека. Потому что игра циклична,(m-n)%3
уже определяет результат. И, конечно, я могу сдвинуть результат на единицуf=(m+1-n)%3
. Теперьf=0
означает, что второй игрокq
выигрывает,f=1
означает ничью, аf=2
первый игрокp
выигрывает. Это также уже счет для игрока 1. Поэтому мне нужно только добавить все значения(p!=q)*(m+1-n)%3
для каждого игрока.Проверьте это с
print f(['rrpsrpsrps', 'rpppsprrpr', 'ssssssssss'])
источник