Оценка игры дилеммы асинхронного заключенного


15

В раунде дилеммой заключенного упражнения, два игрока каждый решить , стоит ли сотрудничать или дефект в этом раунде. Очки за тур это:

  • Игрок A и игрок B оба сотрудничают: 1 очко для обоих
  • Игрок A и игрок B оба дефекта: 2 очка для обоих
  • Игрок А сотрудничает и игрок Б дефекты: 3 очка за сотрудничество Игрока А и 0 очков за побег Игрока Б

Вам не нужно беспокоиться о стратегии: ваша программа будет просто сводить счет за игру. (Если вы уже знакомы с дилеммой заключенного, мои «баллы» здесь соответствуют «годам тюрьмы».)

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

1
@Eumel Я только что скопировал спецификации из вступления Википедии, в котором, похоже, используется формулировка, предложенная авторами оригинала. Также обратите внимание, что очки здесь "плохие", поскольку они соответствуют годам тюремного заключения. Победителем становится игрок с наименьшим количеством очков.
Апсиллер

Есть (0,0)или [0,0]OK для выхода?
xnor

Ответы:


3

Pyth, 23 байта

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

Тестирование


Объяснение:

@Gz: Строчные буквы

-zG: Заглавные буквы

C,: Pair, обрезать остаток.

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

/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)

Я думаю, что это, наконец, все в гольфе.

Он просматривает каждый символ во входных данных и сортирует его по верхнему регистру или нет. Затем он делает некоторую причудливую математику, которая злоупотребляет неявным преобразованием Python bools в 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

Par , 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.


Как человек, который никогда не использовал (или не слышал о) Par, я нашел ваше объяснение приятным для чтения. Благодарность!
Апсиллеры

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.