दो पोकर हाथों की तुलना करें


14

चुनौती:

दो पांच-कार्ड हाथों को देखते हुए, निर्धारित करें कि पोकर हाथों की मानक रैंकिंग से कौन जीतता है ।

इनपुट:

स्टड से या कमांड लाइन के तर्क के रूप में, जो भी आप चाहें, द्वारा अलग किए गए दस कार्ड। पहले पांच कार्ड खिलाड़ी 1 के हाथ हैं जबकि अंतिम पांच खिलाड़ी 2 के हाथ हैं। प्रत्येक कार्ड आरएस का एक दो अक्षर वाला स्ट्रिंग होगा जहां आर रैंक है और एस सूट है। रैंक में 2-9, T से दस, और J, Q, K, और A के लिए क्रमशः जैक, क्वीन, किंग और ऐस शामिल हैं। सूट क्रमशः एच, डी, सी, एस फॉर हर्ट्स, डायमंड्स, क्लब और हुकुम हैं। आपको उस खिलाड़ी की संख्या को आउटपुट करना होगा जो जीतता है: '1' या '2'।

कार्ड के उदाहरण:

AS - the Ace of Spades
QD - the Queen of Diamonds
2C - the Two of Clubs
TH - the Ten of Hearts

आउटपुट उदाहरण के लिए इनपुट:

5H 5C 6S 7S KD 2C 3S 8S 8D TD -> 2

व्याख्या: प्लेयर १ में फाइव की जोड़ी है जबकि प्लेयर २ के पास पेयर ऑफ़ एइट्स है।

5D 8C 9S JS AC 2C 5C 7D 8S QH -> 1

स्पष्टीकरण: न तो खिलाड़ी के पास कुछ विशेष है, लेकिन खिलाड़ी 1 का उच्च कार्ड ऐस है जबकि खिलाड़ी 2 का उच्च कार्ड एक रानी है।

2D 9C AS AH AC 3D 6D 7D TD QD -> 2

स्पष्टीकरण: प्लेयर १ में तीन इक्के हैं, खिलाड़ी २ में एक फ्लश ऑफ़ डायमंड्स हैं।

4D 6S 9H QH QC 3D 6D 7H QD QS -> 1

स्पष्टीकरण: दोनों खिलाड़ियों के पास क्वींस की जोड़ी है, लेकिन खिलाड़ी 1 का दूसरा सर्वोच्च कार्ड नौ है जबकि खिलाड़ी 2 का एक सात है।

नियम और स्पष्टीकरण:

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

टिप्पणियाँ:


क्षमा याचना अगर वहाँ कुछ भी मुझे याद किया है! यह मेरा पहला कोड गोल्फ सवाल है।
कमांडो

यह इस हालिया प्रश्न codegolf.stackexchange.com/q/23743/15599 और इसके भीतर संदर्भित 5-कार्ड संस्करण के समान है। हालाँकि उन प्रश्नों को केवल हाथ के प्रकार का नाम देना आवश्यक था। यहां एक बड़ा अंतर यह है कि यदि दोनों खिलाड़ियों के हाथ एक ही प्रकार के हैं, तो हमें यह निर्धारित करना होगा कि कार्ड रैंक के हिसाब से कौन बेहतर है (उदाहरण के लिए दो जोड़े, जिनके पास सबसे अच्छी पहली जोड़ी है, दूसरी जोड़ी है, और यदि आवश्यक हो तो एकल कार्ड)। यह डुप्लिकेट नहीं है। हमेशा समान प्रश्नों की खोज करें, उन्हें लिंक करें, (i see you did) और यह बताने के लिए तैयार रहें कि पोस्ट करने से पहले यह डुप्लिकेट क्यों नहीं है।
लेवल रिवर सेंट

अगर फ्लॉप और हाथ एक ही हो तो क्या होगा?
इस्माईल मिगुएल

@IsmaelMiguel इस संस्करण में कोई फ़्लॉप नहीं है। बस दो अलग-अलग हाथ हैं जिनका एक दूसरे के खिलाफ मूल्यांकन किया जाना चाहिए।
कमांडो

1
पहले यहां
Hasturkun

जवाबों:


2

हास्केल - 352 339 वर्ण

import Data.List
v h=10*(sum$map(\l->l*l)g)+b g:k where
  (g,k)=unzip$reverse$sort$map(\r->(length r,head r))$group$sort$map(maybe 0 id.(`elemIndex`"23456789TJQKA").head)h
  b(1:_)=f(map(!!1)h)+t k;b _=0
f(y:z)|all(==y)z=75;f _=0
t[y,_,_,_,z]|y-z==4=70;t[12,3,2,1,0]=65;t _=0
w(a,b)|v a>v b="1\n";w _="2\n"
main=interact$w.splitAt 5.words

रन:

& echo "5H 5C 6S 7S KD 2C 3S 8S 8D TD" | runhaskell 25056-Poker.hs 
2

& echo "5D 8C 9S JS AC 2C 5C 7D 8S QH" | runhaskell 25056-Poker.hs 
1

& echo "2D 9C AS AH AC 3D 6D 7D TD QD" | runhaskell 25056-Poker.hs 
2

& echo "4D 6S 9H QH QC 3D 6D 7H QD QS" | runhaskell 25056-Poker.hs 
1

Ungolf'd और टिप्पणी की, ताकि आप techinque देख सकें:

import Data.List

value :: [String] -> [Int]
value hand = 10 * (sum $ map (\l->l*l) groups) + bonus groups : kicker
    -- ^ Value of a hand is 10 times the sum of the squares of the group lengths
    -- plus the straight & flush bonus, followed by the kicker (to break ties)
    -- This 10 * sum-of-squares + bonus works out to put the hands in category
    -- order, and then they only need to be ordered by card ranks.
  where
    -- | The cards are sorted into groups by matching rank, then the groups
    -- sorted by length and rank: For example: "7C 7D 7H QS 2S" will becomes
    -- [(3,7),(1,Q),(1,2)]. This is like a run-length encoding. Finally, the
    -- groups lengths, and the kicker ranks are taken apart into two lists.
    -- N.B: kicker here includes the ranks of the groups, unlike the poker term.

    (groups,kicker) = unzip             -- split apart
        $ reverse $ sort                -- reverse sort by (length,rank)
        $ map (\r->(length r,head r))   -- turn groups into (length,rank) pairs
        $ group $ sort                  -- group sorted ranks
        $ map (maybe 0 id . (`elemIndex`"23456789TJQKA") . head) hand
            -- take first letter of each card in the hand, and map to [0..12]

    -- | Give a bonus for flush and straight to hands with five cards,
    -- or equivalently hands where the largest group length is just 1
    bonus (1:_ ) = flush (map (!!1) hand)   -- flush takes the suits of the hand
                   + straight kicker        -- straight takes the ranks
    bonus _      = 0

    -- | A flush is if all suits match the first suit
    flush (y:z) | all (==y) z = 75
                | otherwise   =  0

    -- | There are two kinds of straight.
    -- N.B: If there are five groups, then there are no duplicate ranks
    straight [y,_,_,_,z] | y-z == 4 = 70    -- normal, high to low
    straight [12,3,2,1,0]           = 65    -- ace is low, but it sorts high
    straight _                      =  0

wins :: ([String], [String]) -> String
wins (a,b) | value a > value b = "1\n"
           | otherwise         = "2\n"

main = interact $ wins . splitAt 5 . words

2

पायथन - 774 722 707 698 685 वर्ण

import sys
t,q,e,u='--23456789TJQKA','SDCH',enumerate,len
_=lambda c,i=0:chr(97+c[i])
def j(s):
 v,g,l=[0]*15,[0]*4,''
 for c in s:
  r,s=c[0],c[1];v[t.find(r)]+=1;g[q.find(s)]+=1
 c,h,k,m,f=0,0,[0,0,[],[],[]],0,0
 for x,i in e(v):
  for b in[2,3,4]:
   if i==b:k[b]+=[x]
 v[1]=v[14]
 for x,i in e(v):
  if i:
   c+=1
   if c==5:m,h=1,x
   if i==1:l+=_([x])
  else:c=0
 f,l,d=max(g)//5*2,l[::-1],'';z=f+m
 if z==3:d='z'+l
 if k[4]:d='y'+_(k[4])+l
 if k[2] and k[3]:d='x'+_(k[3])+_(k[2])
 if z==2:d='w'+l
 if z==1:d='v'+_([h])
 if k[3]:d='u'+_(k[3])+l
 if u(k[2])>1:d='t'+_(k[2],1)+_(k[2])+l
 if u(k[2])==1>u(k[3]):d='s'+_(k[2])+l
 return d or l
p=sys.argv
print(1+(j(p[1:6])<j(p[6:])))

मैंने प्रत्येक हाथ के लिए एक स्ट्रिंग उत्पन्न करने के लिए चुना, जो इसका प्रतिनिधित्व करता है, हाथ के प्रकार के लिए एक चरित्र के साथ शुरू होता है, इसके बाद वर्णों के प्रकार की विशेष भिन्नता का वर्णन करता है (उदाहरण के लिए, आपके पास कौन सा कार्ड सिर्फ 4 का था?), उसके बाद। एक टाई के मामले में शेष कार्ड के मूल्य (यदि दोनों खिलाड़ियों की जोड़ी एक ही है, तो 5 वें कार्ड से तय करना होगा कि कौन जीतेगा)। मैंने इसे बड़े पैमाने पर परीक्षण किया है, लेकिन मैं वास्तव में पोकर नहीं खेलता, इसलिए मुझे आशा है कि मुझे यह सही लगा। इसके अलावा, मुझे पता है कि यह अभी तक पूरी तरह से गोल्फ नहीं है, मैं शायद बाद में कुछ दर्जन से अधिक बार शेव कर सकता हूं।


के साथ 5 चार्ट्स को मारें _=lambda c:chr(97+c)। इसके अलावा, आपके पास :एस और =एस के बाद कुछ अनावश्यक व्हाट्सएप हैं । अंत में, ;इंडेंटेशन के लिए इस्तेमाल किए जाने वाले व्हाट्सएप को कम करने के लिए अलग-अलग बयानों के लिए नई लाइनों के बजाय उपयोग करें ।
user12205

मेमने के साथ अच्छा लगा, धन्यवाद!
ताल

2

जावास्क्रिप्ट - 526 508

function a(b){b=b.split(" ");var c=b.splice(5,5),d=[],e=[],r=[8,9,5,6,1,2,3,10,4,7],A=14,K=13,Q=12,J=11,S={"S":1,"C":2,"H":4,"D":8};for(i=0;i<5;i++){d.push(b[i].split('')[1]);b[i]=b[i].split('')[0];e.push(c[i].split('')[1]);c[i]=c[i].split('')[0]}function p(w,m){var v,i,o,s=1<<w[0]|1<<w[1]|1<<w[2]|1<<w[3]|1<<w[4];for(i=-1,v=o=0;i<5;i++,o=Math.pow(2,w[i]*4)){v+=o*((v/o&15)+1)}v=v%15-((s/(s&-s)==31)||(s==0x403c)?3:1);v-=(m[0]==(m[1]|m[2]|m[3]|m[4]))*((s==0x7c00)?-5:1);return r[v]}alert(p(b,d)>p(c,e)?1:2)}

उपयोग:

a("5H 5C 6S 7S KD 2C 3S 8S 8D TD");

ungolfed:

function a(b) {
b = b.split(" ");
var c=b.splice(5,5),
        d=[],
        e=[],
        r=[8,9,5,6,1,2,3,10,4,7],
        A=14,
        K=13,
        Q=12,
        J=11,
        S={"S":1,"C":2,"H":4,"D":8};

    for (i=0;i<5;i++) {
        d.push(b[i].split('')[1]);
        b[i] = b[i].split('')[0];
        e.push(c[i].split('')[1]);
        c[i] = c[i].split('')[0];   
    }

function p(w,m){
  var v, i, o, s = 1<<w[0]|1<<w[1]|1<<w[2]|1<<w[3]|1<<w[4];
  for (i=-1, v=o=0; i<5; i++, o=Math.pow(2,w[i]*4)) {v += o*((v/o&15)+1);}
  v = v % 15 - ((s/(s&-s) == 31) || (s == 0x403c) ? 3 : 1);
  v -= (m[0] == (m[1]|m[2]|m[3]|m[4])) * ((s == 0x7c00) ? -5 : 1);
  return r[v];
}

alert(p(b,d)>p(c, e)?1:2);
}

स्रोत


1

पर्ल, 801 733 चार्ट

मेरा मानना ​​है कि यह एक बहुत सीधा-सीधा कार्यान्वयन है। मूल रूप से, प्रत्येक हाथ के लिए, हम सूट और चेहरों को अलग-अलग छांटते हैं। फिर हम इक्के गिनते हुए चेहरे की एक और प्रतिलिपि बनाते हैं ताकि हम कम इक्के वाले स्ट्रैट्स की जांच कर सकें। तब हम निर्धारित करते हैं कि हमारे पास फ्लश या स्ट्रेट है, और उच्च कार्ड क्या है। फिर हम केवल स्कोर के क्रम में मैचों की जांच करते हैं (पहले हम सीधे फ्लश की जांच करते हैं, फिर चार प्रकार के आदि)। वास्तविक स्कोर सिर्फ हाथ का प्रकार है जो कार्ड के चेहरे के मूल्यों के बाद क्रम में होता है, जो कि वे (जो _s) अनऑलॉफर्ड संस्करण में, यू () गोल्फिंग संस्करण में हैं। यह रहा:

@l{2..9,qw(T J Q K A)}=2..14;sub u{join"",map{$_>9?$_:"0$_"}shift,ref$_[0]?$$_[0]:map{$h[$_]}@_}sub e{$p[$_[0]-1]-1==$p[$_[0]]}sub f{@p=@_;e(1)&&e(2)&&e(3)&&e 4}sub h{$h[$_[0]]==$h[$_[1]]}sub i{h(@_[0,1])&&h @_[2,3]}sub t{@s=sort map{substr($_,1)}@_;$f=$s[0]eq$s[4];@l=@h=sort{$b<=>$a}map{$l{substr($_,0,1)}}@_;@l=(@l[1..4],1)while$l[0]==14;$s=0;if(f@l){$s=1;$h=$l[0]}else{$h=$h[0];$s=1 if f@h}$f&&$s?u 9,\$h:h(4,1)?u 7,4,0:h(3,0)?u 7,3,4:i(4,3,2,0)?u 6,0,4:i(4,2,1,0)?u 6,4,0:$f?u 5,0:$s?u 4,\$h:h(4,2)?u 3,4,0,1:h(3,1)?u 3,3,0,4:h(2,0)?u 3,2..4:i(4,3,2,1)?u 2,2,4,0:i(4,3,1,0)?u 2,1,4,2:i(3,2,1,0)?u 2,1,3,4:h(4,3)?u 1,4,0,1,2:h(3,2)?u 1,3,0,1,4:h(2,1)?u 1,2,0,3,4:h(1,0)?u 1,1..4:u 0,0..4}print t(@ARGV[0..4])gt t(@ARGV[5..9])?1:2

और यहाँ कम-गोल्फ के बराबर है:

use strict;
use warnings;

# ace high or low in straights, otherwise high
# T = ten, J = jack, Q = queen, K = king, A = ace

# 0 high card
# 1 one pair
# 2 two pair
# 3 3 of a kind
# 4 straight
# 5 flush
# 6 full house
# 7 four of a kind
# 9 straight flush (royal flush a subclass of straight flush)

my %l;@l{2..9,qw(T J Q K A)}=2..14;
sub score {
  my @suits = sort map { substr($_,1) } @_;
  my @faces_h = sort { $b <=> $a } map { $l{substr($_,0,1)} } @_;
  my @faces_l = @faces_h;
  @faces_l = (@faces_l[1..4], 1) while $faces_l[0] eq 14;
  my $is_flush = $suits[0] eq $suits[4];
  my ($is_straight, $high_card);
  if($faces_l[0]-1==$faces_l[1] &&
     $faces_l[1]-1==$faces_l[2] &&
     $faces_l[2]-1==$faces_l[3] &&
     $faces_l[3]-1==$faces_l[4]) {
    $is_straight=1;
    $high_card = $faces_l[0];
  } else {
    $high_card = $faces_h[0];
    if($faces_h[0]-1==$faces_h[1] &&
       $faces_h[1]-1==$faces_h[2] &&
       $faces_h[2]-1==$faces_h[3] &&
       $faces_h[3]-1==$faces_h[4]) {
      $is_straight=1;
    }
  }
  return _s(9, \$high_card) if $is_flush && $is_straight;
  return _s(7, 4,0) if $faces_h[4] == $faces_h[1];
  return _s(7, 3,4) if $faces_h[3] == $faces_h[0];
  return _s(6, 0,4) if $faces_h[4] == $faces_h[3] && $faces_h[2] == $faces_h[0];
  return _s(6, 4,0) if $faces_h[4] == $faces_h[2] && $faces_h[1] == $faces_h[0];
  return _s(5, 0) if $is_flush;
  return _s(4, \$high_card) if $is_straight;
  return _s(3, 4,0,1) if $faces_h[4] == $faces_h[2];
  return _s(3, 3,0,4) if $faces_h[3] == $faces_h[1];
  return _s(3, 2,3,4) if $faces_h[2] == $faces_h[0];
  return _s(2, 2,4,0) if $faces_h[4] == $faces_h[3] && $faces_h[2] == $faces_h[1];
  return _s(2, 1,4,2) if $faces_h[4] == $faces_h[3] && $faces_h[1] == $faces_h[0];
  return _s(2, 1,3,4) if $faces_h[3] == $faces_h[2] && $faces_h[1] == $faces_h[0];
  return _s(1, 4,0,1,2) if $faces_h[4] == $faces_h[3];
  return _s(1, 3,0,1,4) if $faces_h[3] == $faces_h[2];
  return _s(1, 2,0,3,4) if $faces_h[2] == $faces_h[1];
  return _s(1, 1,2,3,4) if $faces_h[1] == $faces_h[0];
  return _s(0, 0..4);
}

sub _s {
  join "", map { $_ > 9 ? $_ : "0$_" } shift,
    ref $_[0] ? $$_[0] : map { $faces_h[$_] } @_
  # my @a=@_;
  #  if(ref $a[1]) {
  #    $a[1]=${$a[1]};
  #  } else {
  #    $a[$_]=$faces_h[$a[$_]] for 1..$#a;
  #  }
  #  join "", map { $_ < 10 ? "0$_" : $_ } @a;
}

my @p1 = @ARGV[0..4];
my @p2 = @ARGV[5..9];

my $s1 = score(@p1);
my $s2 = score(@p2);
print $s1 gt $s2 ? 1 : 2;

AH 2C 3S 4S 5D 6C 7S 7C 7D TDका एक परिणाम पैदा करता है 2, लेकिन मुझे लगता है कि एक सीधे तरह के तीन धड़कता है
r3mainer
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.