Рок-бумага-ножницы симулятор соревнований


9

Вы решили организовать чемпионат по рок-ножницам, чтобы узнать, кто из них лучший. Вы не хотите, чтобы удача определяла победителя, поэтому каждый должен представить вам свою тактику в письменном виде перед соревнованиями. Вам также нравятся простые вещи, поэтому ход конкурента (показ камня, бумаги или ножниц) должен основываться только на предыдущем ходу (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-го))

Это код-гольф, поэтому выигрывает самый короткий вход.


Вдохновленный Numberphile? ;-)
Якуб

Верен ли второй пример? Я думаю, что 1 проигрывает против третьего с, 6-8а второй проигрывает против третьего с 6-8.
Якуб

@Jakube Исправлен пример ввода. Спасибо.
Рандомера

Ответы:


2

Python 2: 201 188 символов

def f(Q):c=lambda m:'rps'.index(m);l=len(Q);r=[0]*l;i=0;exec'p,q=i/l,i%l;m,n=c(Q[p][0]),c(Q[q][0]);exec"r[p]+=(p!=q)*(m+1-n)%3;m,n=c(Q[p][m*3+n+1]),c(Q[q][n*3+m+1]);"*7;i+=1;'*l*l;return r

Логика программы: преобразовать буквы в число ( 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'])

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.