Einführung
Doppelkopf ist ein traditionelles deutsches Kartenspiel für 4 Spieler. Das Deck besteht aus 48 Karten (9, 10, Jack, Queen, King, Ace jeder Farbe, während jede Karte zweimal im Spiel ist), sodass jeder Spieler zu Beginn einer Runde 12 erhält.
Es gibt immer 2 Mannschaften, die durch die Verteilung der Queens of Clubs bestimmt werden. Die 2 Spieler, die die Queens halten, bilden ein Team und spielen gegen die anderen 2 Spieler. Das Team mit den Queens of Clubs heißt "Re" -Team, das ohne ist das "Contra" -Team.
Zu Beginn der Runde weiß niemand, wer in welchem Team ist. Die Teamverteilung wird im Verlauf der Runde bekannt gegeben, was dem Spiel viel Strategie verleiht.
Das Spiel besteht aus 12 Tricks. Die Spieler, die einen Stich gewinnen, erhalten alle 4 Karten. Jede Karte hat einen bestimmten Wert (König zählt 4, Ass zählt 11), alle Karten zusammen ergeben 240 Punkte, was das höchstmögliche Ergebnis darstellt.
Am Ende einer Runde werden die Punkte gezählt und das Team mit der höchsten Punktzahl gewinnt die Runde. Dann beginnt dann die nächste Runde ...
Die Herausforderung
Jede Runde hat eine bestimmte Punktzahl, die sich nach der Anzahl der Punkte des Gewinnerteams und möglichen Ankündigungen richtet. Sie müssen ein Programm schreiben, das die Punkteverteilung und mögliche Ankündigungen (siehe Erklärung unten) als Eingabe verwendet und die Punktzahl der Runde und den Gewinner ausgibt.
Die Punkteberechnung
Wie bereits erwähnt gibt es ein Re- und ein Contra-Team. Außerdem sind in einer Runde maximal 240 Punkte möglich. Das Re-Team muss 121 Punkte erhalten, um zu gewinnen, während das Contra-Team nur 120 Punkte benötigt. Es besteht auch die Möglichkeit, zu Beginn der Runde "Re" oder "Contra" anzukündigen, wenn Sie glauben, dass Sie das Spiel gewinnen werden . Auf diese Weise erhöhen Sie die Punktzahl.
Hier sind die Bewertungsregeln:
- +1 für den Gewinn des Spiels
- +1 wenn das verlierende Team weniger als 90 Punkte hat ("Keine 90")
- +1 wenn das verlierende Team weniger als 60 Punkte hat ("Keine 60")
- +1 wenn das verlierende Team weniger als 30 Punkte hat ("Keine 30")
- +1 wenn die unterlegene Mannschaft 0 Punkte hat ("Schwarz")
- +2 für eine Ankündigung von Contra
- +2 für eine Ankündigung von Re
- +1 wenn das Contra Team gewonnen hat ("Gegen die Alten")
Hinweis: Re / Contra-Ankündigungen gelten immer, unabhängig vom Gewinner. Siehe Beispiele in den folgenden Testfällen.
Ein- und Ausgabe
Die Eingabe in das Programm ist die Punktzahl des Re-Teams und mögliche Ankündigungen von Re oder Contra. Da es immer 240 Punkte im Spiel gibt, können Sie die Punktzahl des Contra-Teams einfach berechnen.
Die Eingabe ist eine einzelne Zeichenfolge, die zuerst die Punktzahl des Re-Teams enthält, gefolgt von den möglichen Ankündigungen, während "R" für Re und "C" für Contra steht. Wenn beide angekündigt wurden, wird Re immer an erster Stelle stehen.
Die Ausgabe ist die Punktzahl des Spiels, gefolgt vom Gewinnerteam ("C" für Contra, "R" für Re).
Regeln
- Ihre Einreichung kann ein vollständiges Programm oder eine Funktion sein. Wenn Sie sich für Letzteres entscheiden, geben Sie ein Beispiel zum Aufrufen an.
- Die Eingabe kann durch Funktions- oder Befehlszeilenargumente oder Benutzereingaben erfolgen.
- Die Ausgabe kann als Rückgabewert bereitgestellt oder auf dem Bildschirm gedruckt werden.
- Es gelten Standardlücken .
- Niedrigste Byte-Anzahl gewinnt!
Testfälle
Input -> Output (Explanation)
145R -> 3R (Re won, +1 for winning, +2 for Re-Announcement)
120 -> 2C (Contra won, +1 for winning, +1 for winning as Contra)
80C -> 5C (Contra won, +1 for winning, +1 for no 90, +1 for winning as Contra, +2 for Contra-Announcement)
240R -> 7R (Re won, +1 for winning, +1 for no 90, +1 for no 60, +1 for no 30, +1 for no points for the losing team, +2 for Re-announcedment)
90 -> 2C (Contra won, +1 for winning, +1 for winning as Contra)
110RC -> 6C (Contra won, +1 for winning, +1 for winning as Contra, +2 for Re-Announcement, +2 for Contra-Announcement)
110R -> 4C (Contra won, +1 for winning, +1 for winnins as Contra, +2 for Re-Announcement)
184C -> 5R (Re won, +1 for winning, +1 for no 90, +1 for no 60, +2 for Contra-Announcement)
Kurzer Hinweis: Ich habe absichtlich einige Regeln (wie Soli und Bonuspunkte) weggelassen, um die Herausforderung einfach zu halten. Also, wenn Sie bereits mit dem Spiel vertraut sind, seien Sie nicht verwirrt :)
Viel Spaß beim Codieren!
quelle
Labyrinth ,
1361039492878476746961 BytesProbieren Sie es online aus!
Ahh, es ist viel zu lange her, seit ich Labyrinth benutzt habe. Es ist immer eine große Freude, Golf zu spielen. :) :)
Erläuterung
Das ist jetzt etwas veraltet. Die Gesamtstruktur des Programms ist immer noch dieselbe, aber einige Details haben sich geändert. Ich werde das später aktualisieren. Dies ist die vorherige Lösung als Referenz:
Lassen Sie uns die Partitur etwas aufschlüsseln:
M
, dann gibt es2M+1
Punkte in der Endnote für das Gewinnen, Re und Contra.1
.-∞
).So funktioniert der Code. Sp3000 hat heute eine gute Grundierung für Labyrinth veröffentlicht, also habe ich beschlossen, sie zu stehlen. :) :)
Die Ausführung beginnt also
(
in der ersten Zeile, wobei der Anweisungszeiger (IP) nach rechts zeigt.(
verwandelt einfach die Oberseite des Hauptstapels in-1
und}
verschiebt sie zum Hilfsstapel, wo wir es vergessen können. Das Programm beginnt wirklich mit dem,?
der die Ganzzahl aus STDIN liest. Die IP trifft dann eine Sackgasse und dreht sich um.}
verschiebt den Eingang zum Hilfsstapel und(
dekrementiert eine weitere Null auf-1
. Dies wird das Endergebnis sein. Wir treten jetzt in eine sehr enge Schleife im Uhrzeigersinn ein:Das
))
erhöht die Punktzahl um zwei (wenn wir also das erste Mal durch die Schleife gehen, wird die Punktzahl zur1
Punktzahl für den Gewinn). Dann,
liest ein Zeichen. Solange dies nicht EOF ist, wird die Schleife fortgesetzt.;
verwirft den Charakter, weil es uns egal ist, ob es warR
oderC
und))
fügt der Punktzahl erneut zwei hinzu. Dies wird je nach Eingabe 0, 1 oder 2 Mal wiederholt.Wir verlassen die Schleife, wenn wir EOF getroffen haben, wird die Spitze des Stapels sein
-1
. Wir führen dann diesen linearen Teil aus:Das
`
ist eine unäre Negation, also bekommen wir sie1
und20
verwandeln sie dann in eine120
.{:}
Ruft eine Kopie der Eingabe-Ganzzahl vom Hilfsstapel ab und-
berechnet die Differenz mit120
. Wir können das Vorzeichen dieses Ergebnisses verwenden, um festzustellen, wer gewonnen hat.Wenn das Ergebnis negativ ist, hat Re gewonnen und wir gehen den nördlichen Weg und führen Folgendes aus:
;
verwirft dieses Ergebnis,}
verschiebt die Punktzahl weg,82
setzt sich (Zeichencode vonR
) am unteren Rand des Hauptstapels ab,{
holt die Punktzahl wieder nach oben,_240{-
subtrahiert die ganzzahlige Eingabe von 240, damit wir mit den Punkten von Contra (der verlierenden Seite) arbeiten können.Dies
#;
soll nur sicherstellen, dass der Stapel einen Wert ungleich Null enthält, damit wir beide Pfade zuverlässig verbinden können.Wenn das Ergebnis positiv ist, hat Contra gewonnen und wir gehen den südlichen Weg und führen Folgendes aus:
Das
#
drückt die Stapeltiefe, die ist1
. Dies wird von der Punktzahl abgezogen , bevor wir hinzufügen ,2
mit))
.67
setzt sich (Zeichencode vonC
) am unteren Rand des Hauptstapels.{{
erhält die anderen Werte zurück.Wenn das Ergebnis Null ist, hat Contra immer noch gewonnen. Dies ist jedoch der Fall 120/120, für den wir dem Endergebnis einen zusätzlichen Punkt hinzufügen müssen (siehe oben). Deshalb drückt dieser Pfad keine 1 mit
#
, sondern lässt nur die Null, so dass die-
Null einfach vom Stapel entfernt wird.Die Stapel sind jetzt wieder zusammengefügt und wir haben alles berücksichtigt, außer dem Teil, in dem wir durch 30 teilen. Aber zuerst müssen wir eine Null-Punktzahl in -1 verwandeln. Das macht dieser kleine Umweg:
Das
`
wirkt sich nicht auf eine Null aus,"
ist ein No-Op und~
ist eine bitweise Negation. Das bitweise NICHT von0
ist-1
wie erforderlich. Wenn die Punktzahl stattdessen positiv war,`
wird sie negativ,(
dekrementiert sie um1
und~
macht beide Operationen auf einmal rückgängig.Die Stapeltiefe ist nun 3 (die Gewinnerseite des Charakter, die Gesamtpunktzahl so weit, und die Seite der Verlierer der Punkte), so
#
drückt3
.0
macht es zu einem30
,/
macht die Teilung.#
drückt einen anderen,3
der subtrahiert wird, und dieses Ergebnis wird wiederum vom Endergebnis subtrahiert.!
druckt es als Ganzzahl,.
druckt die Gewinnerseite als Zeichen und@
beendet das Programm.quelle
JavaScript (ES6), 106
Rund 100 Bytes mit einer Sprache ohne Golf.
Prüfung
quelle
ES6, 92 Bytes
p.length*2
überschätzt die Punktzahl um 1, wenn Re gewinnt, also muss ichr
erneut subtrahieren .!(n%120)+3-((r?240-n:n)/30|0)
ist das, was ich mir ausgedacht habe, um die Regeln für die Bewertung von "Keine" zusammenzufassen. Ich wünschte, die Grenzen wären 31, 61 und 91 gewesen, da dies die Formel ergeben hätte4-((r?269-n:29+n)/30|0)
.quelle