Pyth, 73 bajty
eo_S+*-5l@\AN}SPMJ+NZSM.:+\AT5+-4l{eMJlM.gPkJ-sM*=T+`M}2Tc4"JQKA""hscd"=Zc
To jest okropne. Analizowanie kart, sortowanie wartości, ... Wszystko wymaga tak wielu znaków. Ale podejście jest interesujące.
Wypróbuj online: pakiet demonstracyjny lub testowy
Wyjaśnienie:
Generuję wszystkie 52 karty, usuwam cztery karty wejściowe, generuję wynik dla każdej karty (wynik ręki) i drukuję kartę z maksymalnym wynikiem.
Wynik jest trochę dziwny. Jeśli porównam wynik dwóch całkowicie różnych rąk, może wybrać niewłaściwego zwycięzcę. Np. Strit pokonałby 4 asy. Ale to działa, jeśli pierwsze 4 karty są takie same w obu rękach. A mój obliczony wynik w rzeczywistości nie jest wartością, ale listą wartości:
- G: Najpierw grupuję 5 kart według rangi i przyjmuję długości:
5h 5d 6c 5s Jd
->
[3, 1, 1]
- F: Następnie dołączam 4 minus liczbę różnych pakietów do tej listy.
Flush
->
3
dołącza się,not flush
->
2/1/0
dołącza się.
- S: Dodaj kolejny numer.
0
jeśli nie jest to prosta, 4
jeśli jest to prosta A2345
lub 5
jeśli jest to prosta wyższa.
Te listy 4-7 liczb są sortowane w malejącej kolejności i wybierana jest lista o maksymalnej wartości.
Dlaczego to działa? Tutaj możesz zobaczyć możliwe konfiguracje dla wszystkich typów. Litera obok cyfr informuje, z jaką zasadą wygenerowano ten numer.
- Poker:
[5S, 3F, 1G, 1G, 1G, 1G, 1G]
lub[4S, 3F, 1G, 1G, 1G, 1G, 1G]
- Czterech z gatunku:
[4G, 1G, 0F, 0S]
- Pełen dom:
[3G, 2G, 1F, 0S]
lub[3G, 2G, 0F, 0S]
- Spłukać:
[3F, 1G, 1G, 1G, 1G, 1G, 0S]
- Prosto:
[5S, 2F, 1G, 1G, 1G, 1G, 1G]
, [5S, 1F, 1G, 1G, 1G, 1G, 1G]
, [5S, 1G, 1G, 1G, 1G, 1G, 0F]
, [4S, 2F, 1G, 1G, 1G, 1G, 1G]
,[4S, 1F, 1G, 1G, 1G, 1G, 1G]
,[4S, 1G, 1G, 1G, 1G, 1G, 0F]
- Trzy z rodzaju:
[3G, 1G, 1G, 1F, 0S]
,[3G, 1G, 1G, 0F, 0S]
- Dwie pary:
[2G, 2G, 2F, 1G, 0S]
,[2G, 2G, 1F, 1G, 0S]
,[2G, 2G, 1G, 0F, 0S]
- Jedna para:
[2G, 2F, 1G, 1G, 1G, 0S]
,[2G, 1G, 1G, 1G, 1F, 0S]
,[2G, 1G, 1G, 1G, 0F, 0S]
- Wysoka karta:
[2F, 1G, 1G, 1G, 1G, 1G, 0S]
, [1F, 1G, 1G, 1G, 1G, 1G, 0S]
,[1G, 1G, 1G, 1G, 1G, 0S, 0F]
Pyth porównuje listy pod względem elementów. Jest więc oczywiste, że strit zawsze pokona Kareta. Większość typowych zasad pokera jest oczywistych w przypadku tych list. Niektóre wydają się sprzeczne.
- Straight wygra z Czwórką lub Fletem: żaden problem. Jeśli masz szansę na uzyskanie Karety / Fula z kartą na riverze, to nie możesz jednocześnie osiągnąć strita (ponieważ masz już 2 lub 3 różne zestawy na ręce).
- Straight wygra przeciwko kolorowi. Jeśli możesz uzyskać kolor i strita z kartą na riverze, to możesz także osiągnąć kolor. A strit ma lepszy wynik niż strit i kolor.
- Jedna para
[2G, 2F, 1G, 1G, 1G, 0S]
wygra przeciwko dwóm parom rąk. Również nie ma problemu. Jeśli otrzymujesz dwie pary z kartą na riverze, to zanim miałeś przynajmniej jedną parę na riverze. Ale to oznacza, że możesz poprawić do trójki, co jest lepsze. Tak więc dwie pary nigdy nie będą odpowiedzią.
- Wysoka karta
[2F, 1G, 1G, 1G, 1G, 1G, 0S]
wygrywa z jedną parą rąk. Jeśli jest to najlepszy wynik, jaki możesz osiągnąć, przed rzeką będziesz mieć 3 karty jednego zestawu i jedną kartę innego zestawu. Ale wtedy możesz wybrać kartę z jednym z tych dwóch pakietów i wartością, która już się pojawi, a skończysz na wyniku [2F, 2G, ...]
, który również jest lepszy.
To wybiera odpowiedni rodzaj rozwiązania. Ale jak uzyskać najlepszą jedną parę (spośród 4 możliwości), jak wybrać najlepszą strit, ...? Ponieważ dwa różne rozwiązania z jedną parą mogą mieć ten sam wynik.
To łatwe. Pyth gwarantuje stabilne sortowanie (przy maksimum). Więc po prostu generuję karty w kolejności 2h 2s 2c 2d 3h 3s ... Ad
. Karta o najwyższej wartości automatycznie będzie więc wartością maksymalną.
Szczegóły dotyczące wdrożenia
=Zc
dzieli ciąg wejściowy i przechowuje listę kart Z
.
=T+`M}2Tc4"JQKA"
generuje listę rang ['2', ..., '10', 'J', 'Q', 'K', 'A']
i przechowuje je w T
. -sM*T..."hscd"Z
generuje każdą kombinację rangi z pakietami i usuwa karty Z
.
o...
porządkuje pozostałe karty według: lM.gPkJ
długości grup rang, +-4l{eMJlM
dołącza 4 - długości (zestawy), +*-5l@\AN}SPMJ+NZSM.:+\AT5
dodaje 0/4/5 w zależności od zestawu (generuj każdy podciąg o długości 5 „A” + T, sprawdź, czy ręka jeden z nich (wymaga sortowania ręki i wszystkich podzbiorów), pomnóż przez 5 - liczbę „A” na karcie), _S
sortowanie listy maleje.
e
wybierz maksimum i wydrukuj.
JavaScript (ES6),
329324317312309 bajtówJak to działa
Dla każdej pozostałej karty w talii obliczamy wynik rozdania
S
. Im niższy wynik, tym lepsza ręka.Zmienne używane do obliczania wyniku
F
: fałsz, jeśli ręka jest koloruc
: maska bitowa klubówd
: maska bitowa diamentówh
: maska bitowa Kiers
: maska bitowa pikx = c | d
: maska bitowa trefl lub karoy = h | s
: maska bitowa kier lub pika
: maska bitowa wszystkich połączonych kolorówp = c & d | x & y | h & s
: parowanie maski bitowej (1)t = c & d & y | h & s & x
: trzyosobowa maska bitowa (1)(1) Napisałem te formuły kilka lat temu i użyłem ich w kilku silnikach pokerowych. Oni pracują. :-)
Inne formuły
c & d & h & s
: czteroosobowa maska bitowaa == 7681
: test na specjalną prostą „A, 2, 3, 4, 5” (0b1111000000001)((j = a / 31) & -j) == j
: test na wszystkie inne prosteTabela wyników
Uwaga: nie musimy przejmować się dwiema parami, które nie mogą być naszą najlepszą opcją. (Jeśli mamy już jedną parę, możemy zamienić ją w trójkę. A jeśli mamy już dwie pary, możemy zamienić je w Full House.)
Przypadki testowe
Pokaż fragment kodu
źródło
JavaScript (ES6), 307
349Jest to dość nieporęczne i nie jestem pewien, czy to najlepsze podejście.
Może jeszcze trochę golfa.Mniej golfa
Test
źródło