В раунде дилеммой заключенного упражнения, два игрока каждый решить , стоит ли сотрудничать или дефект в этом раунде. Очки за тур это:
- Игрок 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
(0,0)
или[0,0]
OK для выхода?Ответы:
Pyth, 23 байта
Тестирование
Объяснение:
@Gz
: Строчные буквы-zG
: Заглавные буквыC,
: Pair, обрезать остаток.`
: Взять строковое представление списка пар/L ... "cDDCdd
: Для каждой буквы"cDDCdd"
подсчитайте, сколько раз она появляется в приведенной выше строке repr.c2
: Разделить полученный список пополам.sM
: Сложите каждую половину.j
: Присоединяйтесь к новым строкам и печатайте.`необходимо использовать вместо s, чтобы одна из сторон никогда не играла.
источник
Haskell,
139134 байтаПример использования:
f "cDCddDDCcCc"
->"9,6"
15 байтов, чтобы получить правильный формат вывода, то есть превратить пару чисел
(x,y)
в строку"x,y"
.Как это устроено:
Редактировать: @Zgarb помог мне сэкономить 5 байтов. Благодарность!
источник
LabVIEW, 77 байт
Код сканирует токены и использует эти признаки, чтобы решить, куда идут точки.
Подсчет идет как это
источник
Питон 3, 110
Сохранено 5 байт благодаря FryAmTheEggman.
Сохранено 7 байт благодаря апсиллерам.
Сохранено 26 байт благодаря DSM.
Я думаю, что это, наконец, все в гольфе.
Он просматривает каждый символ во входных данных и сортирует его по верхнему регистру или нет. Затем он делает некоторую причудливую математику, которая злоупотребляет неявным преобразованием Python bools в int.
источник
JavaScript (ES6),
124118 байтЖивая демо
(Немного расширен для удобства чтения)
Сохранено 6 байт благодаря пользователю 81655 .
источник
Par , 49 байтов
Один байт используется на символ. Смотрите здесь .
объяснение
Выходы в виде
9 6
.источник
CJam,
928381 байтЭто закончилось дольше, чем я думал ...
Попробуй это здесь.
Объяснение (смею ли я это объяснить?: O):
источник