Bình thường, 73 byte
eo_S+*-5l@\AN}SPMJ+NZSM.:+\AT5+-4l{eMJlM.gPkJ-sM*=T+`M}2Tc4"JQKA""hscd"=Zc
Điều này là khá khủng khiếp. Phân tích cú pháp thẻ, sắp xếp các giá trị, ... Mọi thứ cần rất nhiều ký tự. Nhưng cách tiếp cận là thú vị.
Dùng thử trực tuyến: Trình diễn hoặc Test Suite
Giải trình:
Tôi tạo tất cả 52 thẻ, loại bỏ bốn thẻ của đầu vào, tạo điểm cho mỗi thẻ (điểm của tay) và in thẻ với số điểm tối đa.
Điểm số hơi kỳ quặc. Nếu tôi so sánh điểm của hai tay hoàn toàn khác nhau, nó có thể chọn sai người chiến thắng. Ví dụ, một đường thẳng sẽ đánh bại 4 con át chủ bài. Nhưng nó hoạt động, nếu 4 thẻ đầu tiên giống nhau ở cả hai tay. Và điểm số được tính toán của tôi thực sự không phải là một giá trị, mà là một danh sách các giá trị:
- G: Đầu tiên tôi nhóm 5 thẻ theo thứ hạng và lấy độ dài:
5h 5d 6c 5s Jd
->
[3, 1, 1]
- F: Sau đó, tôi thêm 4 trừ số lượng bộ khác nhau vào danh sách này.
Flush
->
3
được nối thêm, not flush
->
2/1/0
được nối thêm.
- S: Thêm một số khác.
0
nếu nó không phải là một đường thẳng, 4
nếu nó là đường thẳng A2345
hoặc 5
nếu nó là đường thẳng cao hơn.
Các danh sách gồm 4-7 số này được sắp xếp theo thứ tự giảm dần và danh sách có giá trị tối đa được chọn.
Tại sao điều này làm việc? Ở đây bạn thấy các cấu hình có thể cho tất cả các loại. Chữ bên cạnh các số, cho bạn biết quy tắc nào số này đã được tạo.
- Thẳng tuôn ra:
[5S, 3F, 1G, 1G, 1G, 1G, 1G]
hoặc[4S, 3F, 1G, 1G, 1G, 1G, 1G]
- Bốn trong số các loại:
[4G, 1G, 0F, 0S]
- Nhà đầy đủ:
[3G, 2G, 1F, 0S]
hoặc[3G, 2G, 0F, 0S]
- Tuôn ra:
[3F, 1G, 1G, 1G, 1G, 1G, 0S]
- Thẳng:
[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]
- Ba của một loại:
[3G, 1G, 1G, 1F, 0S]
,[3G, 1G, 1G, 0F, 0S]
- Hai cặp:
[2G, 2G, 2F, 1G, 0S]
, [2G, 2G, 1F, 1G, 0S]
,[2G, 2G, 1G, 0F, 0S]
- Một cặp:
[2G, 2F, 1G, 1G, 1G, 0S]
, [2G, 1G, 1G, 1G, 1F, 0S]
,[2G, 1G, 1G, 1G, 0F, 0S]
- Thẻ cao:
[2F, 1G, 1G, 1G, 1G, 1G, 0S]
, [1F, 1G, 1G, 1G, 1G, 1G, 0S]
,[1G, 1G, 1G, 1G, 1G, 0S, 0F]
Pyth so sánh danh sách các yếu tố khôn ngoan. Vì vậy, rõ ràng là một tuôn thẳng sẽ luôn đánh bại Four of a kind. Hầu hết các quy tắc poker điển hình là rõ ràng với các danh sách này. Một số có vẻ mâu thuẫn.
- Một Straight sẽ giành chiến thắng trước Four of a kind hoặc Full house: Không thành vấn đề. Nếu bạn có cơ hội nhận được Four of a kind / Full house bằng thẻ sông, hơn là bạn không thể đi thẳng cùng một lúc (vì bạn đã có 2 hoặc 3 bộ khác nhau trong tay).
- Một Straight sẽ giành chiến thắng chống lại một tuôn ra. Nếu bạn có thể đạt được một lần xả và một đường thẳng với thẻ sông, thì bạn cũng có thể đạt được một đường thẳng. Và xả thẳng có điểm tốt hơn cả thẳng và xả.
- Một cặp
[2G, 2F, 1G, 1G, 1G, 0S]
sẽ giành chiến thắng trước một số hai tay đôi. Cũng không có vấn đề. Nếu bạn nhận được một cặp với thẻ sông, hơn bạn đã có ít nhất một cặp trước sông. Nhưng điều này có nghĩa là, bạn có thể cải thiện thành ba loại, tốt hơn. Vì vậy, một cặp đôi thực sự sẽ không bao giờ là câu trả lời.
- Thẻ cao
[2F, 1G, 1G, 1G, 1G, 1G, 0S]
sẽ giành chiến thắng trước một số tay đôi. Nếu đây là điểm số tốt nhất bạn có thể đạt được, trước khi ra sông, bạn sẽ có 3 thẻ của một bộ và một thẻ của một bộ khác. Nhưng sau đó, bạn có thể chọn thẻ có một trong hai bộ này và với giá trị đã xuất hiện, và bạn sẽ kết thúc với điểm số [2F, 2G, ...]
, điều này cũng tốt hơn.
Vì vậy, điều này chọn đúng loại giải pháp. Nhưng làm thế nào để tôi có được một cặp tốt nhất (trong số 4 khả năng), làm thế nào để tôi chọn được một cặp tốt nhất, ...? Bởi vì hai giải pháp một cặp khác nhau có thể có cùng số điểm.
Điều đó thật dễ dàng. Pyth đảm bảo phân loại ổn định (khi lấy tối đa). Vì vậy, tôi đơn giản tạo ra các thẻ theo thứ tự 2h 2s 2c 2d 3h 3s ... Ad
. Vì vậy, thẻ có giá trị cao nhất sẽ tự động là tối đa.
Chi tiết thực hiện
=Zc
chia chuỗi đầu vào và lưu danh sách thẻ vào Z
.
=T+`M}2Tc4"JQKA"
tạo danh sách các cấp bậc ['2', ..., '10', 'J', 'Q', 'K', 'A']
và lưu trữ chúng trong T
. -sM*T..."hscd"Z
tạo ra mỗi kết hợp xếp hạng với các bộ và loại bỏ các thẻ của Z
.
o...
sắp xếp các thẻ còn lại bằng cách: lM.gPkJ
chiều dài của các nhóm xếp hạng, +-4l{eMJlM
nối thêm 4 chiều dài (bộ), +*-5l@\AN}SPMJ+NZSM.:+\AT5
nối thêm 0/4/5 tùy theo bộ (tạo từng chuỗi con có độ dài 5 của "A" + T, kiểm tra xem tay có một trong số chúng (yêu cầu sắp xếp tay và sắp xếp tất cả các tập hợp con), nhân với 5 - số chữ "A" trong thẻ), _S
sắp xếp danh sách giảm dần.
e
chọn tối đa và in.