Hold'em hay Fold'em?


17

Bạn của bạn đã mời bạn tham gia một trò chơi bài xì phé cao vào phút cuối và, với tư cách là một nhà khoa học máy tính, bạn đã quyết định sử dụng các kỹ năng của mình để đạt được lợi thế trong trò chơi. Nhiệm vụ của bạn sẽ là, được trao 2 cards(bàn tay của bạn) và 0, 3, 4 or 5 cards(thẻ đã xử lý), bạn phải quyết định bàn tay tốt nhất bạn có thể nhận được sẽ là gì. Nếu tất cả 7 thẻ được đưa ra làm đối số, câu trả lời là khá rõ ràng. Nếu được đưa ra ít hơn, vấn đề trở nên phức tạp hơn. Tuy nhiên, điều này không đủ để cung cấp cho bạn lợi thế mà bạn đang tìm kiếm, bạn cũng phải tính toán tay bài tốt nhất có thể từ các thẻ còn lại để hiểu đối thủ của bạn có thể có gì.


Giữ lại

Nếu bạn không biết về Hold'em, mỗi người chơi trong trò chơi sẽ bắt đầu với 2 lá bài dưới dạng 'bàn tay' của họ. Trong vòng 3 'lượt', các thẻ bổ sung được tiết lộ sẽ được chia sẻ giữa tất cả người chơi. Lần đầu tiên, 3 thẻ được tiết lộ. Lần thứ hai, 1 lần nữa và lần thứ ba một thẻ cuối cùng được tiết lộ. Hai thẻ được đưa ra đầu tiên đại diện cho bàn tay của bạn, trong khi thẻ sau đại diện cho 0, 3, 4 hoặc 5 thẻ được đưa ra bởi các lượt tiếp theo.


Số có thể:

[2,3,4,5,6,7,8,9,T(10),J,Q,K,A]

Bộ đồ có thể:

[S,C,H,D]

Toàn bộ sàn:

[2S,3S,4S,5S,6S,7S,8S,9S,TS,JS,QS,KS,AS, # Spades.
 2C,3C,4C,5C,6C,7C,8C,9C,TC,JC,QC,KC,AC, # Clubs.
 2H,3H,4H,5H,6H,7H,8H,9H,TH,JH,QH,KH,AH, # Hearts.
 2D,3D,4D,5D,6D,7D,8D,9D,TD,JD,QD,KD,AD] # Diamonds.

Xếp hạng tay:

1:Royal Flush    (A-K-Q-J-10, all from the same suit).
2:Straight Flush (Sequential cards, all from the same suit).
3:Four-of-a-Kind (Self explanatory).
4:Full House     (3-of-a-kind and a 2-of-a-kind).
5:Flush          (All cards are from the same suit).
6:Straight       (Sequential Cards, any suits).
7:3-of-a-Kind    (Self explanatory).
8:2-Pair         (Double 2-of-a-Kind).
9:Pair           (2-of-a-Kind).
10:High Card     (You have absolutely nothing except a single card).

Hãy lấy một hoặc hai ví dụ và đi qua chúng:

Ví dụ đơn giản:

[AS, AC],[AH,AD,9S,9C,9H]-> 3(Bốn loại một), 3(Bốn loại)

Bàn tay tốt nhất có thể bạn sẽ có trong thiết lập này là bốn bàn tay tốt. Bàn tay tốt nhất có thể mà đối thủ của bạn có thể có cũng là loại 4, vì bạn không thể có KQJ10 trong tay 2 quân bài của họ.


[5C,2C],[6C,4C,JH,JD]-> 2(Flush thẳng), 3(4-of-a-Kind)

Bạn có nguy cơ bị lật thẳng, nhưng vì bạn có 2 / 5C trong tay, không ai khác là do bạn cầm cả hai thẻ giữa. Điều tốt nhất họ có thể hy vọng là có 2 Jacks bỏ túi và có được một Jack trên flop.


[JS,JC],[]-> 1(Flush Hoàng gia), 1(Flush Hoàng gia)

Không có thông tin nào bạn có thể sử dụng để chống lại chúng, tất cả những gì bạn có thể nói vào lúc này là chúng chỉ có thể có một viên kim cương / trái tim, nhưng cũng giống như bạn có thể có được sự tuôn ra của hoàng gia như chúng làm. Trong thực tế, tất cả các đầu vào mà flop vẫn chưa xảy ra sẽ dẫn đến câu trả lời 1-1.


[2C,4S],[3C,7S,9D,AH,JD]-> 10(Thẻ cao), 7(Loại 3)

Đây là một ví dụ về nơi bạn hoàn toàn say mê, và không có khả năng một dòng chảy thẳng hay tuôn ra trên sông. Có nghĩa là bàn tay tốt nhất ở đây là những con át chủ bài dẫn đến kết quả 3-of-a-Kind.


Yêu cầu I / O

  • Đầu vào phải được phân tách giữa những gì trong tay bạn và những gì là kiến ​​thức công cộng; cách này có thể sẽ dễ dàng hơn bất kể việc thực hiện.
    • Thẻ có thể là bộ dữ liệu hoặc chuỗi, tùy thuộc vào bạn.
    • Tay và Sân chơi có thể là mảng hoặc chuỗi phân cách.
  • Đầu ra phải là hai chỉ mục từ danh sách các tay tôi đã cung cấp (EG [2.1]).
    • Nó có thể được trả về như một phần của chức năng, được in ra bàn điều khiển hoặc đầu ra một cách phù hợp.
    • Phải có hai giá trị riêng biệt, một giá trị tốt nhất cho bạn, một giá trị tốt nhất có thể.
  • 10 có thể được đại diện như một Thoặc như 10, bất cứ điều gì có ý nghĩa đối với bạn.
  • Sơ hở tiêu chuẩn là không được phép.

Tiêu chí chiến thắng

  • Đây là , số byte thấp nhất với bộ ngắt kết nối của ngày đăng.

2
Không nên chỉ có một A1trong các thẻ được phép có thể? Ngoài ra tôi không nghĩ rằng thực sự có một lý do thuyết phục để yêu cầu viết tắt khuôn mặt trên các giá trị số như thế nào 11.
FryAmTheEggman


9
Tôi chưa bao giờ thấy một bộ bài với một Avà một 1. Mọi thứ khác có vẻ tốt.
isaacg

1
Đối với chúng tôi không phải người chơi Poker, vui lòng giải thích trong câu hỏi rằng nhóm thẻ thứ hai được chia sẻ giữa bạn và đối thủ của bạn, trong khi họ có hai thẻ riêng mà bạn không thể nhìn thấy. Một thuật ngữ nhanh chóng xác định các điều khoản bỏ túi , flopsông sẽ hữu ích.
DLosc

1
Cũng hữu ích: giải thích toàn bộ chuỗi của một vòng. (Mỗi người chơi bắt đầu với hai thẻ chỉ được biết đến với họ, sau đó ba thẻ được đối mặt, sau đó là một thẻ thứ tư, rồi một phần năm, tại đó mỗi người chơi tạo thành một "bàn tay" từ bất kỳ năm thẻ nào trong số bảy thẻ có thể nhìn thấy .) Có thể không rõ ràng với ai đó tại sao có bảy thẻ nhưng một tay gồm năm.
DLosc

Câu trả lời:


3

Haskell , 433 430 425 byte

-5 byte nhờ @Laikoni

import Data.List
q="23456789TJQKA"
e=elem
l=length
b=map
r p|z,elem 'A'u,elem 'K'u=1|z=2|e 4t=3|v<3=4|w=5|y=6|e 3t=7|v<4=8|v<5=9|1>0=10where u=[n!!0|n<-p];v=l$nub u;t=b(\n->l[x |x<-u,x==n])q;w=all(==(last$p!!0))[last s|s<-p];y=elem""[u\\s|s<-b(take 5.flip drop('A':q))[0..10]];z=y&&w
0%_=[[]]
n%(x:y)=b(x:)((n-1)%y)++n%y
_%_=[]
h#t|let p=h++t;c i=minimum$b r$concat$b(5%)$b(++i)((7-l i)%([n:[s]|n<-q,s<-"SCHD"]\\p))=(c p,c t)

Hãy thử trực tuyến!

Ungolfed (cùng ý tưởng, cấu trúc hơi khác nhau):

import Data.List -- for (\\)
numbers = "23456789TJQKA"

e=elem

rank_hand hand
    |royal_flush=1
    |straight_flush=2
    |four_of_a_kind=3
    |full_house=4
    |flush=5
    |straight=6
    |three_kind=7
    |two_pair=8
    |pair=9
    |1>0=10
    where nums = [head n | n<-hand]
          unique = length $ nub nums
          counts = map (\n->length [x | x<-nums, x==n]) numbers
          pair = unique < 5
          two_pair = unique < 4 -- could also be 3 of a kind, but that's ok
          three_kind = e 3 counts
          flush = all (==(last$hand!!0)) [last s|s<-hand]
          straight = elem "" [nums\\s | s <- map (take 5.flip drop ('A':numbers))[0..10]]
          full_house = unique < 3
          four_of_a_kind = e 4 counts
          straight_flush = straight && flush
          royal_flush = straight_flush && elem 'A' nums && elem 'K' nums

-- taken from /codegolf//a/34496/66460
-- k%l finds combinations of size k from a list l
0%_=[[]]
n%(x:y)=map(x:)((n-1)%y)++n%y
_%_=[]

-- find every combination available to each player, and rank each one. 
-- could be golfed a lot more.
h#t=let p=h++t
        a=[n:[s]|n<-numbers,s<-"SCHD"]\\p
        c i=minimum $ map rank_hand $ concat $ map (5%) $ map (++i) ((7-length i)%a)
    in(c p,c t)

Rất chậm, vì không có vỏ bọc đặc biệt nào cả (ví dụ: nếu không có thẻ nào được hiển thị, luôn luôn có thể xả nước hoàng gia.) Hầu hết nỗ lực chơi gôn của tôi đã đi vào rank_hand chức năng; #có thể được chơi golf nhiều hơn nữa bằng cách kết hợp các bản đồ và như vậy.

hand#tabletính toán điểm số tối ưu cho bạn và đối thủ của bạn. Không kiểm tra lỗi.


Tôi nghĩ rằng bạn đã quên s/elem/e/gsau khi xác định e=elem, do đó sẽ giúp bạn tiết kiệm được 9 byte. Tôi nghĩ bạn cũng có thể xóa một số khoảng trắng, đặc biệt khi số nhận dạng theo số trực tiếp
Julian Wolf

@JulianWolf Tôi vẫn chưa quen với Haskell, nhưng vì một số lý do, nó trông giống như e=elemkiểu suy ra Int-> Bool vì vậy nó không được biên dịch khi tôi sử dụng e cho các cuộc gọi elem không nguyên. Tôi đang cố gắng tìm hiểu tại sao những gì đã được. Cảm ơn các mẹo trên không gian!
vroomfondel

À, bạn nói đúng. Haskell gặp khó khăn trong việc suy luận các loại đa hình đôi khi không chắc chắn trên đỉnh đầu của tôi liệu có cách khắc phục dễ dàng hay không, ngoài việc thêm cờ loại linh hoạt
Julian Wolf

1
h#t=let[...]in[...]có thể rút ngắn thành h#t|let[...]=[...]. Cũng head nn!!0. Trong một người bảo vệ &&có thể chỉ đơn giản là ,.
Laikoni
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.