Spiele die beste Karte in Euchre

13

Eingang:

Erstens
Ein Array von drei Karten, die die Karten repräsentieren, die von jedem Spieler gespielt werden

[JD][TH][9S]

Darstellen

Jack of Diamonds, 10 of Hearts, and Nine of Spades.

Da Sie in Euchre immer Ihrem Teamkollegen gegenüber sitzen, repräsentiert das zweite Element das Spiel Ihres Teamkollegen. Hier die TH.

Zweitens
ein einzelnes Zeichen, eine Zeichenfolge usw., die den Trumpfanzug darstellt, der wie folgt formatiert ist

S, D, C, H

darstellen

Spades, Diamonds, Clubs, Hearts

Drittens ein Array von vier Karten, die Ihre Hand darstellen und wie folgt formatiert sind

[KD][JC][QH][AS]

darstellen

King of Diamonds, Jack of Clubs, Queen of Hearts, Ace of Spades

Zielsetzung:

Geben Sie anhand der drei Eingänge die bestmögliche Karte aus, um sie zu den gespielten Karten hinzuzufügen, sodass sie die folgenden Kriterien erfüllt:

  1. Es nimmt die Hand, wenn es kann, wenn nicht die am wenigsten wertvolle Karte ausgegeben
  2. Es nimmt die Hand, wenn es kann, aber es wird nicht Ihr Teamkollege trumpfen, es sei denn, es ist unvermeidlich
  3. Wenn es die Hand nehmen kann, verwendet es die am wenigsten wertvolle Karte. (Wenn Sie ein Ass und eine Dame haben, die die Hand gewinnen können, spielen Sie die Dame).
  4. Alle Spiele müssen den unten angegebenen Regeln entsprechen.

Ausgabeformat wie [JD]

Formatierung

A - Ace
K - King
Q - Queen
J - Jack
T - Ten
9 - Nine

H - Hearts
D - Diamonds
S - Spades
C - Clubs

TH, 9D, JD, QH, AD, 9C, TC

Beispiele

In: [QD][KD][9C], "C",[AH][JH][QH][9H]

Aus: 9H

Grund: Da die Vereine Trumpf sind und der 9C die Hand gewinnt, können wir die Hand nicht nehmen, daher sollten wir unsere niedrigste Karte ablegen, hier die 9H

In: [QD][KD][AD], "H",[AH][JH][QH][9H]

Aus: 9H

Grund: Da Herzen Trumpf sind und das Ass der Diamanten gerade die Hand gewinnt, können wir die Hand trumpfen, also sollten wir unsere niedrigste Karte verwenden, hier die 9H

In: [QD][KD][TD], "D",[AD][JH][QH][9D]

Aus: 9D

Grund: Da Diamanten Trumpf sind und wir gerade die Hand gewinnen, sollten wir die 9D spielen, weil unser Partner gerade die Hand gewinnt, also wollen wir die 9Düber die spielenAD

In: [QH][KH][JH], "D",[AD][JD][QH][9D]

Aus: QH

Grund: Da Diamanten Trumpf sind, gewinnen unsere Gegner mit der linken JHLaube. Wir haben die rechte Laube, können ihn aber nicht trumpfen, weil QH geführt wurde und wir dem Beispiel folgen müssenQH

In: [QH][KH][JH], "D",[AD][JD][QC][9D]

Aus: JD

Grund: Da Diamanten Trumpf sind, gewinnen unsere Gegner mit der linken JHLaube. Wir haben die rechte Laube und da wir keine Diamondshaben, können wir mit der über ihn trumpfenJD

Stärken der Euchre-Karte

Wenn Herzen Trumpf sind:

JH
JD
AH
KH
QH
TH
9H

Lesen Sie die Euchre-Regeln, wenn Sie mit der Stärke der verschiedenen Karten in Euchre nicht vertraut sind

Da dies Code-Golf ist, gewinnt der kürzeste Code!

Viel Glück und hab Spaß!

jacksonecac
quelle
2
Ich denke das Stück sollte hier nicht mit einem Link beschrieben werden.
Jonathan Allan
@ JonathanAllan Ich habe darüber nachgedacht, aber es ist besser in dem Link beschrieben. Wahrscheinlich nicht die beste Herausforderung für diejenigen, die mit dem Spiel nicht vertraut sind. Es sei denn, sie möchten spontan lernen.
Jacksonecac
Das Beispiel mit 9Dals Ergebnis hat Herzen als Trumpf gesetzt (obwohl ich glaube, dass es dieses Ergebnis nicht beeinflusst).
Jonathan Allan
@ JonathanAllan schönen Fang, danke.
Jacksonecac
1
@jacksonecac danke für das problem, ich hatte spaß damit.
Dave

Antworten:

2

Perl - 557 532 511 490 482 384 363

($p,$t,$h)=@ARGV;%L=(H=>D,D=>H,C=>S,S=>C);$B=%L{$t};$_="\]$p$h\[";s/(.$t)/0$1/g;s/J$B/01$B/;s/0J/00/;s/J/R/g;s/9/Z/g;($T,@C)=split/\]\[/,$_;$s=$C[0];$s=~s/.+(.)/$1/;$s=~s/$t/0/;$X=(sort@C[0..2])[0];@M=@C[3..6];@F=(grep{/$s/}@M);@M=@F if@F;$w=(sort@M)[@M-1];push@M,$X;foreach$g(sort@M){$g ne$X?$b=$g:last}$_=$C[1]eq$X||!$b?$w:$b;s/.(..)/$1/;s/Z/9/;s/0|1|R/J/;print

Wie es funktioniert

Probieren Sie es online!

Zuerst liest es args und findet den Anzug des linken Bauers (Jack der gleichen Farbe wie Trump) mit einem Hash-Lookup:

($p,$t,$h)=@ARGV;
%L=(H=>D,D=>H,C=>S,S=>C);
$B=%L{$t};

Dann werden alle Karten zu einer Zeichenfolge zusammengefasst und ersetzt, sodass die Karten natürlich in der richtigen Reihenfolge für euchre sortiert werden:

$_="\]$p$h\[";
s/(.$t)/0$1/g; # trump cards start with '0'
s/J$B/01$B/;   # left-bauer's 'J' changes to '01', making it trump
s/0J/00/;      # right-bauer's 'J' changes to '0'
s/J/R/g;       # all other jacks have 'J' changed to 'R'
s/9/Z/g;       # all 9s change to Z
($T,@C)=split/\]\[/,$_;

Am Ende dieses Blocks wird der Kartenstring in die Klammern geteilt, wodurch ein Array aller Karten erstellt wird, bei denen:

  • Index 0 = Führerkarte des Gegners

  • Index 1 = Teamkameradenkarte

  • Index 2 = Karte des anderen Gegners

  • Indizes 3-6 repräsentieren die Hand

Die Hauptfarbe wird von der ersten Karte an analysiert, aber die Farbe ändert sich zu '0', um Trumpf darzustellen, wenn Trumpf geführt wurde:

$s=$C[0];
$s=~s/.+(.)/$1/;
$s=~s/$t/0/;

Die beste Karte im Spiel wird gefunden, indem die ersten drei Karten sortiert und die erste Karte abgerufen werden:

$X=(sort@C[0..2])[0];

Die spielbaren Karten werden gefunden. Wenn Karten auf der Hand mit der Hauptfarbe übereinstimmen, bleiben nur diese Karten übrig. Ansonsten gelten alle Karten als spielbar:

@M=@C[3..6];
@F=(grep{/$s/}@M);
@M=@F if@F;

Die Wegwerfkarte wird gefunden, indem die letzte Karte in der sortierten Reihe spielbarer Karten zurückgegeben wird:

$w=(sort@M)[@M-1];

Die niedrigste 'gewinnende' Karte, die den Stich gewinnen kann, wird gefunden, indem die höchste im Spiel befindliche Karte zum Array spielbarer Karten hinzugefügt, das Array sortiert und wiederholt wird, bis die höchste im Spiel befindliche Karte gefunden wird. Die 'gewinnende' Karte ist die Karte aus der vorherigen Iteration:

push@M,$X;
foreach$g(sort@M){$g ne$X?$b=$g:last}

Das richtige Spiel wird dann ausgewertet. Die Wegwerfkarte wird gewählt, wenn eine der folgenden Bedingungen erfüllt ist:

  1. Die beste Karte auf dem Tisch hat einen Index von 1 in der unsortierten Liste aller Karten, was bedeutet, dass sie unserem Teamkollegen gehört
  2. Die Suche nach der niedrigsten 'gewinnenden' Karte war null, was bedeutet, dass die beste Karte unseres Gegners höher ist als alle Karten in der Hand

Andernfalls wird die 'gewinnende' Karte zurückgegeben:

$_=$C[1]eq$X||!$b?$w:$b;
s/.(..)/$1/; # remove the '0' that indicated trump
s/Z/9/;      # get those 9s back
s/0|1|R/J/;  # fix the jacks
print
Dave
quelle