Забийте гру з асинхронною дилемою в'язня


15

У раунді дилемою укладеного вправи, два гравця кожен вирішити , чи варто чи співпрацювати або дефект в цьому раунді. Оцінка за раунд:

  • Гравець А та Гравець В співпрацюють: 1 бал для обох
  • Гравець А та Гравець В - дефект: 2 очки за обидва
  • Гравець A співпрацює та дефекти гравця B: 3 бали за гравця A та 0 балів за перегравання гравця B

Однак, вам не потрібно хвилюватися про стратегію: ваша програма буде просто нараховувати рахунок за гру. (Якщо ви вже знайомі з дилемою в'язня, мої "пункти" тут відповідають "років ув'язнення".)

Ваша задача полягає в тому, щоб взяти внесок, який представляє вибір гравців протягом декількох раундів, і обчислити їх відповідні загальні бали. Один гравець подає вибір у малому регістрі cта d(для співпраці та дефектів ), а інший подає вибір у великому регістрі Cта D. Ці варіанти надаються вашій програмі у вигляді рядка.

Зазвичай гравці, що стоять перед дилемою ув'язнених, подають свої кроки одночасно та повторно. Однак у цьому виклику гравці, можливо, подали свій вибір за кілька раундів одночасно. Якщо хода гравця не відповідає послідовності, програма забиття рахунків запам'ятовує його і співпадає з наступним можливим кроком від гравця, який виступає проти.

Ось зразок вхідного рядка:

cDCddDDCcCc

Щоб показати збіги, які існують у цьому вході, я зателефонував би малі та великі регістри окремо та спарував їх:

cDCddDDCcCc
c  dd   c c => cddcc
 DC  DDC C  => DCDDCC

Вони будуть сполучені в тури:

c vs D (3 pts for lowercase-player, 0 pts for uppercase-player)
d vs C (0 pts for lowercase-player, 3 pts for uppercase-player)
d vs D (2 pts for both)
c vs D (3 pts for lowercase-player, 0 pts for uppercase-player)
c vs C (1 pt for both)

Що дає результат 9(нижній регістр) до 6(верхній регістр), тому вихід повинен бути 9,6(або будь-який однозначний роздільник).

Щоб висловити це ще одним способом, ось кожне парне з'єднання витягнуто у своєму рядку:

cDCddDDCcCc
cD
  Cd
    dD
      D c
       C  c

Є одна неперевершена C, тому що гравець верхнього регістру подав більше рухів, ніж гравець нижнього регістру. Це прийнятно, і його цілком ігнорують з метою балів.

Ось такі вимоги:

  • Ви повинні написати програму або функцію, яка приймає рядок форми регулярного виразу /[cdCD]+/, через якийсь механізм введення (STDIN, аргумент функції, зчитуваний з файлу тощо). (Ваша програма може необов'язково приймати вхід із зворотним новим рядком.)

  • Ваша програма або функція повинна виводити або повертати результати гравців у вигляді рядка. Формат виходу повинен починатися з огляду великого регістру гравця, а потім рахунку верхнього регістру гравця, розділеного будь-яким не порожнім нечисловим роздільником. (Додатковий рядок не є обов'язковим.)

  • Якщо один гравець має більше ходів, ніж інший, надлишки ходу ігноруються.

  • Якщо всі ходи вхідні дані мають виключно один гравець (тобто, жодних раундів не було), то оцінка кожного гравця така 0.

  • Виграє найменше подання в байтах.

Тестові справи

Input:  cDCddDDCcCc
Output: 9,6         -- or any delimiter; I chose commas here

Input:  cccDDD
Output: 9,0         

Input:  DDDDDDccc
Output: 9,0

Input:  cDcDcD
Output: 9,0

Input:  dcDDC
Output: 5,2

Input:  CcdCDDcd
Output: 6,6

Input:  Ddd
Output: 2,2

Input:  ccccccccccc
Output: 0,0

чи зазвичай вони не отримують 2 бали за співпрацю і втрачають 1 бал, якщо обидва дефекти?
Евмель

1
@Eumel Я щойно скопіював параметри зі вступу у Вікіпедії, яка, як видається, використовує рецептуру, запропоновану оригінальними авторами. Також зауважте, що бали тут "погані", оскільки вони відповідають рокам ув'язнення. Переможець - гравець з найменшою кількістю очок.
апспіллери

Є (0,0)або [0,0]OK для виходу?
xnor

Відповіді:


3

Pyth, 23 байти

jsMc2/L`C,@Gz-zG"cDDCdd

Тестовий набір


Пояснення:

@Gz: Букви нижнього регістру

-zG: Великі літери

C,: Пара, усікайте решту.

`: Візьміть рядкове представлення списку пар

/L ... "cDDCdd: Для кожної літери в "cDDCdd"підраховуйте, скільки разів вона відображається у наведеному вище рядку repr.

c2: Отриманий список розріжте навпіл.

sM: Додайте кожну половину.

j: Приєднуйтесь до нових ліній та друкуйте.


`необхідно використовувати замість s, щоб зробити випадок, коли одна зі сторін ніколи не грає на роботі.


5

Haskell, 139 134 байт

g=filter
(n!m)(a,b)=(a+n,b+m)
f s=init$tail$show$foldr id(0,0)$zipWith(#)(g(>'a')s)$g(<'E')s
'c'# 'C'=1!1
'c'#_=3!0
_# 'D'=2!2
_#_=0!3

Приклад використання: f "cDCddDDCcCc"-> "9,6"

15 байт просто для того, щоб отримати правильний вихідний формат, тобто перетворити пару чисел (x,y)у рядок "x,y".

Як це працює:

               g(>'a')s        -- extract all lowercase letters
                     g(<'E')s  -- extract all uppercase letters
         zipWith(#)            -- combine both lists element wise with function #
                               -- # calls ! depending on the combination of c/d/C/D
                               -- ! takes 2 numbers a and b and returns a function
                               -- that takes a pair (x,y) and returns (x+a,y+b)
                               -- now we have a list of such functions
    foldr id(0,0)              -- apply those functions starting with (0,0)
init$tail$show                 -- format output                    

Редагувати: @Zgarb допоміг мені зберегти 5 байт. Спасибі!


4

LabVIEW, 77 байт

введіть тут опис зображення

Код сканується з лексем і використовує ці показники, щоб визначити, куди йдуть точки.

Підрахунок йде як це


3

Пітон 3, 110

Збережено 5 байт завдяки FryAmTheEggman.
Збережено 7 байт завдяки апсилерам.
Збережено 26 байт завдяки DSM.

x=[[],[]]
a=b=0
for m in input():x[m<'E']+=m
for w,p in zip(*x):d=p>'C';c=w<'d';b+=d*2+c;a+=3-d-2*c
print(b,a)

Я думаю, що нарешті все гольф.

Він сканує кожний символ у введеному тексті та сортує його на основі великого чи великого літери. Потім це деяка химерна математика, яка зловживає неявним перетворенням ботів в Int.


2

JavaScript (ES6), 124 118 байт

s=>(A=B=i=0,U=(r=x=>s.replace(/c|d/g,x))``,r(l=>U[i]&&(U[i++]<'D'?l<'d'?++A&++B:B+=3:l<'d'?A+=3:(A+=2,B+=2))),A+','+B)

Демонстраційна демонстрація

(Трохи розширений для читабельності.)

var f=function (s) {
    A=B=i=0;
    U=(r=function(x){return s.replace(/c|d/g,x)})("");
    r(l=>U[i]&&(U[i++]<'D'?l<'d'?++A&++B:B+=3:l<'d'?A+=3:(A+=2,B+=2)));
    return A+','+B;
}

var input = ["cDCddDDCcCc","cccDDD","DDDDDDccc","cDcDcD","dcDDC","CcdCDDcd","Ddd","ccccccccccc"];
var output = ["9,6","9,0","9,0","9,0","5,2","6,6","2,2","0,0"];
var passed = true;

for (var index=0;index<input.length;index++) {
    if (f(input[index]) !== output[index]) passed = false;
}

document.getElementById("result").textContent = 
  passed ? "All tests passed." : "Some tests failed.";
<div id="result"></div>

Збережено 6 байт завдяки користувачеві81655 .


Спочатку я мав розуміння масиву, але в кінцевому підсумку використовував інший метод. Спасибі.
intrepidcoder

1

Пар , 49 байт

(lW▼·L)w▼·U))t˅y])[h7%Z2*↓″4>5*-]z2↔-″0<4*+╞)t.Σ¡

На один символ використовується один байт. Дивіться тут .

Пояснення

(              ## Construct array
 l             ## Read line
 W             ## Assign to w
 ▼·L)          ## Filter by immutable under lower-case
 w             ## Get w
 ▼·U)          ## Filter by immutable under upper-case
)              ## 
t              ## Transpose and truncate
˅y])           ## If empty, empty 2-D matrix
[              ## Map
 h             ## Decimal to hex
 7%            ## Modulo 7
 Z             ## Assign to z
 2*↓″4>5*-     ## Score of lower case
 ]             ## Put in array
 z2↔-″0<4*+    ## Score of upper case
 ╞             ## Add to array
)              ## 
t              ## Transpose and truncate
.Σ             ## Map - sum
¡              ## Empty array onto stack

Виводи у формі 9 6.


Як хтось, хто ніколи не використовував (чи чув) пар, я знайшов ваше пояснення приємним для читання. Спасибі!
апсилери

1

CJam, 92 83 81 байт

Це закінчилося довше, ніж я думав, що це буде ...

0]K*X3tC30tG22tZ11t:L;0'a]q+{'D>}:B$_{B}%1#/z{,1>},{2<[:i:#K%L=]sY0e[{si}%}%:.+S*

Спробуйте тут.

Пояснення (Смію я це пояснити?: O):

0]K*C3tX30tG22tZ11t:L;    e# Creates this array [0,30,0,11,0,0,0,0,0,0,0,0,3,0,0,0,22,0,0,0]
0'a]q+                    e# Creates an array that looks like [0, 'a', input string]
{'D>}:B$                  e# Sorts the array by if the int representation of each element is greater than the int value of the character 'D' (e.g. [0,C,D,a,c,d])
_{B}%1#/                  e# Finds the index of the first value in the array that is > 'D' and splits the array at that index.
z{,1>},{                  e# Zip the two sub arrays and filter for only sub arrays with more than one element. (e.g [[0,a],[C,c],[D,d]])
{2<[:i:#K%L=]s            e# For each sub array, take the first two elements, convert each to an it, calculate n=(x[0]^x[1]) mod 20, and get the nth element in the very first array, and convert it to a string
Y0e[                      e# Pad the string with 0 so it is length 2. (e.g. [["00"],["22"],["11"]])
{si}%}%:.+                e# get the numerical representation of each digit and dot sum all of them (e.g [[0,0],[2,2],[1,1] => [3,3])
S*                        e# Join with a space (e.g "3 3")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.