দুটি পোকার হাতের তুলনা করুন


14

চ্যালেঞ্জ:

দুটি পাঁচ-কার্ড হাতে দেওয়া, নির্ধারণ করুন যা পোকার হাতের মানক র‌্যাঙ্কিংয়ের মাধ্যমে কোনটি জিতবে ।

ইনপুট:

স্ট্যান্ডিন থেকে কমান্ড লাইন আর্গুমেন্ট হিসাবে দশটি কার্ড পৃথক করে যা আপনি পছন্দ করেন। প্রথম পাঁচটি কার্ড প্লেয়ার 1 এর হাত এবং শেষ পাঁচটি প্লেয়ার 2 এর হাত। প্রতিটি কার্ড আরএস ফর্মের একটি দুটি বর্ণের স্ট্রিং হবে যেখানে র‌্যাঙ্কটি হবে এবং এস স্যুট। র‌্যাঙ্কগুলি যথাক্রমে 2-9, টি, দশজনের জন্য টি এবং জ্যাক, কিউ, কে এবং জ্যাক, কুইন, কিং এবং এসের জন্য যথাক্রমে। স্যুটগুলি যথাক্রমে এইচ, ডি, সি, এস হার্টস, হীরা, ক্লাব এবং স্পেডসের জন্য। আপনাকে অবশ্যই প্লেয়ারের সংখ্যাটি আউটপুট করতে হবে: '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

ব্যাখ্যা: প্লেয়ার 1 এর পাঁচটি জুড়ি রয়েছে এবং প্লেয়ার 2 এর সাথে একটি জুড়ি রয়েছে ights

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

ব্যাখ্যা: উভয়ই প্লেয়ারের বিশেষ কিছু নেই, তবে প্লেয়ার 1 এর উচ্চ কার্ডটি একটি এস এবং প্লেয়ার 2 এর উচ্চ কার্ডটি একটি রানী।

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

ব্যাখ্যা: প্লেয়ার 1 এর তিনটি এসিস রয়েছে, প্লেয়ার 2 এর একটি ফ্লাশ অফ হীরা রয়েছে।

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

ব্যাখ্যা: উভয় খেলোয়াড়ের কুইন্স অফ পেয়ার রয়েছে, তবে প্লেয়ার 1 এর দ্বিতীয় সর্বোচ্চ কার্ডটি নাইন এবং প্লেয়ার 2 এর একটি সেভেন।

বিধি এবং ব্যাখ্যা:

  • পড়ুন মান জুজু হাতের র্যাঙ্কিং হাত তুলনা বিস্তারিত জানার জন্য।
  • আপনি ধরে নিতে পারেন যে প্রতিটি জোড়া হাতে কোনও পুনরাবৃত্তি কার্ড নেই।
  • আপনি ধরে নিতে পারেন যে প্রতিটি ক্ষেত্রে একটি নির্দিষ্ট বিজয়ী রয়েছে।
  • স্যুট কোনও হাতের র‌্যাঙ্কিংয়ে ফ্যাক্টর করে না। উদাহরণস্বরূপ, বিভিন্ন স্যুটগুলির দুটি রয়্যাল ফ্লাশ সমান (অতএব উভয় খেলোয়াড়েরই রয়েল ফ্লাশ রয়েছে এমন কোনও ইনপুট পূর্ববর্তী নিয়মে অবৈধ)
  • এটি কোড গল্ফ হিসাবে, সংক্ষিপ্ত উত্তরটি জেতে।

মন্তব্য:


আমি কিছু মিস করেছি যদি দুঃখিত! এটি আমার প্রথম কোড গল্ফ প্রশ্ন।
কমান্ডো

এটি সাম্প্রতিক এই প্রশ্ন কোডগল্ফ.সটাকেক্সচেঞ্জ / কুই / 23743/15599 এবং এর মধ্যে উল্লেখ করা 5-কার্ড সংস্করণের অনুরূপ । তবে এই প্রশ্নগুলির জন্য কেবলমাত্র হাতের নামটির প্রয়োজন। এখানে একটি বড় পার্থক্য হ'ল উভয় খেলোয়াড়ের হাতে যদি একই ধরণের হাত থাকে তবে আমাদের তা নির্ধারণ করতে হবে যে কার্ডের র‍্যাঙ্কের দ্বারা কোনটি ভাল (উদাহরণস্বরূপ দুটি জোড়া, যার মধ্যে সেরা প্রথম জোড়া, দ্বিতীয় জুটি এবং প্রয়োজনে একক কার্ড রয়েছে Therefore) সুতরাং এটি কোনও সদৃশ নয়। সর্বদা অনুরূপ প্রশ্নগুলির জন্য অনুসন্ধান করুন, তাদের লিঙ্ক করুন (আমি আপনাকে দেখেছি) এবং পোস্ট করার আগে এটি কেন নকল নয় তা রক্ষা করতে প্রস্তুত থাকুন।
স্তর নদী সেন্ট

ফ্লপ এবং হাত এক হলে কী হবে?
ইসমাইল মিগুয়েল

@ ইসমাইল মিগুয়েল এই সংস্করণে কোনও ফ্লপ নেই। কেবল দুটি পৃথক হাত রয়েছে যা একে অপরের বিরুদ্ধে মূল্যায়ন করতে হবে।
কমান্ডো

উত্তর:


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

উনগল্ফ এবং মন্তব্য করেছে, যাতে আপনি প্রযুক্তিটি দেখতে পাবেন:

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)। এছাড়াও, :s এবং =s এর পরে আপনার কিছু অপ্রয়োজনীয় সাদা স্থান রয়েছে । অবশেষে, ;ইনডেন্টেশনের জন্য ব্যবহৃত হোয়াইটস্পেস হ্রাস করতে পৃথক স্টেটমেন্টগুলিতে পৃথক স্টেটমেন্টগুলিতে নতুন লাইনের পরিবর্তে ব্যবহার করুন।
ব্যবহারকারী 12205

লাম্বদা দিয়ে ভাল লাগল, ধন্যবাদ!
তাল

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

Perl, 801 733 অক্ষর

আমি বিশ্বাস করি এটি একটি বেশ সহজ-বাস্তবায়ন বাস্তবায়ন। মূলত, প্রতিটি হাতের জন্য, আমরা স্যুটগুলি এবং মুখগুলি পৃথকভাবে বাছাই করি। তারপরে আমরা এসেস কম গণনা সহ মুখগুলির আরও একটি অনুলিপি তৈরি করি যাতে আমরা কম টেক্কা দিয়ে স্ট্রেটগুলি পরীক্ষা করতে পারি। তারপরে আমরা নির্ধারণ করি যে আমাদের কোনও ফ্লাশ আছে বা সোজা, এবং উচ্চ কার্ডটি কী। তারপরে আমরা কেবল স্কোরের জন্য ম্যাচগুলি পরীক্ষা করে দেখি (প্রথমে আমরা সোজা ফ্লাশগুলির জন্য পরীক্ষা করি, তারপরে চার ধরণের ইত্যাদি)। আসল স্কোরটি হ'ল ধরণের হাতের অক্ষরের পরে কার্ডগুলির মুখের মানগুলি অনুসরণ করে (যেগুলি _s () অব্যক্ত সংস্করণে, u () গল্ফ সংস্করণে) matter এটা এখানে:

@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, তবে আমি মনে করি যে
সরাসরিভাবে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.