W rundzie ćwiczenia dylematu więźnia , każdy z dwóch graczy decyduje, czy w tej rundzie będzie współpracować, czy też wada . Punktacja dla rundy to:
- Zarówno gracz A, jak i gracz B współpracują: 1 punkt dla obu
- Wada zarówno gracza A, jak i gracza B: 2 punkty za oba
- Gracz A współpracuje, a gracz B ma wady: 3 punkty za współpracującego gracza A i 0 punktów za wadliwego gracza B.
Nie musisz się jednak martwić strategią: twój program będzie jedynie zestawiał wynik gry. (Jeśli znasz już dylemat więźnia, moje „punkty” tutaj odpowiadają „latom w więzieniu”).
Twoim wyzwaniem jest zdobycie wkładu reprezentującego wybory graczy w kilku rundach i obliczenie ich łącznej liczby punktów. Jeden gracz dokonuje wyboru małymi literami, c
a d
(w przypadku współpracy i wad ), a drugi wybiera wielkie litery, C
a D
. Te opcje są dostarczane do programu jako ciąg.
Zwykle gracze dylematu więźnia poddają swoje ruchy jednocześnie i iteracyjnie. Jednak w tym wyzwaniu gracze mogli przedłożyć swoje wybory na kilka rund jednocześnie. Jeśli ruch gracza jest poza sekwencją, program punktacji zapamiętuje go i dopasowuje go do następnego dostępnego ruchu przeciwnika.
Oto przykładowy ciąg wejściowy:
cDCddDDCcCc
Aby wyświetlić dopasowania występujące w tym danych wejściowych, osobno wywołam małe i wielkie litery i sparuję je:
cDCddDDCcCc
c dd c c => cddcc
DC DDC C => DCDDCC
Zostaną one sparowane w rundach:
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)
Który tworzy wynik 9
(małe litery) do 6
(wielkie litery), więc wynikiem powinno być 9,6
(lub dowolny jednoznaczny separator).
Aby wyrazić to w jeszcze inny sposób, oto każda para wyciągnięta w osobnym rzędzie:
cDCddDDCcCc
cD
Cd
dD
D c
C c
Jest jeden nieporównywalny C
, ponieważ gracz z dużymi literami zgłosił więcej ruchów niż gracz z małą literą. Jest to do przyjęcia i jest całkowicie ignorowane do celów punktacji.
Oto wymagania:
Musisz napisać program lub funkcję, która akceptuje ciąg wyrażenia regularnego
/[cdCD]+/
, za pośrednictwem jakiegoś mechanizmu wejściowego (STDIN, argument funkcji, odczyt z pliku itp.). (Twój program może opcjonalnie zaakceptować wejście z końcowym znakiem nowej linii).Twój program lub funkcja musi generować lub zwracać wyniki graczy jako ciąg znaków. Format wyjściowy musi zaczynać się od wyniku małego gracza, po którym następuje wynik dużego gracza, oddzielone dowolnym niepustym, nieliczbowym ogranicznikiem według własnego wyboru. (Końcowy znak nowej linii jest opcjonalny).
Jeśli jeden gracz ma więcej ruchów niż drugi, nadwyżki ruchów są ignorowane.
Jeśli wszystkie ruchy na wejściu pochodzą wyłącznie od jednego gracza (to znaczy w ogóle nie rozegrano rund), wynik każdego gracza jest taki
0
.Najmniejsze przesłanie w bajtach wygrywa.
Przypadki testowe
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)
lub[0,0]
OK do wyjścia?Odpowiedzi:
Pyth, 23 bajty
Zestaw testowy
Wyjaśnienie:
@Gz
: Małe litery-zG
: Wielkie literyC,
: Sparuj, skróć pozostałą część.`
: Weź ciąg reprezentujący listę par/L ... "cDDCdd
: Dla każdej litery w"cDDCdd"
policz, ile razy pojawia się w powyższym napisie repr.c2
: Posiekaj wynikową listę na pół.sM
: Dodaj każdą połowę.j
: Dołącz do nowych linii i drukuj.`musi być użyte zamiast s, aby przypadek, w którym jedna strona nigdy nie gra, działał.
źródło
Haskell,
139134 bajtówPrzykład użycia:
f "cDCddDDCcCc"
->"9,6"
15 bajtów tylko po to, aby uzyskać prawidłowy format wyjściowy, tzn. Zamienić parę liczb
(x,y)
w ciąg znaków"x,y"
.Jak to działa:
Edycja: @Zgarb pomógł mi zaoszczędzić 5 bajtów. Dzięki!
źródło
LabVIEW, 77 bajtów
Kod skanuje z tokenów i używa tych wskazówek, aby zdecydować, dokąd idą punkty.
Liczenie przebiega w ten sposób
źródło
Python 3, 110
Zaoszczędź 5 bajtów dzięki FryAmTheEggman.
Zaoszczędzono 7 bajtów dzięki apsillerom.
Zaoszczędzono 26 bajtów dzięki DSM.
Myślę, że w końcu wszystko się skończyło.
Skanuje każdy znak na wejściu i sortuje go na podstawie wielkiej litery lub nie. Następnie wykonuje pewną fantazyjną matematykę, która narusza niejawną konwersję boolonów na ints.
źródło
JavaScript (ES6),
124118 bajtówDemo na żywo
(Lekko rozszerzony dla czytelności.)
Zaoszczędzono 6 bajtów dzięki user81655 .
źródło
Par , 49 bajtów
Jeden bajt jest używany na znak. Zobacz tutaj .
Wyjaśnienie
Dane wyjściowe w formularzu
9 6
.źródło
CJam,
928381 bajtówSkończyło się to dłużej, niż myślałem, że ...
Wypróbuj tutaj.
Objaśnienie (czy mogę to wyjaśnić?: O):
źródło