Kto wygrywa lewę Spades


19

Napisz kod, aby ustalić, kto wygrywa lewą lewą lewę w grze pik . Wygrywa najmniej bajtów.

Dane wejściowe to ciąg znaków, który zawiera listę czterech kart zagranych w kolejności, takich jak TH QC JH 2H(Dziesiątka kier, Królowa trefl, Walet kier, Dwóch kier). Karta jest dana przez dwie postacie: kolor od CDHSi wartość od 23456789TJQKA. Masz gwarancję, że dane wejściowe są prawidłowe, a karty są różne.

Powinieneś wypisać liczbę 1, 2, 3 lub 4 dla zwycięzcy lewy. W tym przykładzie TH QC JH 2Hwalet kier wygrywa lewę, więc powinieneś wyrzucić 3.

Twoje dane wejściowe i wyjściowe muszą być dokładnie takie, jak opisano, z wyjątkiem tego, że końcowe znaki nowej linii są opcjonalne.

Oto zasady pik do wygrania lewy. Zwycięska karta jest najwyższą z czterech, z pewnymi zastrzeżeniami. Pik jest atutem , więc każdy pik przewyższa każdy pik. Kolor pierwszej zagranej karty jest kolorem wiodącym i tylko karty tego koloru lub pik mogą wygrać lewę. Karty tego samego koloru są porównywane według ich wartości, które są podane w kolejności rosnącej jak 23456789TJQKA.

Przypadki testowe:

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

Odpowiedzi:


10

Pyth, 28 27 25 bajtów

J"KTAZ"hxcz)eo_XN+@z1JJcz

Wypróbuj online: Pakiet demonstracyjny lub testowy (pierwsze 4 znaki to konstrukcja pakietu testowego)

Dzięki @isaacg za lewę, która pozwoliła zaoszczędzić 2 znaki.

Główną ideą jest taka modyfikacja znaków każdej ręki, aby wygrywająca ręka miała maksymalną wartość.

Wartości rąk 23456789TJQKAsą już prawie posortowane. Po prostu muszę wymienić Tz A, Kz Ti Az Z, wynikające z 23456789AJQSZ.

Kolejność kolorów CDHSjest bardzo ważna. S, najmocniejszy kolor, który jest już wartością maksymalną. Ważne jest, aby nadać kolorowi z pierwszej ręki drugą najsilniejszą wartość. Więc tłumaczę ten garnitur na K.

Wszystkie ręce muszą być również odczytane w odwrotnej kolejności, ponieważ kolor ma większą moc niż wartość.

                           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


Nie sądzę, żeby .eto było tego warte - użycie ojest o 1 postać krótsze.
isaacg

@isaacg Twoje prawo. Zabawne jest to, że miałem rozwiązanie 27 przed .erozwiązaniem 28. Ale rozwiązanie 27 zakończyło się na „a” )i dlatego miało również 28 bajtów. : ups:
Jakube,

1
Pomyślałem o sposobie zapisania kolejnych 2 znaków: Przetłumacz z +@z1"KTA"na "KTAZ", ale zamiast używać ciągów, użyj bezpośrednio J"KTAZ"na początku i +@z1Jdo J.
isaacg,

@isaacg Bardzo sprytny. Dzięki. Btw. Długo zastanawiam się nad uczynieniem trzeciego argumentu Xopcjonalnym (tylko jeśli aib są ciągami znaków). Ale nie jestem do końca pewien, czy Xab)powinienem ocenić Xab_b(odwrócony b, byłby miły dla takich rzeczy jak Xa"</\>") lub Xab+tbhb(b przesunięty). Jakie masz preferencje?
Jakube,

6

CJam, 34 33 bajty

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

Algorytm

Logika jest prosta. W tej chwili mam niestandardowy rodzaj, w którym pierwszeństwo ma druga postać reprezentująca kolor. W tym przypadku pik ma najwyższy priorytet, a następnie pierwszy rzucony zestaw. Reszta wszyscy są -1. Potem porządek na pierwszy znak z zamiana Tz Ai Qze Kmieć leksykalny sortowania.

Wyjaśnienie kodu

Po pierwsze, zobaczmy, jaki jest porządek leksykalny wartości nominalnych kart:

"23456789TJQKA"$

23456789AJKQT

Tak więc wszystkie liczby są w prawidłowej pozycji. Jjest również w prawidłowej pozycji. Musimy zamienić Ki Qi Ji Ado porządkowania leksykalny.

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";

Wypróbuj online tutaj


3

JavaScript (ES6), 112

Zeskanuj listę i zwróć pozycję o najwyższej znalezionej wartości.

Uruchom fragment kodu, aby przetestować (w przeglądarce 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>


3

Perl, 73 bajty

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

Spróbuj mnie .

Konwertuje nazwy kart, aby kolejność wartości w grze była zgodna z kolejnością alfabetyczną, a następnie wybiera najwyższą, sortując i wyszukuje ją w oryginalnym ciągu znaków dla pozycji.


2

Rubin, 59 + 2 = 61

Z flagami wiersza poleceń nauruchom

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

2

J, 47 bajtów

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

Stosowanie:

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

Metoda:

  • Do każdego znaku wejściowego przypisujemy wartość na podstawie jego pozycji w 'S[second char of input]AKQJT9876543'ciągu. Nieznane znaki uzyskują wartość last position + 1domyślnie. Kolejne znaki mają znacznie mniejszą wartość ( value=(16-position)!).
  • Oblicz sumę dla 3 trypletów 3 znaków wejściowych i jednego dupletu (np. TH_ QC_ 9S_I 8S).
  • Wybierz indeks wartości maksymalnej na podstawie 1.

(J niestety nie może bezpośrednio porównywać znaków lub ciągów. Może jedynie sprawdzić ich równość, co wykluczyło inne podejścia do tego wyzwania.)

Wypróbuj online tutaj.


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);}}}

Jak to działa: Iteruj każdą ręką, aby obliczyć „wartość” karty. Zapisz indeks o najwyższej wartości. Wartość karty jest określana jako ranga karty pomnożona przez 0, jeśli nie jest to pik lub kolor otwarcia, 1, jeśli jest to kolor otwarcia, a 9, jeśli jest to pik, ale nie kolor otwarcia. (9 wybranych b / c 2 * 9 = 18> A = 14 i 9 to pojedynczy znak)


1

Pyth, 36 33 bajtów

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

Dość proste podejście, wykorzystuje sortowanie z niestandardową funkcją klucza, a następnie znajduje indeks o najwyższej wartości.


Czy próbowałeś uniknąć tego rodzaju i po prostu znalazłeś najwyższą wartość? W JavaScript, który okazał się krótszy
edc65

@ edc65 W Pyth nie ma operacji znalezienia najwyższej wartości, tylko sortowanie. Ale za pomocą jednego znaku ( e) możesz uzyskać ostatni element, więc znalezienie najwyższej wartości jest po prostu sortowaniem, a następnie uzyskaniem ostatniego elementu.
lub

Downvoter, chcesz wyjaśnić?
orlp

1

Pyth, 31 bajtów

hxczdeo}\SNo}@z1Zox"TJQKA"hNScz

Wypróbuj tutaj.

Jak to działa:

Właściwy sposób na przeczytanie tej procedury jest od początku do końca. Procedura sortuje żądaną kartę na końcu listy, a następnie wyciąga ją i znajduje indeks na oryginalnej liście.

  • cz: Generuje listę ciągów kart. c, chop, jest zwykle funkcją binarną (arity 2), ale gdy jest wywoływana tylko na jednym wejściu, służy jako .split()metoda łańcuchowa.

  • S: Stosuje się normalne zachowanie sortowania, które sortuje karty o niższych numerach przed kartami o wyższej wartości.

  • ox"TJQKA"hN: Porządkuje karty według indeksu ( x) w ciągu "TJQKA"pierwszej litery karty ( hN). W przypadku kart z cyframi nie znaleziono pierwszej litery, co daje wynik -1. Ponieważ funkcja sortowania Pytha jest stabilna, nie ma to wpływu na kolejność kart numerowanych.

  • o}@z1Z: Następnie ustalamy, czy kolor pierwszej zagranej karty ( @z1) znajduje się na danej karcie. Ponieważ Truesortuje się za sobą False, wysyła karty koloru wiodącego na plecy.

  • o}\SN: Jest to to samo co poprzednio, ale Szależy od tego, czy litera znajduje się na karcie, wysyłając pik do tyłu.

  • hxczde: Wyodrębnia ostatnią kartę posortowaną w ten sposób ( e), znajduje jej indeks na liście kart ( xczd) i zwiększa ją o 1 ( h), podając pożądaną lokalizację gracza.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.