In einer Runde des Häftlingsdilemmas entscheiden jeweils zwei Spieler, ob sie in dieser Runde kooperieren oder ausfallen . Die Wertung für eine Runde lautet:
- Spieler A und Spieler B kooperieren beide: 1 Punkt für beide
- Spieler A und Spieler B haben beide Fehler: 2 Punkte für beide
- Spieler A kooperiert und Spieler B defekt : 3 Punkte für kooperierenden Spieler A und 0 Punkte für den Defekt von Spieler B
Sie brauchen sich jedoch keine Gedanken über die Strategie zu machen: Ihr Programm tabelliert lediglich die Punktzahl für ein Spiel. (Falls Sie bereits mit dem Gefangenendilemma vertraut sind, entsprechen meine "Punkte" hier "Jahren im Gefängnis".)
Ihre Herausforderung besteht darin, Eingaben zu machen, die die Entscheidungen der Spieler über mehrere Runden repräsentieren, und ihre jeweiligen Gesamtpunktzahlen zu berechnen. Ein Spieler gibt die Auswahl in Kleinbuchstaben c
und d
(für Zusammenarbeit und Fehler ) und der andere in Großbuchstaben C
und ein D
. Diese Auswahlmöglichkeiten werden Ihrem Programm als Zeichenfolge zur Verfügung gestellt.
Normalerweise reichen Spieler im Gefangenendilemma ihre Züge gleichzeitig und iterativ ein. Bei dieser Herausforderung haben die Spieler möglicherweise ihre Auswahl für mehrere Runden gleichzeitig abgegeben. Wenn der Zug eines Spielers nicht in der richtigen Reihenfolge ist, merkt sich das Auswertungsprogramm den Zug und gleicht ihn mit dem nächsten verfügbaren Zug des gegnerischen Spielers ab.
Hier ist eine Beispiel-Eingabezeichenfolge:
cDCddDDCcCc
Um die Übereinstimmungen anzuzeigen, die in dieser Eingabe vorhanden sind, rufe ich Klein- und Großbuchstaben getrennt auf und verbinde sie:
cDCddDDCcCc
c dd c c => cddcc
DC DDC C => DCDDCC
Diese werden in die Runden eingeteilt:
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)
Wodurch die Punktzahl 9
(Kleinbuchstaben) in 6
(Großbuchstaben) umgewandelt wird, sollte die Ausgabe 9,6
(oder ein eindeutiges Trennzeichen) sein.
Um es noch anders auszudrücken, hier ist jede Paarung in einer eigenen Reihe gezogen:
cDCddDDCcCc
cD
Cd
dD
D c
C c
Es gibt einen, der nicht übereinstimmt C
, da der Spieler mit Großbuchstaben mehr Züge eingereicht hat als der Spieler mit Kleinbuchstaben. Das ist akzeptabel und wird für Bewertungszwecke völlig ignoriert.
Hier sind die Anforderungen:
Sie müssen ein Programm oder eine Funktion schreiben
/[cdCD]+/
, die über einen Eingabemechanismus (STDIN, Funktionsargument, Auslesen aus Datei usw.) eine Zeichenfolge in Form eines regulären Ausdrucks akzeptiert . (Ihr Programm akzeptiert optional Eingaben mit einer nachgestellten Newline.)Ihr Programm oder Ihre Funktion muss die Punktzahlen der Spieler als Zeichenfolge ausgeben oder zurückgeben. Das Ausgabeformat muss mit der Punktzahl des Spielers in Kleinbuchstaben beginnen, gefolgt von der Punktzahl des Spielers in Großbuchstaben, getrennt durch ein nicht leeres, nicht numerisches Trennzeichen Ihrer Wahl. (Ein abschließender Zeilenumbruch ist optional.)
Wenn ein Spieler mehr Züge als der andere hat, werden die überschüssigen Züge ignoriert.
Wenn alle Züge in der Eingabe von ausschließlich einem Spieler stammen (dh es wurden überhaupt keine Runden gespielt), beträgt die Punktzahl jedes Spielers
0
.Die kleinste Einsendung in Bytes gewinnt.
Testfälle
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)
oder[0,0]
OK für die Ausgabe?Antworten:
Pyth, 23 Bytes
Testsuite
Erläuterung:
@Gz
: Kleinbuchstaben-zG
: GroßbuchstabenC,
: Koppeln, Rest abschneiden.`
: Nehmen Sie die Zeichenfolgendarstellung der Liste der Paare/L ... "cDDCdd
:"cDDCdd"
Zählen Sie für jeden Buchstaben in , wie oft er in der obigen String-Repräsentation vorkommt.c2
: Zerhacken Sie die resultierende Liste in zwei Hälften.sM
: Addiere jede Hälfte.j
: An Zeilenumbrüchen teilnehmen und ausdrucken.`muss anstelle von s verwendet werden, um den Fall zu schaffen, dass eine Partei niemals Arbeit spielt.
quelle
Haskell,
139.134BytesAnwendungsbeispiel:
f "cDCddDDCcCc"
->"9,6"
15 Bytes, um das Ausgabeformat richtig zu machen, dh ein Zahlenpaar
(x,y)
in eine Zeichenfolge zu verwandeln"x,y"
.Wie es funktioniert:
Edit: @Zgarb hat mir geholfen, 5 Bytes zu sparen. Vielen Dank!
quelle
LabVIEW, 77 Bytes
Der Code scannt von Token und verwendet diese Angaben, um zu entscheiden, wohin die Punkte gehen.
Zählen geht so
quelle
Python 3, 110
5 Bytes gespart dank FryAmTheEggman.
7 Bytes dank apsillers gespart.
26 Bytes dank DSM eingespart.
Ich denke, es ist endlich alles erledigt.
Es durchsucht jedes Zeichen in der Eingabe und sortiert es nach Großbuchstaben oder Nicht-Großbuchstaben. Dann macht es eine ausgefallene Rechnung, die Pythons implizite Umwandlung von Bools in Ints missbraucht.
quelle
JavaScript (ES6),
124118 ByteLive-Demo
(Aus Gründen der Lesbarkeit leicht erweitert.)
6 Bytes dank user81655 gespart .
quelle
Par , 49 Bytes
Pro Zeichen wird ein Byte verwendet. Sehen Sie hier .
Erläuterung
Ausgaben im Formular
9 6
.quelle
CJam,
928381 BytesDies endete länger als ich gedacht hatte ...
Probieren Sie es hier aus.
Erklärung (Darf ich das erklären?: O):
quelle