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.