Імітатор змагань «Скалка-папір-ножиці»


9

Ви вирішили організувати чемпіонат з ножиці з паперу, щоб дізнатись, хто найкращий. Ви не хочете, щоб удача визначила переможця, тому кожен повинен дати вам свою тактику в письмовій формі перед змаганням. Вам також подобаються прості речі, тому хід конкурента (показ скелі, паперу чи ножиць) повинен базуватися лише на попередньому рубежі (RvR, RvP, RvS, PvR, PvP, PvS, SvR, SvP або SvS). У першу чергу гравець повинен показати фіксований знак.

Ви вирішили написати програму (або функцію) для імітації чемпіонату.

Деталі конкурсу

  • Буде не менше 2 учасників.
  • Кожен гравець грає рівно один матч з усіма іншими.
  • Один матч триває 7 турів.
  • У кожному раунді переможець отримує 2 бали, програв не отримує жодного. У разі вирівнювання обидва гравці набирають 1 бал.
  • Оцінка гравців у матчі - це сума його балів за ходи матчу.
  • Остаточний рахунок гравців у чемпіонаті - це сума його балів за всі матчі.

Деталі введення:

  • ваша програма або функція отримує N10 символів довгих рядків, кожна з яких відповідає стратегії гравців. Усі символи (це малі літери) 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-й програє проти 3-го з, 6-8а другий програє проти третього з 6-8.
Якубе

@Jakube Виправлений приклад введення. Дякую.
randomra

Відповіді:


2

Пітон 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.