একটি কাঁচা হাত স্কোর


28

এই চ্যালেঞ্জটি হ'ল ক্রাইবেজ হ্যান্ড স্কোর করা। আপনি যদি ক্রাইবেজ না খেলেন তবে আপনার কিছু শিখতে হবে। আমরা একটি স্ট্যান্ডার্ড জুজু ডেক নিয়ে খেলি, এবং একটি হাতে চারটি কার্ডের সাথে "আপ কার্ড" থাকে। দুটি ধরণের হাত রয়েছে: সাধারণ এবং একটি 'ক্রিব হ্যান্ড'।

কার্ডগুলি এমন বিন্যাসে আসে vsযেখানে vএকটি: A23456789TJQK(দশজনের জন্য টি) এবং এর sমধ্যে একটি SCDH। ফর্মটিতে একটি হাত দেওয়া হবে (উদাহরণস্বরূপ)

AS 2D 3H JS | 4S

4Sআপ কার্ডটি কোথায় একটি ক্রিব হাতের ফর্ম্যাট থাকবে

JD 3C 4H 5H | 5S !

ফেস কার্ডগুলির মান 10 হয় এবং টেক্কাটির মান 1 থাকে has নীচে স্কোরিং সঞ্চালিত হয়।

  • পঞ্চাশটি: পাঁচটি কার্ডের প্রতিটি উপসেটের জন্য যার সমষ্টি 15, দুটি পয়েন্ট যুক্ত করুন।
  • জুড়ি: একই র‌্যাঙ্কের সাথে প্রতিটি জোড়া কার্ডের জন্য (মান না) দুটি পয়েন্ট যুক্ত করুন।
  • রান: 2 টির বেশি দৈর্ঘ্যের একটানা কার্ডের প্রতিটি সর্বোচ্চ রানের জন্য, পয়েন্টগুলিতে রানের দৈর্ঘ্য যোগ করুন।
  • ফ্লাশ: সমস্ত পাঁচটি কার্ড একই মামলা হলে পাঁচটি পয়েন্ট যুক্ত করুন। অন্যথায় যদি আপ কার্ড বাদে সমস্ত একই মামলা হয় তবে চারটি পয়েন্ট যুক্ত করুন। এটি যদি একটি ক্রিব হ্যান্ড হয় তবে চার-পয়েন্টের রূপটি গণনা করা হবে না।
  • নোস: যদি আপ কার্ডের একই স্যুট সহ কোনও জ্যাক থাকে তবে একটি পয়েন্ট যুক্ত করুন।

নোট:

  • এক ধরণের ট্রিপস এবং চারটি বিশেষ নয় - একটি ট্রিপলে তিনটি জোড়া রয়েছে, তাই ট্রিপলটির মূল্য 6 পয়েন্ট।

  • রানগুলি ওভারল্যাপ করতে পারে। উদাহরণস্বরূপ, AS AH 2D 3C | 2C(একটি ডাবল ডাবল রান) দৈর্ঘ্য 3 এবং দুটি জুটির চারটি রান রয়েছে, সুতরাং 3 + 3 + 3 + 3 + 2 + 2 = 16 পয়েন্টের মূল্য রয়েছে।

  • কেবলমাত্র সর্বোচ্চ রান গণনা করা হয়, সুতরাং KS QD JD TC | 9Sএটি 5 পয়েন্টের জন্য মূল্যবান, কারণ এটি 5 রান is সাব-রান গণনা করা হয় না।

বাড়ির বিধি:

এক হাতে 19 পয়েন্ট করা অসম্ভব। শূন্যের পরিবর্তে, 19 এর স্কোর রিপোর্ট করুন।

উদাহরণ:

5S 5H 5D JS | KS
21

AS 2D 3H JS | 4S !
9

JD 3C 4H 5H | 5S
12

9S 8S 7S 6S | 5H !
9

9S 8S 7S 6S | 5H
13

8D 7D 6D 5D | 4D !
14

8D 7D 6D 5D | 4D
14

AD KD 3C QD | 6D
19

এটি কোড গল্ফ। সংক্ষিপ্ত সমাধান জিতেছে।


4
"পনেরো দুই, পনেরো চার, ..." আই, ইয়ে, ইয়ে, তবে কিছুদিন হল।
dmckee

2
@ ডিএমকেহে, হ্যাঁ, আমি স্কোর করার জন্য আমার প্রয়োজনীয়তাগুলিতে খুব সুন্দর ছিলাম। আমি প্যাটারের পুরো বর্ণনা দেওয়ার বিষয়ে চিন্তা করেছি ... "পনের দু'টি, পনেরটি এবং ছয়জনের জন্য একটি জুড়ি; তাদের লাঠিগুলি ছুঁড়ে মারবে" । তবে তারপরে সমস্যার বর্ণনাটি 30 পৃষ্ঠার দীর্ঘ হবে।
বুথবি

1
3 + 3 + 3 + 3 + 2 = 16? আমি মনে করি আপনি অন্য +2 মিস করছেন।
grc

1
এবং দ্বিতীয় এবং শেষ উদাহরণগুলি 9 এবং 1 হিসাবে বোঝানো হয়েছে? আমি মনে করি তাদের সর্বশেষ নিয়মটি প্রয়োগ করা উচিত, তবে আমি নিশ্চিত নই (আগে কখনও ক্রেবাইজ খেলিনি)।
grc

1
@ জিআরসি হ্যাঁ, আমি তাদের উপরের নোবাইগুলি মিস করেছি। এটিই আমি একমাত্র খেলা যা আমি জানি যে স্কোরিং সবচেয়ে শক্ত অংশ।
বুথবি

উত্তর:


2

গল্ফস্ক্রিপ্ট, 187 178 174 টি অক্ষর

:c"J"c{"SCDH"?)},1/:s-1=+/,([s)-!5*s);)-!4*c"!"?)!*]$-1=+0.14,{c{"A23456789TJQK"?)}%{},:v\{=}+,,.{@*\)}{;.2>**+1 0}if}/;;5-v{{=+}+v\/}/[0]v{.9>{;10}*{1$+}+%}/{15=},,2*+.!19*+

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

আরও পঠনযোগ্য ফ্যাশনের কোড ( পুনরায় ফর্ম্যাট করা এবং কিছুটা অবরুদ্ধ ):

# Save cards to <c>
:c;

# Is it a non-crib hand? <r>
c"!"?)!:r;

# Values go to <v>
c{"A23456789TJQK"?)}%{},:v;

# Suits go to <s>
c{"SCDH"?)},1/:s;

# Print score for Fifteens
[0]v{.9>{;10}*{1$+}+%}/{15=},,2* .p

# Print score for Pairs
-5v{{=+}+v\/}/ .p

# Print score for Runs
0..14,{v\{=}+,,.{*\)\}{;\.2>**+0 1}if}/;; .p

# Print score for Flush
[s)-!5*s);)-!4*r*]$-1= .p

# And finally print the score for Nobs
c"J"s-1=+/,( .p

# Sum up the sub-scores and if score is zero set to 19
++++
.!19*+

সম্পাদনা করুন: পঞ্চাশ এবং ফ্লাশের জন্য যুক্তির পরিবর্তিত।


1
বাবা! এটি এখন পর্যন্ত দেখা সবচেয়ে দীর্ঘ জিএস স্ক্রিপ্ট! বলিহারি!
বুথবি

7

সি, 364 388 অক্ষর

এটি বড় এবং কুরুচিপূর্ণ (যদিও এটি আগের মতো বড় ছিল না):

char*L="CA23456789TJQKDHS",b[20],p[15],r[5],s[5],v,i=4,t,m,q;
g(j){++p[r[i]=strchr(L,b[j])-L];s[i]=strchr(L,b[j+1])-L;}
f(j,u){u==15?v+=2:++j<5&&f(j,u,f(j,u+(r[j]>9?10:r[j])));}
main(){gets(b);for(g(14);i--;r[i]^11|s[i]^s[4]||++v)g(i*3);
for(f(i,0);++i<15;v+=q?q*q-q:t>2?t*m:0,t=q?t+1:0,m=q?m*q:1)q=p[i];
while(++t<5&&s[t]==*s);v+=t>4-!b[16]?t:0;printf("%d\n",v?v:19);}

(পড়ার সহজ করার জন্য লাইন ব্রেকগুলি যুক্ত করা হয়েছিল; সেগুলি উপরের তালিকায় অন্তর্ভুক্ত নয়))

কোডটি যদি অবৈধ ইনপুট চেক করা দরকার হয় তবে সমস্যার বিবরণ উল্লেখ করা হয়নি, তাই স্বাভাবিকভাবেই আমি ধরে নিয়েছিলাম যে ইনপুটটিতে যদি বলা হয় যে অতিরিক্ত শ্বেতস্থান থাকে তবে প্রোগ্রামটি ইচ্ছামত দুর্ব্যবহার করতে পারে।

এখানে অবারিত সংস্করণটি রয়েছে:

#include <stdio.h>
#include <string.h>

/* A-K correspond to values 1-13. Suit values are arbitrary.
 */
static char const *symbols="CA23456789TJQKDHS";

/* Used as both an input buffer and to bucket cards by rank.
 */
static char buf[20];

/* The cards.
 */
static int rank[5], suit[5];

/* The cards broken down by rank.
 */
static int buckets[15];

static int score;
static int touching, matching, i;

/* Read card number i from buf at position j.
 */
static void getcard(int j)
{
    rank[i] = strchr(symbols, buf[j]) - symbols;
    suit[i] = strchr(symbols, buf[j+1]) - symbols;
    ++buckets[rank[i];
}

/* Recursively find all combinations that add up to fifteen.
 */
static void fifteens(int j, int total)
{
    for ( ; j < 5 ; ++j) {
        int subtotal = total + (rank[j] > 9 ? 10 : rank[j]);
        if (subtotal == 15)
            score += 2;
        else if (subtotal < 15)
            fifteens(j + 1, subtotal);
    }
}

int main(void)
{
    fgets(buf, sizeof buf, stdin);
    score = 0;

    /* Read cards from buf */
    for (i = 0 ; i < 4 ; ++i)
        getcard(i * 3);
    getcard(14);

    /* Score fifteens */
    fifteens(0, 0);

    /* Score any runs and/or pairs */
    touching = 0;
    matching = 1;
    for (i = 1 ; i < 15 ; ++i) {
        if (buckets[i]) {
            score += buckets[i] * (buckets[i] - 1);
            ++touching;
            matching *= buckets[i];
        } else {
            if (touching > 2)
                score += touching * matching;
            touching = 0;
            matching = 1;
        }
    }

    /* Check for flush */
    for (i = 1 ; i < 5 && suit[i] == suit[0] ; ++i) ;
    if (i >= (buf[17] == '!' ? 5 : 4))
        score += i;

    /* Check for hisnob */
    for (i = 0 ; i < 4 ; ++i)
        if (rank[i] == 11 && suit[i] == suit[4])
            ++score;

    printf("%d\n", score ? score : 19);
    return 0;
}

যেহেতু আমি নির্দিষ্ট করে নিই নি, নির্বিঘ্নে 20 টি অক্ষর শেভ করুন!
বুথবি

এটি সত্যিই চিত্তাকর্ষক - প্রশ্নটি বড় এবং কুৎসিতও! এটি কোড গল্ফ, ক্রেপ ইনপুটগুলিতে সেগফাল্টিং করা ঠিক আছে।
বুথবি

5

রুবি 1.9, 359 356

এটি অনেক দীর্ঘ - প্রায় সি সলিউশনের মতোই।

R='A23456789TJQK'
y=gets
f=y.scan /\w+/
o=f.map(&:chr).sort_by{|k|R.index k}
s=0
2.upto(5){|i|o.combination(i){|j|t=0
j.map{|k|t+=k==?A?1:k<?:?k.hex: 10}
(t==15||i<3&&j.uniq!)&&s+=2}}
m=n=l=1
(o+[z=?_]).map{|k|k[z]?n+=1:R[z+k]?(m*=n
l+=n=1):(l>2&&s+=l*m*n
l=n=m=1)
z=k}
x=f.take_while{|k|k[y[1]]}.size
x>(y[?!]?4:3)&&s+=x
y[?J+f[4][1]+' ']&&s+=1
p s>0?s:19

5

কিছু শুরু করার সাথে .. রুবি, 422 365 355 352

c=gets
a,b=c.scan(/(\w)(\w)/).transpose
f=->x{x.uniq.size<2}
s=f[b]?5:!c[/!/]&f[b[0,4]]?4:0
c[/J(.).*\1 ?!?$/]&&s+=1
s+=[5,4,3].map{|i|a.permutation(i).map{|x|'A23456789TJQK'[x*'']?i:0}.inject :+}.find{|x|x>0}||0
a.map{|x|s+=a.count(x)-1}
2.upto(5){|i|s+=2*a.map{|x|x.tr(?A,?1).sub(/\D/,'10').to_i}.combination(i).count{|x|x.inject(:+)==15}}
p s<1?19:s

সামান্য শৃঙ্খলাবদ্ধ:

def t(c)
  s=0

  if c.scan(/[SDHC]/).uniq.size<2 # Flush
    s+=5 
  elsif c[0..9].scan(/[SDHC]/).uniq.size<2 && c[-1]!=?! # Flush
    s+=4
  end
  s+=1 if c =~ /J(.).*(\1$|\1\s.$)/ # Nobs

  c=c.scan(/[^ \|]+/).map{|x|x[0]}[0..4]
  d = (3..5).map{|i|c.permutation(i).map{|x| 'A23456789TJQK'.include?(x*'') ? i : 0}.inject(:+)}.reverse.find{|x|x>0} || 0# Runs
  s+=d
  c.map{|x|s+=c.count(x)-1} # Pairs
  c.map!{|x|x.tr('A','1').gsub(/[JQK]/,'10').to_i}
  (2..5).map{|i|s+=2*c.combination(i).count{|x|15==x.inject(:+)}} # 15s
  s<1 ? 19 : s
end

গল্ফযুক্ত সংস্করণের জন্য ইউনিট পরীক্ষা:

require "test/unit"

def t(c)
c=gets
a,b=c.scan(/(\w)(\w)/).transpose
f=->x{x.uniq.size<2}
s=f[b]?5:!c[/!/]&f[b[0,4]]?4:0
c[/J(.).*\1 ?!?$/]&&s+=1
s+=[5,4,3].map{|i|a.permutation(i).map{|x|'A23456789TJQK'[x*'']?i:0}.inject :+}.find{|x|x>0}||0
a.map{|x|s+=a.count(x)-1}
2.upto(5){|i|s+=2*a.map{|x|x.tr(?A,?1).sub(/\D/,'10').to_i}.combination(i).count{|x|x.inject(:+)==15}}
p s<1?19:s
end

class Test1 < Test::Unit::TestCase
  def test_simple
    assert_equal 21, t("5S 5H 5D JS | KS")
    assert_equal 21, t("JS 5H 5D 5S | KS")
    assert_equal 12, t("JD 3C 4H 5H | 5S")
    assert_equal 13, t("9S 8S 7S 6S | 5H")
    assert_equal 14, t("8D 7D 6D 5D | 4D")
    assert_equal 19, t("AD KD 3C QD | 6D")
    assert_equal 9, t("AS 2D 3H JS | 4S !")
    assert_equal 9, t("JS 2D 3H AS | 4S !")
    assert_equal 14, t("8D 7D 6D 5D | 4D !")
    assert_equal 9, t("9S 8S 7S 6S | 5H !")
  end
end

ফলাফল:

% ruby ./crib.rb
   Run options: 

# Running tests:

21
21
12
13
14
19
9
9
14
9
.

Finished tests in 0.014529s, 68.8281 tests/s, 688.2813 assertions/s.

1 tests, 10 assertions, 0 failures, 0 errors, 0 skips

4

পাইথন, 629 টি অক্ষর

আমি কেবল আমার পোস্ট করছি কারণ অন্য কারও কাছে নেই। এটি বেশ দীর্ঘ :(

g=range
i=raw_input().split()
r,u=zip(*[tuple(x)for x in i if x not in'!|'])
v=map(int,[((x,10)[x in'TJQK'],1)[x=='A']for x in r])
z=list(set(map(int,[(x,dict(zip('ATJQK',[1,10,11,12,13])).get(x))[x in'ATJQK']for x in r])))
z.sort()
z=[-1]*(5-len(z))+z
s=p=l=0
for a in g(5):
 for b in g(a+1,5):
    s+=2*(v[a]+v[b]==15)
    p+=2*(r[a]==r[b])
    if z[a:b+1]==g(z[a],z[b]+1)and b-a>1:l=max(l,b+1-a)
    for c in g(b+1,5):s+=2*(v[a]+v[b]+v[c]==15)
for d in g(5):s+=2*(sum(v)-v[d]==15)
n=len(set(u))
s+=4*(n==2 and u[-1] not in u[:4] and i[-1]!='!')+5*(n<2)+('J'+u[4]in i[:4])+2*(sum(v)==15)+p+((l*3,l*p)[p<5]or l)
print(s,19)[s<1]

বাহ, যে দীর্ঘ! ভালভাবে সম্পন্ন হয়েছে, যদিও। বিটিডাব্লু, আপনার কোটস এবং বন্ধনীগুলির আগে / পরে কখনই ফাঁকা স্থানগুলির প্রয়োজন হবে না।
বুথবি

1
ওহ ধন্যবাদ, আমি সে সম্পর্কে ভুলে গেছি এটি এখন কিছুটা খাটো;)
grc

কীভাবে print s or 19? আমি মনে করি আপনার কাছে (পাইথন 3.x এবং শেভ ব্যবহার করতে পারেন আরো 3 টি অক্ষর বন্ধ raw_inputকরার input, তারপর print s or 19থেকে print(s or 19))।
রাই-

2

পাইথন 2, 606 584 বাইট

জো কিংয়ের গল্ফের কারণে 22 বাইট সংরক্ষণ করা হয়েছে ।

from itertools import*
s,S,C,E=sum,sorted,combinations,enumerate
def f(a):a=a.split();a.pop(4);e=a.pop(5)if a[-1]<"$"else 0;b=S("A23456789TJQK".index(i)for i,j in a);d=S(set(b));h=[j for i,j in a];z=len([s(k)for r in range(6)for k in C([[10,k+1][k<10]for k in b],r)if s(k)==15])*2+s(2for i,j in C(b,2)if i==j)+[4*(e<1),5][len(set(h))<2]*(len(set(h[:4]))<2)+(a[4][1]in[j for i,j in a[:4]if i=="J"])+s(reduce(lambda x,y:x*y,[b.count(k)for k in m])*len(m)for m in[d[s(x[:i]):s(x[:i])+j]for x in[[len(list(e))for i,e in groupby(j-i for i,j in E(d))]]for i,j in E(x)if j>2]);return z or 19

এটি অনলাইন চেষ্টা করুন!

জিআরসি'র উত্তরের চেয়ে সামান্য খাটো , এবং সেখানে যাওয়ার জন্য আলাদা রুট লাগে takes

ব্যাখ্যা:

    # import everything from "itertools" library. We only need "combinations" and "groupby".
from itertools import*
# alias functions to shorter names
s,S,C,E=sum,sorted,combinations,enumerate

# function f which takes the hand+up card+crib string as its argument
def f(a):
    # convert space-separated string into list of items.
    a=a.split()

    # remove the 4th index, which is always "|".
    a.pop(4)

    # change golfed by Jo King
    # if the final item in the list is a "!" (if it is <"$"), remove it from the list and assign it to variable "e".
    # otherwise, assign 0 to variable "e".
    # a non-empty string will evaluate to True and 0 will evaluate to False in IF checks later.
    e=a.pop(5)if a[-1]<"$"else 0

    # for each card in the list, split the identifiers into the value(i) and the suit(j).
    # return the value's index in the string "A23456789TJQK".
    # so, ["5S", "5H", "5D", "JS", "KS"] will return [4, 4, 4, 10, 12].
    # using the aliased built-in function sorted(), sort the list numerically ascending.
    b=S("A23456789TJQK".index(i)for i,j in a)

    # get the unique items in b, then sort the result numerically ascending.
    d=S(set(b))

    # for each card in the list, split the identifiers into the value(i) and the suit(j).
    # return the suits.
    h=[j for i,j in a]

        # fifteens
        # changes golfed by Jo King
        # generate pairs of (10, value + 1) for all cards (since they are zero-indexed)
        # since True and False evaluate to 1 and 0 in python, return 10 if k>=10
        # and reduce all values >10 to 10
        # get all unique combinations of cards for 5 cards, 4 cards, 3 cards, 2 cards, and 1 card
        # add the values of all unique combinations, and return any that equal 15
        # multiply the number of returned 15s by 2 for score
    z=len([s(k)for r in range(6)for k in C([[10,k+1][k<10]for k in b],r)if s(k)==15])*2
        +
        # pairs
        # using itertools.combinations, get all unique combinations of cards into groups of 2.
        # then, add 2 for each pair where both cards have an identical value.
        s(2for i,j in C(b,2)if i==j)
        +
        # flush
        # changes golfed by Jo King
        # using list indexing
        # [4 * (0 if crib else 1), 5], get item at index [0 if more than one suit in hand+up card else 1]
        #    -> 4 if not crib and not all suits same
        #    -> 5 if all cards same
        #    -> 0 otherwise
        # * (0 if more than one suit in hand else 1)
        #    -> 4 * 0 if not crib and not all suits same
        #    -> 4 * 1 if not crib and all suits same
        #    -> 5 * 1 if all cards same
        #    -> 0 otherwise
        [4*(e<1),5][len(set(h))<2]*(len(set(h[:4]))<2)
        +
        # nobs
        # check if the suit of the 5th card (4, zero-indexed) matches the suit of any of the other 4 cards, and if it does is that card a Jack
        (a[4][1]in[j for i,j in a[:4]if i=="J"])
        +
        # runs
        s(reduce(lambda x,y:x*y,[b.count(k)for k in m])*len(m)for m in[d[s(x[:i]):s(x[:i])+j]for x in[[len(list(e))for i,e in groupby(j-i for i,j in E(d))]]for i,j in E(x)if j>2])

    # since only 0 evaluates to false, iff z==0 return 19, else return z.
    print z or 19

রান লজিকের জন্য বিশেষভাবে ব্যাখ্যা:

# for each index and value in the list, add the value minus the index
# since the list is sorted and reduced to unique values, this means adjacent values will all be the same value after offset
# ex: "JD 3C 4H 5H | 5S" -> [2, 3, 4, 10] - > [2, 2, 2, 7]
z = []
for i,j in enumerate(d):
    z.append(j-i)

# group the values by unique value
# then add the length of the groups to the list
# ex: [2, 2, 2, 7] -> [2:[2,2,2], 7:[7]]
#     [2:[2,2,2], 7:[7]] -> [[3], [1]]
w = []
for i,e in groupby(z):
    w.append([len(list(e))])

# list is double-nested so that the combined list comprehension leaves "x" available in both places it is needed
z = []
for x in w:
    for i,j in enumerate(x):
        if j>2:
            # if the group length is larger than 2
            # slice the list of unique card values to obtain only run values
            # since the run can be anywhere in the list, sum the preceding lengths to find the start and end index
            a = d[ sum(x[:i]) : sum(x[:i])+j ]
            z.append(a)

w = []
for m in z:
    # get the number of times the value is in the entire hand
    # ex: "JD 3C 4H 5H | 5S" -> [2,3,4,4,10] and (2,3,4) -> [1, 1, 2]
    a = [b.count(k)for k in m]
    # multiply all values together
    # [1, 1, 2] = 1*1*2 = 2
    a = reduce(lambda x,y:x*y, a)
    # length of the run * number of duplicate values
    a *= len(m)
    w.append(a)

# sum the results of the runs
return sum(w)

1
কিছু দ্রুত golfing ifগুলি পেতে 584 বাইট
জো রাজা

1

স্ট্যাক্স , 106 বাইট

Çí╬Δ╓↔╥.L§º♦½┌§└─»◄G≤n▒HJ♀p$¼♥,Q¢▲»Δ÷♠º≈r↑Vo\b■┌4Üé∟]e:┬A½f║J4σ↔└ΓW6O?╧φ¡╫╠├√├ùß5₧k%5ê╜ò/Φ/7w╠█91I◘┬n≥ìk♂╪

চালান এবং অনলাইন ডিবাগ!

সিপি 437 এর জন্য বোনাস: প্যাক স্ট্যাকসে সেই স্যুট প্রতীকটি দেখুন? খুব খারাপ যে ক্লাবগুলি উপস্থিত না হয় ...

এএসসিআইআই সমতুল্য

jc%7<~6(4|@Y{h"A23456789TJQK"I^mXS{{A|mm|+15=_%2=_:u*+f%HxS{{o:-u1]=f{%mc3+|Msn#*+y{H"SHCD"ImY:uc5*s!yNd:u;**HH++yN|Ixs@11#+c19?

ব্যাখ্যা

jc%7<~6(4|@Y...X...Y...c19?
j                              Split on space
 c%7<~                         Is it a crib hand? Put it on input stack for later use
      6(                       Remove "!" if it exists
        4|@                    Remove "|"
           Y                   Store list of cards in y
            ...X               Store ranks in x
                ...            Perform scoring for ranks
                   Y           Store suits in y
                    ...        Perform scoring for suits
                       c19?    If the score is 0, change it to 19

{h"..."I^mX
{        m     Map each two character string to
 h             The first character
  "..."I^      1-based index of the character in the string

S{{A|mm|+15=_%2=_:u*+f%H
S                          Powerset
 {                   f%H   Twice the number of elements that satisfy the predicate
  {A|mm                        Value of card. Take the minimum of the rank and 10
       |+15=                   Sum of values equal 15 (*)
            _%2=               Length is 2 (**)
                _:u            All elements are the same (***)
                   *+          ( (***) and (**) ) or (*)

xS{{o:-u1]=f{%mc3+|Msn#*+
xS                                Powerset of ranks
  {        f                      Filter with predicate
   {o                                 Sort
     :-u                              Unique differences between elements
        1]=                           Is [1]
            {%mc                  Length of all runs
                3+|M              Maximum of all the lengths and 3
                    sn#           Number of runs with maximal length
                       *          Multiplied by its length
                        +         Add to score

y{H"SHCD"ImY
y{        mY    For each two character string
  H"SHCD"I      0-based index of the second character in the string "SHCD"

:uc5*s!yNd:u;**HH++
:uc5*                 5 points if all cards have same suit
     s!               Not all cards have same suit (#)
       yNd:u          First four cards have same suit (##)
            ;         Not a crib hand (###)
             **HH++   4 points if (#) and (##) and (###), add to score

yN|Ixs@11#+
yN|I           Index of cards with the same suit of last card (not including itself)
    xs@        The rank at these indices
       11#     Number of Jacks with the same suit of last card
          +    Add to score
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.