Wer gewinnt einen Pik-Trick

19

Schreiben Sie einen Code, um festzustellen, wer in einem Pik- Spiel einen Trick mit vier Karten gewinnt . Wenigste Bytes gewinnt.

Die Eingabe ist eine Zeichenfolge, die die vier Karten in der Reihenfolge TH QC JH 2H(Zehn der Herzen, Königin der Vereine, Bube der Herzen, Zwei der Herzen) auflistet . Eine Karte besteht aus zwei Zeichen: einer Farbe von CDHSund einem Wert von 23456789TJQKA. Sie werden garantiert, dass die Eingabe gültig ist und die Karten unterschiedlich sind.

Sie sollten eine Zahl 1, 2, 3 oder 4 für den Gewinner des Stichs ausgeben. Im Beispiel TH QC JH 2Hgewinnt der Bube der Herzen den Stich, daher sollten Sie 3 ausgeben.

Ihre Eingabe und Ausgabe muss genau wie beschrieben sein, mit der Ausnahme, dass nachfolgende Zeilenumbrüche optional sind.

Hier sind die Spades-Regeln, um einen Trick zu gewinnen. Die Gewinnkarte ist die höchste der vier Karten, mit einigen Einschränkungen. Pik ist die Trumpf- Farbe, daher ist jeder Pik jedem Nicht-Pik überlegen. Die Farbe der ersten gespielten Karte ist die Hauptfarbe , und nur Karten dieser Farbe oder Pik sind berechtigt, den Stich zu gewinnen. Karten der gleichen Farbe werden mit ihren Werten verglichen, die in aufsteigender Reihenfolge wie angegeben sind 23456789TJQKA.

Testfälle:

TH QC JH 2H
3
KC 5S QS 9C
3
QD 2D TD 5D
1
9S 5D AD QS
4
3D 4C 3H JH
1
9S 4S TS JS
4
5H 9H 2C AD
2
5S 4C 3H QD
1
2H 2S KH AH
2
xnor
quelle

Antworten:

10

Pyth, 28 27 25 Bytes

J"KTAZ"hxcz)eo_XN+@z1JJcz

Probieren Sie es online aus: Demonstration oder Test Suite (die ersten 4 Zeichen sind das Konstrukt der Test Suite)

Vielen Dank an @isaacg für einen Trick, der 2 Zeichen gespart hat.

Die Hauptidee ist, die Zeichen jeder Hand so zu ändern, dass die gewinnende Hand den maximalen Wert hat.

Die Werte der Hände 23456789TJQKAsind schon fast sortiert. Ich muss nur Tmit A, Kmit Tund Amit ersetzen Z, was mit resultiert 23456789AJQSZ.

Die Reihenfolge der Anzüge CDHSist für die meisten nicht wirklich wichtig. S, der stärkste Anzug, der schon den Maximalwert darstellt. Wichtig ist, dem Anzug aus erster Hand den zweitstärksten Wert zu geben. Also übersetze ich diesen Anzug in K.

Alle Hände müssen auch umgekehrt gelesen werden, da der Anzug stärker ist als der Wert.

                           implicit: z = input string
J"KTAZ"                    J = "KTAZ"
             o         cz  orders the hands N of split(z) by:
              _              the reversed of 
               XN+@z1JJ      N, where the values z[1]+J are replaced by J
            e              last element (winning hand)
        xcz)               index of the winning hand in split(z)
       h                   + 1
Jakube
quelle
Ich gebe auf, gut gespielt: P
Orlp
Ich denke nicht, dass das .eZeug es wert ist - mit o1 Zeichen kürzer, wie ich es sehe.
Isaacg
@isaacg Dein Recht. Komischerweise hatte ich die 27-Lösung vor der .e28-Lösung. Die 27er Lösung endete aber mit a )und hatte daher auch 28 Bytes. : oops:
Jakube
1
Ich habe mir überlegt, wie ich zwei weitere Zeichen speichern kann: Von +@z1"KTA"nach übersetzen "KTAZ", aber anstatt die Zeichenfolgen direkt J"KTAZ"am Anfang und +@z1Jnach zu verwenden J.
Isaacg
@isaacg Sehr schlau. Vielen Dank. Btw. Ich denke eine Weile darüber nach, das dritte Argument Xoptional zu machen (Nur wenn a und b Zeichenketten sind). Aber ich bin mir nicht wirklich sicher, ob Xab)man Xab_b(invertiert b, wäre nett für Sachen wie Xa"</\>") oder Xab+tbhb(b verschoben) auswerten sollte . Was ist Ihre Präferenz?
Jakube
6

CJam, 34 33 Bytes

lS/_{)2$0='S+\#\"TQKA"_$er+}$W>#)

Algorithmus

Die Logik ist einfach. Ich habe eine benutzerdefinierte Sortierung, bei der ich zuerst dem zweiten Zeichen, das den Anzug darstellt, den Vorrang gebe. Dabei erhält Spades die höchste Priorität und dann die erste geworfene Suite. Ruhe alle sind -1. Dann sortiere ich nach dem ersten Zeichen, indem ich Tmit Aund Qmit tausche, Kum eine lexikalische Sortierung zu haben.

Code Erklärung

Sehen wir uns zunächst die lexikalische Reihenfolge der Nennwerte der Karten an:

"23456789TJQKA"$

23456789AJKQT

Alle Zahlen befinden sich also an der richtigen Position. Jist auch in der richtigen Position. Wir müssen tauschen Kund Qund Jund Alexikalische Ordnung bekommen.

lS/_{)2$0='S+\#\"TQKA"_$er+}$W>#)
lS/                                 "Read an input line and split on spaces";
   _{                      }$       "Copy the array and sort it using this custom logic";
     )                              "Take off the last character of each hand.";
      2$0=                          "Get the suit of the first hand";
          'S+                       "Add Spades suit to it";
             \#                     "Get the index of the current hand suit.
                                     1 for Spades, 0 for first hand suit, -1 otherwise";
               \                    "Put face value of this hand on top of stack";
                "TQKA"              "Put string TQKA on stack";
                      _$            "Copy and sort. This essentially reverses the string
                                     TQKA to form AKQT. This is 1 byte shorter than _W%";
                        er+         "Swap T with A and K with Q and add to the
                                     suit index calculated previously";
                                    "After the above tuple, sorting will automatically
                                     convert the tuple to string and sort lexically";
                             W>     "Get the array containing only the last element";
                               #)   "Get the index of this hand in original set and
                                     increment to convert it to 1 based";

Probieren Sie es hier online aus

Optimierer
quelle
3

JavaScript (ES6), 112

Durchsuchen Sie die Liste und geben Sie die Position des höchsten gefundenen Werts zurück.

Führen Sie das Snippet zum Testen aus (in Firefox)

F=t=>t.split(' ').map((c,i)=>(n='23456789TJQKA'.search(c[0])+(c[1]>'H'?40:c[1]==t[1]&&20))>m&&(m=n,r=i+1),m=0)|r

C.innerHTML=['TH QC JH 2H','KC 5S QS 9C','QD 2D TD 5D','9S 5D AD QS','3D 4C 3H JH','9S 4S TS JS','5H 9H 2C AD','5S 4C 3H QD'].map(h=>h+' -> '+F(h)).join('\n')
<pre id=C></pre>

edc65
quelle
3

Perl, 73 Bytes

#!perl -pl
/\B./;s/$&/P/g;y/TKA/IRT/;$_=reverse;@a=sort split;/$a[-1]/;$_=4-"@-"/3

Versuch es mit mir .

Konvertiert die Kartennamen so, dass die Reihenfolge der Spielwerte der alphabetischen Reihenfolge folgt, wählt dann durch Sortieren die höchste aus und sucht danach in der ursprünglichen Zeichenfolge nach der Position.

nutki
quelle
2

Rubin, 59 + 2 = 61

naFühren Sie mit Befehlszeilenflags aus

p (1..4).max_by{|i|$F[i-1].tr($_[1]+'SJQKA','a-z').reverse}
Histokrat
quelle
2

J, 47 Bytes

1+[:(i.>./)_3+/\16!@-]i.~'SXAKQJT9876543'1}~1&{

Verwendung:

   (1+[:(i.>./)_3+/\16!@-]i.~'SXAKQJT9876543'1}~1&{) 'TH QC 9S 8S'
3

Methode:

  • Für jedes Eingabezeichen weisen wir einen Wert zu, der auf seiner Position in der 'S[second char of input]AKQJT9876543'Zeichenfolge basiert . Nicht gefundene Zeichen erhalten den Wert last position + 1implizit. Weitere Zeichen haben viel weniger Wert ( value=(16-position)!).
  • Berechnen Sie die Summe für das 3-Eingabe-Zeichen-Triplett und ein Duplett (z . B. TH_ QC_ 9S_und 8S).
  • Wählen Sie den 1-basierten Index des Maximalwerts.

(J kann Zeichen oder Zeichenketten leider nicht direkt vergleichen. Es kann nur auf Gleichheit geprüft werden, was einige andere Ansätze für diese Herausforderung ausschließt.)

Probieren Sie es hier online aus.

randomra
quelle
2

C # 237

using System;namespace S{class P{static void Main(string[] a){var V="23456789TJQKA";int x=0;int y=0;var z=a[0][1];for(int i=0;i<4;i++){int q=V.IndexOf(a[i][0])+2;var w=a[i][1];q*=w==z?1:w=='S'?9:0;if(q>y){x=i;y=q;}}Console.Write(x+1);}}}

So funktioniert es: Durchlaufen Sie jede Hand, um den "Wert" der Karte zu berechnen. Speichern Sie den Index mit dem höchsten Wert. Ein Kartenwert wird als Rang der Karte multipliziert mit 0 bestimmt, wenn es sich nicht um einen Spaten oder die Eröffnungsfarbe handelt, 1, wenn es sich um die Eröffnungsfarbe handelt, und 9, wenn es sich um einen Spaten, aber nicht um die Eröffnungsfarbe handelt. (9 gewählt b / c 2 * 9 = 18> A = 14 & 9 ist ein einzelnes Zeichen)

CSCODE
quelle
1

Pyth, 36 33 Bytes

KczdhxKeo,x,ehK\SeNXhN"TKA""AYZ"K

Ziemlich unkompliziert, verwendet eine Sortierung mit einer benutzerdefinierten Schlüsselfunktion und findet dann den Index mit dem höchsten Wert.

orlp
quelle
Haben Sie versucht, die Sortierung zu umgehen und nur den höchsten Wert zu finden? In JavaScript stellte sich heraus, dass es kürzer war
edc65
@ edc65 In Pyth gibt es keine Operation, um den höchsten Wert zu finden, nur um zu sortieren. Mit einem Zeichen ( e) können Sie jedoch das letzte Element abrufen. Wenn Sie also den höchsten Wert ermitteln, wird nur sortiert, und anschließend das letzte Element abgerufen.
Orlp
Downvoter, willst du das erklären?
Orlp
1

Pyth, 31 Bytes

hxczdeo}\SNo}@z1Zox"TJQKA"hNScz

Probieren Sie es hier aus.

Wie es funktioniert:

Der richtige Weg, diese Prozedur zu lesen, ist von hinten nach vorne. Die Prozedur sortiert die gewünschte Karte an das Ende der Liste, zieht sie dann heraus und findet ihren Index in der ursprünglichen Liste.

  • cz: Dies erzeugt die Liste der Kartenstrings. c, chop, ist normalerweise eine Binärfunktion (arity 2), aber wenn nur ein Eingang aufgerufen wird, dient dies als .split()String-Methode.

  • S: Hiermit wird das normale Sortierverhalten angewendet, bei dem Karten mit niedrigeren Nummern vor Karten mit höheren Nummern sortiert werden.

  • ox"TJQKA"hN: Ordnet die Karten nach dem Index ( x) in der Zeichenfolge "TJQKA"des ersten Buchstabens der Karte ( hN). Bei Karten mit Zahlen wird der erste Buchstabe nicht gefunden, was das Ergebnis ergibt -1. Da die Sortierfunktion von Pyth stabil ist, wird die Reihenfolge der nummerierten Karten nicht beeinflusst.

  • o}@z1Z: Als nächstes ordnen wir nach, ob die Farbe der ersten gespielten Karte ( @z1) auf der betreffenden Karte liegt. Da es sich um eine TrueSortierung nach hinten handelt False, werden die Karten der Hauptfarbe nach hinten gesendet.

  • o}\SN: Dies ist die gleiche Sortierung wie zuvor, es wird jedoch danach sortiert, ob sich der Buchstabe Sauf der Karte befindet, und der Pik wird nach hinten gesendet.

  • hxczde: Dies extrahiert die letzte Karte, die auf diese Weise sortiert wurde ( e), findet ihren Index in der Liste der Karten ( xczd) und erhöht sich um 1 ( h), wobei der gewünschte Spielerplatz angegeben wird.

isaacg
quelle