Hold'em หรือ Fold'em


17

เพื่อนของคุณเชิญคุณเข้าร่วมการแข่งขันโปกเกอร์ขั้นสูงในนาทีสุดท้ายและในฐานะนักวิทยาศาสตร์คอมพิวเตอร์คุณตัดสินใจที่จะใช้ทักษะของคุณเพื่อสร้างความได้เปรียบให้กับเกม งานของคุณจะได้รับ2 cards(มือของคุณ) และ0, 3, 4 or 5 cards(ไพ่ที่แจก) คุณต้องตัดสินใจว่ามือที่ดีที่สุดที่คุณจะได้รับคืออะไร หากได้รับไพ่ทั้งหมด 7 ใบเป็นอาร์กิวเมนต์คำตอบนั้นค่อนข้างชัดเจน หากได้รับน้อยปัญหาจะซับซ้อนมากขึ้น อย่างไรก็ตามมันไม่เพียงพอที่จะให้คุณได้เปรียบคุณต้องคำนวณมือที่ดีที่สุดที่เป็นไปได้จากไพ่ที่เหลือเพื่อให้เข้าใจว่าฝ่ายตรงข้ามของคุณจะมีอะไรบ้าง


Hold'em Refresher

หากคุณไม่รู้จัก Hold'em ผู้เล่นแต่ละคนในเกมจะเริ่มด้วยไพ่ 2 ใบในมือของพวกเขา ในช่วงระยะเวลา 3 รอบจะมีการเปิดเผยการ์ดเพิ่มเติมเพื่อแบ่งปันระหว่างผู้เล่นทุกคน เทิร์นแรกไพ่ 3 ใบถูกเปิดเผย ครั้งที่สองอีก 1 และครั้งที่สามมีการเปิดเผยไพ่ใบสุดท้าย ไพ่สองใบแรกที่มอบให้แสดงถึงมือของคุณในขณะที่ไพ่หลังนั้นเป็น 0, 3, 4 หรือ 5 ใบที่ได้รับจากการเปลี่ยนต่อเนื่อง


ตัวเลขที่เป็นไปได้:

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

ชุดที่เป็นไปได้:

[S,C,H,D]

เด็คเต็มรูปแบบ:

[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.

อันดับมือ:

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).

ให้ยกตัวอย่างหรือสองตัวอย่างแล้วเดินผ่านมันไป

ตัวอย่างง่ายๆ:

[AS, AC],[AH,AD,9S,9C,9H]-> 3(สี่ชนิด), 3(สี่ชนิด)

มือที่ดีที่สุดที่คุณจะมีในการตั้งค่านี้คือไพ่สี่ใบในมือ มือที่ดีที่สุดที่เป็นไปได้ที่คู่ต่อสู้ของคุณอาจเป็น 4-of-a-kind เนื่องจากคุณไม่สามารถมี KQJ10 ในมือไพ่ 2 ใบของพวกเขา


[5C,2C],[6C,4C,JH,JD]-> 2(ฟลัชท์แบบตรง), 3(4-of-a-Kind)

คุณมีความเสี่ยงที่จะได้รับการจู่โจมแบบตรง แต่เนื่องจากคุณมี 2 / 5C ในมือของคุณไม่มีใครเลยที่คุณถือไพ่กลางทั้งคู่ สิ่งที่ดีที่สุดที่พวกเขาสามารถคาดหวังได้คือมีแจ็คพ็อค 2 พ็อคเก็ตและการได้แจ็ค


[JS,JC],[]-> 1(Royal Flush), 1(Royal Flush)

ไม่มีข้อมูลที่คุณสามารถใช้กับพวกเขาได้สิ่งที่คุณสามารถบอกได้ในขณะนี้คือพวกเขาสามารถมีเพียงกษัตริย์ที่เปี่ยมด้วยอัญมณี / หัวใจเท่านั้น ในความเป็นจริงอินพุตทั้งหมดที่ฟลอพยังไม่เกิดขึ้นควรส่งผลให้ได้คำตอบ 1-1


[2C,4S],[3C,7S,9D,AH,JD]-> 10(บัตรสูง), 7(3-of-a-Kind)

นี่คือตัวอย่างของการที่คุณเมาอย่างแน่นอนและไม่มีความเป็นไปได้ที่จะเกิดแม่น้ำตรงหรือแดง ความหมายของมือที่ดีที่สุดในที่นี้คือเอซพ็อคเก็ตทำให้เป็น 3-of-a-Kind


ข้อกำหนดของ I / O

  • ข้อมูลจะต้องแยกระหว่างสิ่งที่อยู่ในมือของคุณและสิ่งที่เป็นความรู้สาธารณะ มันอาจจะง่ายขึ้นด้วยวิธีนี้โดยไม่คำนึงถึงการใช้งาน
    • การ์ดสามารถเป็นสิ่งอันดับหรือสตริงขึ้นอยู่กับคุณ
    • มือและสนามเด็กเล่นสามารถเป็นอาร์เรย์หรือสตริงที่มีการคั่น
  • ผลลัพธ์จะต้องเป็นดัชนีสองรายการจากรายการมือที่ฉันได้ให้ไว้ (EG [2,1])
    • มันอาจถูกส่งกลับเป็นส่วนหนึ่งของฟังก์ชั่นพิมพ์ไปยังคอนโซลหรือเอาท์พุทในลักษณะที่เหมาะสม
    • ต้องมีค่าที่แตกต่างกันสองค่าค่าหนึ่งสำหรับมือที่ดีที่สุดของคุณอีกค่าหนึ่งสำหรับค่าที่ดีที่สุด
  • 10 อาจถูกแทนด้วยTหรือตาม10ความเหมาะสมสำหรับคุณ
  • ช่องโหว่มาตรฐานไม่ได้รับอนุญาต

เกณฑ์การชนะ

  • นี่คือ , ไบต์ต่ำสุดที่นับพร้อมไทเบรกของวันที่โพสต์

2
ไม่ควรมีเพียงหนึ่งAและ1ในบัตรได้รับอนุญาตให้ไปได้หรือไม่ 11นอกจากนี้ผมไม่คิดว่ามีจริงๆเหตุผลที่น่าสนใจที่จะต้องมีตัวย่อที่ใบหน้ามากกว่าค่าตัวเลขเช่น
FryAmTheEggman


9
ผมไม่เคยเห็นดาดฟ้ากับและA 1ทุกอย่างดูดี
isaacg

1
สำหรับเราที่ไม่ใช่ผู้เล่นโป๊กเกอร์โปรดอธิบายในคำถามว่าไพ่กลุ่มที่สองนั้นมีการแชร์กันระหว่างคุณและคู่ต่อสู้ของคุณในขณะที่พวกเขามีไพ่สองใบของตัวเองที่คุณมองไม่เห็น คำศัพท์ได้อย่างรวดเร็วการกำหนดเงื่อนไขกระเป๋า , flopและแม่น้ำจะเป็นประโยชน์
DLosc

1
มีประโยชน์ด้วย: อธิบายลำดับทั้งหมดของรอบ (ผู้เล่นแต่ละคนเริ่มด้วยไพ่สองใบที่รู้จักกันเท่านั้นจากนั้นไพ่สามใบจะถูกแจกหงายหน้าจากนั้นหนึ่งในสี่จากนั้นหนึ่งในห้าจุดที่ผู้เล่นแต่ละคนจะสร้าง "มือ" จากไพ่ห้าใบในเจ็ดใบที่มองเห็นได้ .) บางคนอาจไม่ชัดเจนว่าทำไมถึงมีไพ่เจ็ดใบ แต่มือประกอบด้วยไพ่ห้าใบ
DLosc

คำตอบ:


3

Haskell , 433 430 425 ไบต์

-5 ไบต์ขอบคุณ @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)

ลองออนไลน์!

Ungolfed (ความคิดเดียวกันโครงสร้างที่แตกต่างกันเล็กน้อย):

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)

ช้ามากเนื่องจากไม่มีปลอกพิเศษเลย (เช่นหากไม่มีการ์ดแสดงขึ้นรอยัลฟลัชจึงเป็นไปได้เสมอ) ความพยายามในการเล่นกอล์ฟส่วนใหญ่ของฉันเข้าสู่ rank_handทำงาน #สามารถเล่นกอล์ฟได้มากขึ้นโดยการรวมแผนที่และสิ่งต่าง ๆ เข้าด้วยกัน

hand#tableคำนวณคะแนนที่ดีที่สุดสำหรับคุณและคู่ต่อสู้ของคุณ ไม่มีการตรวจสอบข้อผิดพลาด


ฉันคิดว่าคุณลืมs/elem/e/gหลังจากกำหนดe=elemดังนั้นควรประหยัด 9ish bytes ฉันคิดว่าคุณสามารถลบช่องว่างบางส่วนโดยเฉพาะอย่างยิ่งที่ตัวระบุติดตามหมายเลขโดยตรง
Julian Wolf

@JulianWolf ฉันยังใหม่กับ Haskell แต่ด้วยเหตุผลบางอย่างมันดูเหมือนว่าe=elemอนุมานประเภท Int-> Bool ดังนั้นมันจึงไม่ได้รวบรวมเมื่อฉันใช้ e สำหรับการโทร elem ที่ไม่ใช่จำนวนเต็ม ฉันกำลังพยายามหาสาเหตุว่าทำไม ขอบคุณสำหรับเคล็ดลับในช่องว่าง!
vroomfondel

อ่าคุณพูดถูก Haskell มีปัญหาในการอนุมาน polymorphic types บางครั้ง - ไม่แน่ใจว่าส่วนบนของหัวของฉันไม่ว่าจะมีวิธีแก้ไขที่ง่ายกว่าการเพิ่มธงแบบยืดหยุ่น
Julian Wolf

1
h#t=let[...]in[...]h#t|let[...]=[...]สามารถลงไป นอกจากนี้ยังเป็นhead n n!!0ในยาม&&สามารถเป็น,ได้
Laikoni
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.