Haftungsausschluss: ModTen ist ein fiktives Kartenspiel, das ausschließlich für diesen Zweck entwickelt wurde.
Die Regeln von ModTen
ModTen wird mit einem Standardstapel von 52 Karten gespielt. Da die vollständigen Regeln erst noch erfunden werden müssen, konzentrieren wir uns ausschließlich auf das Handranking.
Eine gewinnende Hand in ModTen. Grafiken aus Wikipedia .
Kartenwerte
Die Karten haben folgende Werte:
- 2 bis 9 : Wert ihren Nennwert
- Zehn : 0 Punkte
- Jack : 3 Punkte
- Königin oder König : 8 Punkte
- Ass : 9 Punkte
Handwerte
Eine ModTen- Hand besteht aus zwei Karten . Der Basiswert einer Hand wird erhalten, indem der Wert beider Karten multipliziert wird und nur die letzte Ziffer beibehalten wird (dh ein Modulo 10 angewendet wird).
Zum Beispiel ist der Wert von 7 ♥ - Q ♣ " ", weil .
Die einzige andere Regel in ModTen ist, dass geeignete Karten mehr wert sind als ungeeignete. Konventionell werden wir ein "s" an den Wert anhängen, wenn beide Karten die gleiche Farbe haben.
Zum Beispiel wird der Wert von 9 ♠ - 5 s als " " notiert , da und die Karten geeignet sind.
Hand Ranking und Gewinner
Die obigen Regeln führen zu 18 verschiedenen Hand-Rängen, die in der folgenden Tabelle zusammengefasst sind, vom stärksten zum niedrigsten (oder seltensten zum häufigsten). Die Wahrscheinlichkeiten sind nur zur Information angegeben.
Bei zwei Händen gewinnt die Hand mit dem niedrigsten Rang. Wenn beide Hände den gleichen Rang haben, ist es ein Unentschieden (es gibt keinen Tie Breaker).
hand rank | hand value(s) | deal probability
-----------+---------------+------------------
1 | 9s | 0.30%
2 | 3s | 0.60%
3 | 1s | 0.90%
4 | 7s | 1.21%
5 | 5s | 1.51%
6 | 3 | 1.81%
7 | 9 | 2.26%
8 | 8s | 2.71%
9 | 6s | 3.02%
10 | 1 or 7 | 3.62% each
11 | 2s or 4s | 3.92% each
12 | 5 | 4.98%
13 | 0s | 5.43%
14 | 8 | 8.14%
15 | 6 | 9.95%
16 | 2 | 11.76%
17 | 4 | 13.57%
18 | 0 | 16.74%
Die Herausforderung
Wenn Sie zwei ModTen- Hände haben, geben Sie einen von drei konsistenten Werten Ihrer Wahl aus, um festzustellen, ob:
- der erste Spieler gewinnt
- der zweite Spieler gewinnt
- es ist eine Zeichnung
Es gelten folgende Regeln:
- Eine Karte muss von seinem Rang in Großbuchstaben beschrieben werden (
2
,3
, ...,9
,T
,J
,Q
,K
oderA
) durch seine Klage in Kleinbuchstabe gefolgt (c
,d
,h
oders
, für Vereine, Karo, Herz und Pik). - Sie können
"10"
anstelle von verwenden,"T"
aber jede andere Ersetzung ist verboten. Solange die oben genannten Regeln befolgt werden, dürfen Sie die Hände in jedem vernünftigen und eindeutigen Format nehmen. Sie dürfen den Rang und die Farbe als zwei verschiedene Zeichen anstatt als einzelne Zeichenfolge annehmen.
Einige gültige Eingabeformate sind:
"7c Qh 8s Ks"
[["7c","Qh"], ["8s","Ks"]]
[[['7','c'], ['Q','h']], [['8','s'], ['K','s']]]
- etc.
Anstatt 3 konsistente unterschiedliche Werte zu verwenden, kann Ihre Ausgabe auch negativ , positiv oder null sein . Bitte geben Sie das in Ihrer Antwort verwendete Ausgabeformat an.
- Das ist Code-Golf .
Testfälle
Spieler 1 gewinnt
["Js","3s"], ["Ks","Kh"]
["7h","9h"], ["9s","7c"]
["Ah","5s"], ["Ts","8s"]
["Ts","8s"], ["Jh","2s"]
["4h","8s"], ["Qh","Ks"]
Spieler 2 gewinnt
["Th","8d"], ["6s","Kd"]
["Jc","5c"], ["3s","9s"]
["Jc","Jd"], ["9h","Ah"]
["2d","4d"], ["3h","3s"]
["5c","4c"], ["3c","2c"]
Zeichnen
["Js","3s"], ["3d","Jd"]
["Ah","Ac"], ["3d","9s"]
["Qc","Kc"], ["6d","4d"]
["2d","3d"], ["3s","2s"]
["Ts","9c"], ["4h","5d"]
quelle
{{J, s}, {3, s}}
okay?Antworten:
Python 3 ,
114110 BytesProbieren Sie es online!
@Arnauld schlug die Idee vor, den Kartenwert und die Rangfolge der Tabellen zusammenzuführen. Nach einigen Versuchen konnte ich eine zusammengeführte Zeichenfolge herstellen
R="T 2J45UNK9RL<3SLM;QAK:O>=/678"
, die dieselbe Länge wie die ursprüngliche Kartenwertzeichenfolge hat. Der TeilR[6:25]="UNK9RL<3SLM;QAK:O>=/"
dient als Rang Tabelle sowie eine Nachschlagetabelle Kartenwert für3
,9
,A
,K
, undQ
. Die ASCII-Wert-Dekodierung der neuen Rangliste hat den gleichen Ranglisteneffekt wie die vorherige Rangliste.Durch die Verwendung von Byte-Zeichenfolgen als Eingabe werden 4 Byte gespart.
Die Verwendung
cmp
in Python 2 kann die Lösung auf 102 Byte reduzieren, wie die Lösung von @ xnor zeigt .Python 3 ,
165142130129 BytesProbieren Sie es online!
-23 Bytes danke an Jonathan Allan
-2 Bytes dank @ovs
-1 Byte dank @mypetlion
Ungolfed:
Die Funktion verwendet
f
zwei Argumente, die die Hand von Spieler 1 und Spieler 2 darstellen. Sie gibt einen positiven, negativen oder Nullwert zurück, wenn Spieler 1 gewinnt, Spieler 2 gewinnt oder entsprechend unentschieden spielt. Jede Hand ist als einzelne Zeichenfolge codiert, z. B. "7cQh".quelle
"HC92FA51GAB4E893D760"[s==t::2]
cmp
in Python 3 nicht verfügbar)str.find
anstelle vonstr.index
ein Byte speichern. Der einzige Unterschied zwischen den beiden Methoden besteht darin, dassindex
ein Fehler ausgegeben wird, wenn das Element nicht gefunden wird, während esfind
zurückgegeben wird-1
. Es ist also kein Problem für Ihren Code.x86-16-Baugruppe,
8783 BytesBinär:
Zerlegt:
Die Eingabe erfolgt als Zeichenfolge, z. B.
Js3sKsKh
am Zeiger inSI
. Ausgang istZF = 0 and SF = OF
(Test mitJG
), wenn Spieler 1 gewinnt,SF ≠ OF
(Test mitJL
), wenn Spieler 2 gewinnt oderZF
(Test mitJE
), wenn ein Unentschieden.Ausgabe mit DOS-Testprogramm:
Laden Sie MODTEN.COM für DOS herunter und testen Sie es .
quelle
05AB1E ,
4137 Bytes-4 Bytes dank @Grimy .
Eingabe als Liste der Liste der Zeichen, wie im dritten Beispiel für das Eingabeformat in der Herausforderungsbeschreibung. Dh P1
7c Qh
& P28s Ks
würden als eingegeben[[["7","c"],["Q","h"]],[["8","s"],["K","s"]]]
. (Und verwendet"10"
für10
.)Gibt eine negative Ganzzahl aus, wenn Spieler 1 gewinnt. eine positive ganze Zahl, wenn Spieler 2 gewinnt; oder 0, wenn es ein Unentschieden ist.
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
Sehen Sie sich meinen Tipp 05AB1E an (Abschnitte Verwendung des Wörterbuchs , Komprimieren großer Ganzzahlen und Komprimieren von Ganzzahllisten ), um zu verstehen, warum
•V›{₆Ÿ&∊WÍj¸•
ist36742512464916394906012008
,•V›{₆Ÿ&∊WÍj¸•19в
ist[18,10,16,6,17,12,15,10,14,7,13,3,11,2,11,5,9,4,8,1]
,‘ߌQ‘
ist"JAKEQ"
undŽćS
ist39808
.quelle
T
als10
, so dass Sie nur die Drop könnenT
ausJTQKA
(und anstelle von 30889 integer 3889 komprimiert verwenden). KönnteT* ... +
auch sein... «
.10
T
T*...+
...«
PHP ,
212185178149 BytesProbieren Sie es online!
Die Eingabe erfolgt über die Befehlszeile. Die Ausgabe an
STDOUT
ist negativ, wenn Spieler 1 gewinnt, positiv, wenn Spieler 2 gewinnt,0
wenn Gleichstand besteht. Beispiel:quelle
-1
,1
oder, einfach negativ, positiv oder null zurückgeben0
.Jelly , 46 Bytes
Probieren Sie es online!
Ein vollständiges Programm zum Beispiel
["7h","Ks"],["4s","Ts"]
, das Null ausgibt, wenn beide Spieler ziehen, positiv, wenn Spieler 1 gewinnt, und negativ, wenn Spieler 2 gewinnt.quelle
C (gcc) ,
172167165164 BytesProbieren Sie es online!
Dank @ceilingcat 2 Bytes weg rasiert!
Grundsätzlich ein Port von @ Joels Python3-Lösung, aber ohne die base18-Codierung. Erwartet die Eingabe als eine Zeichenfolge mit einem Leerzeichen zwischen den Händen der beiden Spieler und gibt eine Ganzzahl aus, die positiv, negativ oder null ist, um anzuzeigen, dass Spieler 1 gewinnt, Spieler 2 gewinnt oder ob es sich um ein Unentschieden handelt.
quelle
Perl 6 ,
1011009488 Bytes-1 Byte danke an Jo King
Probieren Sie es online!
Übernimmt die Eingabe als
f(((<J ♠>, <3 ♠>), (<10 ♠>, <K ♥>)))
Verwendung10
Ten. Gibt einen Wert <0 zurück, wenn Spieler 1 gewinnt,> 0, wenn Spieler 2 gewinnt, 0, wenn es ein Unentschieden ist.Erläuterung
quelle
Kohle , 97 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Nimmt Eingaben als zwei Zeichenfolgen mit 4 Zeichen an
QcKc
6d4d
und gibt eine Ganzzahl mit Vorzeichen aus. Erläuterung:Komprimierte Zeichenfolge
2345678903889
repräsentiert die Kartenwerte.Schleife über jedes mögliche Wertepaar.
Schlinge über jede mögliche zweite Kartenfarbe. Ohne Einschränkung der Allgemeinheit können wir davon ausgehen, dass die erste Karte Farbe 3 hat, sodass die zweite Kartenfarbe im Bereich von 0 bis 3 liegen kann, sofern die Werte nicht gleich sind. In diesem Fall kann sie nur im Bereich von 0 bis 2 liegen.
Berechnen Sie die geänderte Punktzahl der Hand, dh den doppelten Wert der Hand plus 1, wenn die Farben gleich sind (dh die zweite Karte hat Farbe 3).
Die komprimierte Zeichenfolge
23456789TJQKA
repräsentiert die Kartenzeichen. Die Eingabekarten werden in dieser Zeichenfolge nachgeschlagen und dann wird die Position verwendet, um in die erste Zeichenfolge zu indexieren, um den Wert der Karte zu erhalten.Initialisiere das Ergebnis auf 0.
Schlaufe über die beiden Hände.
Berechnen Sie die modifizierte Punktzahl der Hand und damit deren Häufigkeit und subtrahieren Sie das Ergebnis davon.
Frequenzdifferenz ausgeben.
quelle
C # (Visual C # Interactive Compiler) , 139 Byte
Probieren Sie es online!
quelle
Perl 5
-p
, 107 BytesProbieren Sie es online!
Eingang:
(Tatsächlich kann das Komma ein beliebiges Zeichen sein.)
Ausgabe:
quelle