होल्डम या फोल्डेम?


17

आपके मित्र ने आपको अंतिम समय में एक उच्च-दांव पोकर गेम के लिए आमंत्रित किया और, एक कंप्यूटर वैज्ञानिक के रूप में, आपने खेल पर बढ़त हासिल करने के लिए अपने कौशल का उपयोग करने का निर्णय लिया है। आपका काम होगा, दिया गया 2 cards(आपका हाथ) और 0, 3, 4 or 5 cards(निपटाए गए कार्ड), आपको यह तय करना होगा कि आपको जो सबसे अच्छा हाथ मिल सकता है वह क्या होगा। यदि सभी 7 कार्ड तर्क के रूप में दिए गए हैं, तो उत्तर बहुत स्पष्ट है। यदि कम दिया जाता है, तो समस्या अधिक जटिल हो जाती है। हालाँकि, यह आपके लिए वह बढ़त देने के लिए पर्याप्त नहीं है, जिसे आप अपने विरोधियों के साथ-साथ क्या हो सकता है, यह समझने के लिए आपको शेष कार्ड से सर्वोत्तम संभव हाथ की गणना भी करनी होगी।


होल्डम रिफ्रेशर

यदि आप होल्डम के बारे में नहीं जानते हैं, तो खेल में प्रत्येक खिलाड़ी 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-का-एक प्रकार का हो सकता है, क्योंकि आपके पास उनके 2-कार्ड हाथों में KQJ10 नहीं हो सकता है।


[5C,2C],[6C,4C,JH,JD]-> 2(सीधा फ्लश), 3(4-ए-काइंड)

आप एक सीधे फ्लश के लिए जोखिम में हैं, लेकिन क्योंकि आपके हाथ में 2 / 5C है, कोई और नहीं आप दोनों मध्यम कार्ड रखने के कारण है। सर्वश्रेष्ठ वे उम्मीद कर सकते हैं कि 2 जेब वाले जैक हैं और फ्लॉप पर एक जैक प्राप्त कर रहे हैं।


[JS,JC],[]-> 1(रॉयल फ्लश), 1(रॉयल फ्लश)

उनके खिलाफ आपके द्वारा उपयोग की गई कोई भी जानकारी नहीं दी गई है, आप सभी को बता सकते हैं कि इस समय वे केवल हीरे / दिलों में एक शाही फ्लश कर सकते हैं, लेकिन यह केवल संभव है कि आप शाही फ्लश प्राप्त करें जैसा कि वे करते हैं। वास्तव में, सभी इनपुट जहां फ्लॉप होने के लिए अभी तक 1-1 उत्तर में परिणाम होना चाहिए।


[2C,4S],[3C,7S,9D,AH,JD]-> 10(हाई कार्ड), 7(3-ए-काइंड)

यह एक ऐसा उदाहरण है जहां आप बिल्कुल खराब हो गए हैं, और नदी को दिए गए सीधे या फ्लश की कोई संभावना नहीं है। मतलब यहां सबसे अच्छा हाथ जेब इक्के है जिसके परिणामस्वरूप 3-ए-काइंड है।


मैं / हे आवश्यकताएँ

  • आपके हाथ में क्या है और सार्वजनिक ज्ञान क्या है के बीच इनपुट को अलग किया जाना चाहिए; यह कार्यान्वयन की परवाह किए बिना इस तरह से आसान होगा।
    • कार्ड ट्यूपल्स या तार हो सकते हैं, आपके ऊपर।
    • हैंड एंड द प्लेइंग फील्ड एरेज़ या सीमांकित स्ट्रिंग्स हो सकता है।
  • आउटपुट मेरे द्वारा प्रदान किए गए हाथों की सूची से दो अनुक्रमित होना चाहिए (जैसे [2,1])।
    • इसे एक फ़ंक्शन के हिस्से के रूप में वापस किया जा सकता है, जो एक उपयुक्त तरीके से कंसोल या आउटपुट पर मुद्रित होता है।
    • दो अलग-अलग मूल्य होने चाहिए, एक आपके सर्वोत्तम हाथ के लिए, दूसरा सर्वोत्तम संभव के लिए।
  • 10 को एक Tया एक के रूप में दर्शाया जा सकता है 10, जो भी आपके लिए समझ में आता है।
  • मानक खामियों को अस्वीकार कर दिया जाता है।

जीत का मानदंड

  • यह , पोस्ट डेट के टाई-ब्रेकर के साथ सबसे कम बाइट-काउंट है।

2
वहाँ केवल Aऔर 1संभव अनुमति कार्ड में से एक नहीं होना चाहिए ? इसके अलावा, मुझे नहीं लगता कि सांख्यिक मूल्यों जैसे चेहरे के संक्षिप्तीकरण की आवश्यकता के लिए वास्तव में एक सम्मोहक कारण है 11
FryAmTheEggman


9
मैं एक Aऔर एक के साथ एक डेक कभी नहीं देखा है 1। बाकी सब कुछ अच्छा लग रहा है।
isaacg

1
हमारे लिए गैर-पोकर-खिलाड़ी, कृपया इस प्रश्न में स्पष्ट करें कि कार्ड का दूसरा समूह आपके और आपके प्रतिद्वंद्वी के बीच साझा किया गया है, जबकि उनके पास अपने दो कार्ड हैं जिन्हें आप नहीं देख सकते हैं। एक त्वरित शब्दावली शर्तों की जेब , फ्लॉप और नदी को परिभाषित करने में सहायक होगी।
DLosc

1
सहायक भी: एक दौर के पूरे अनुक्रम की व्याख्या करना। (प्रत्येक खिलाड़ी दो कार्डों से शुरू होता है, जिन्हें केवल उनके नाम से जाना जाता है, फिर तीन कार्डों का सामना किया जाता है, फिर एक चौथा, फिर पांचवां, जिसके बिंदु पर प्रत्येक खिलाड़ी सात में से किसी भी पांच कार्ड से "हाथ" बनाता है जो उन्हें दिखाई देता है ।) यह किसी के लिए स्पष्ट नहीं हो सकता है कि सात कार्ड क्यों हैं लेकिन एक हाथ में पांच होते हैं।
DLosc

जवाबों:


3

हास्केल , 433 430 425 बाइट्स

-5 बाइट्स @ लिकोनी को धन्यवाद

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, जिससे आपको 9 बाइट्स बचाना चाहिए। मुझे लगता है कि आप कुछ रिक्त स्थान भी निकाल सकते हैं, विशेष रूप से जहां पहचानकर्ता सीधे संख्याओं का पालन करते हैं
जूलियन वुल्फ

@ जूलियनवॉल्फ मैं अभी भी हास्केल के लिए नया हूं, लेकिन किसी कारण से यह e=elemहीन प्रकार का दिखता है इंट-> बूल इसलिए यह संकलन नहीं था जब मैंने गैर-पूर्णांक एलएम कॉल के लिए ई का उपयोग किया। मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या था। रिक्त स्थान पर टिप के लिए धन्यवाद!
विवरफोंडेल

आह, तुम सही हो। हास्केल को कभी-कभी बहुरूपी प्रकारों का जिक्र करने में परेशानी होती है — मेरे सिर के ऊपर से यकीन नहीं होता कि क्या कोई आसान फिक्स है, लचीले प्रकार के झंडे को जोड़ने से परे
जूलियन वुल्फ

1
h#t=let[...]in[...]को छोटा किया जा सकता है h#t|let[...]=[...]। भी head nहै n!!0। एक गार्ड में &&बस हो सकता है ,
लकोनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.