Điểm một trò chơi của Yahtzee


12

Đối với mỗi trong số 13 hàng của bảng điểm Yahtzee, bạn sẽ được cung cấp (từ stdin) một danh sách được phân tách bằng dấu cách gồm 5 số (súc sắc). Nhiệm vụ của bạn là tính điểm cho mỗi dòng và xuất ra Tổng số tổng của trò chơi.

Thí dụ

Đầu vào và cách giải thích nó:

Input       Box              Score
6 1 4 1 3   Aces              2
3 2 2 1 2   Twos              6
6 3 2 3 3   Threes            9
4 2 3 6 5   Fours             4  
6 3 5 5 1   Fives            10
1 5 6 5 6   Sixes            12
            Bonus             -
4 2 4 4 1   3 of a kind      15
2 2 3 2 4   4 of a kind       -
3 2 2 2 3   Full house       25  
1 3 1 6 1   Small straight    -
2 5 4 6 3   Large straight   40
2 2 2 2 2   Yahtzee          50
5 5 4 5 2   Chance           21
            Grand Total     194

Chúng tôi sẽ bỏ qua các quy tắc Tiền thưởng và Joker của Yahtzee , và chỉ tổng hợp điểm số từ Phần trên và Phần dưới và Phần thưởng trong Phần trên. Nếu nghi ngờ, hãy tham khảo các quy tắc này .

Có thể mã ngắn nhất giành chiến thắng!


Vì lợi ích của những người không nói tiếng Na Uy, bạn có thể liệt kê các quy tắc tính điểm mà bạn muốn mọi người thực hiện trực tiếp trong câu hỏi không?
Peter Taylor

Heh heh;) Các quy tắc là như nhau, chỉ có một số khối đã thay đổi vị trí và thêm 1 và 2 cặp. Khối mã đầu tiên là bản dịch thô (không có "Tổng" và "Tiền thưởng"), vì vậy chỉ cần tham khảo mã đó. Liên kết Na Uy chỉ là để biện minh cho thứ tự các khối cho những người có thể được sử dụng cho các thiết lập khác. Tôi nghĩ rằng các quy tắc là rõ ràng, và các khối "cặp" là khá tự giải thích. Phần còn lại của các quy tắc nên được giải thích trên liên kết wiki tiếng Anh tôi cung cấp.
daniero

Ồ, tôi chỉ nhận ra, các quy tắc khác nhau. Sau đó, tôi sẽ sử dụng các quy tắc "quốc tế" chính thức: yahtzeerules.com/yahtzee-scoring.htmlm (Tôi thích những người Na Uy hơn, nó có nhiều biến thể hơn về điểm số có thể) - Tôi sẽ thay đổi câu hỏi ngay lập tức.
daniero

Bạn thực sự sẽ kết hợp các thẻ đầu vào với dòng ghi điểm? Chúng ta không nên tìm ra dòng nào phù hợp nhất cho bất kỳ tay nào?
DavidC

1
@Matt Dựa trên sau khi lướt qua một số kết quả hàng đầu từ một công cụ tìm kiếm nhất định, tôi sẽ nói 'có'.
daniero

Câu trả lời:


4

APL (124)

S←{⍺∊+⌿⍵∘.=⍵}⋄+/(+/⎕)(50×∧/,A∘.=A←⎕)(+/10×{⍵×∨/(⍳⍵)⍷1+A-⊃A←A[⍋A←⎕]}¨N)(25×∧/S∘⎕¨2 3)(+/{(+/A)×⍵S⊢A←⎕}¨N←3 4)(+/{+/⍵×⍵=⎕}¨⍳6)

4
Tôi thề điều này trông giống hệt với thứ tôi đọc được bên cạnh tàu vũ trụ của người ngoài hành tinh.
Kevin Elliott

Tôi không biết chương trình này có hoạt động hay không, nhưng chắc chắn đó là chương trình ngắn nhất: D
daniero

5

R - 264

S=sum;
P=prod;
T=function(i)table(x[i,]);
Z=function(i,...)any(sapply(list(...),function(y)all(y%in%x[i,])))
S((x[1:6,]==(R=row(x[1:6,])))*R)+ # Upper section
S(x[7,])*any(T(7)>2)+             # 3 of a kind
S(x[8,])*any(T(8)>3)+             # 4 of a kind
25*(P(T(9))%in%5:6)+              # Full house
30*Z(10,1:4,2:5,3:6)+             # Small straight
40*Z(11,1:5,2:6)+                 # Large straight
50*(P(T(12))==5)+                 # Yahtzee
S(x[13,])                         # Chance

(264 ký tự khi không bao gồm các bình luận)

Với đầu vào

x <- as.matrix(read.table("http://pastebin.com/raw.php?i=ZRMC9B4x"))

Đầu ra

[1] 194

Rất vui khi thấy ai đó quản lý để có được đầu ra đúng: D Tôi sẽ cập nhật ví dụ.
daniero

Tôi nghĩ rằng chương trình của bạn không chính xác xử lý nhà đầy đủ. Tôi đã thử xúc xắc 2 2 2 2 2và tôi tin rằng chương trình của bạn coi đó là một ngôi nhà đầy đủ và thưởng 25 điểm.
Matt

Tôi nghĩ rằng cũng có một vấn đề với các căng thẳng lớn và nhỏ. Nếu tất cả các con xúc xắc đều giống nhau (tôi lại kiểm tra 2 2 2 2 2) tôi nhận được kết quả numeric(0)thay vì điểm số.
Matt

@Matt, tôi đến từ đâu (quy tắc của tôi hay của mọi người?) Bạn có thể ghi một yahtzee (ví dụ 2 2 2 2 2) trong "Full house". Tôi nghĩ rằng bạn là chính xác về các căng thẳng, cảm ơn; Tôi sẽ cập nhật mã của tôi với một phiên bản ngắn hơn tôi nghĩ về.
flodel

4

Con trăn 364

S=sum;R=range;D=[map(int,raw_input().split())for i in R(13)];s=S(x for i in R(6)for x in D[i]if x==i+1)
for i in R(2):d=D[6+i];s+=[0,S(d)][max(map(d.count,d))>2+i];d=sorted(set(D[9+i]));s+=[0,30+i*10]['1, 1, 1'+', 1'*i in`[d[x+1]-d[x]for x in R(len(d)-1)]`]
e=D[8];a=map(e.count,e);d=D[11];print s+S(D[12])+[0,50][d.count(d[0])==5]+[0,25][2in a and 3in a or 5in a]

Theo yêu cầu, đầu vào là trên stdin:

$ yScore.py < dice.txt
194

Nếu dữ liệu có thể được tải sẵn vào một danh sách, như một số giải pháp khác đã thực hiện, tôi có thể xóa 62 ký tự để đến 302.


3

Toán học 359

y = IntegerDigits@ImportString[x, "Table"][[1]];
l = Length; g = Gather; r = Range; b = SortBy; h = l@b[g[y[[#]]], l][[-1]] &;
Tr@Flatten@{# Count[y[[#]], #] & /@ r@6, If[h@7 == 3, 15, 0], 
If[h@8 == 4, 20, 0], If[(l /@ b[g[y[[9]]], l]) == {2, 3}, 25, 0], 
If[MatchQ[Sort@y[[10]], {___, n_, m_, o_, q_, ___} /; m == n + 1 && o == m + 1 && q == o + 1], 30, 0], 
If[Sort[y[[11]]] == r[y[[11, 1]], y[[11, 1]] + 4], 40, 0], 
If[l@g[y[[12]]] == 1, 50, 0], y[[13]]}

Phải có một cách hiệu quả hơn để kiểm tra ngắn thẳng.


1

GolfScript 180

n/{~]}%6,{)`['{''=},,''*']*}%[{.{+}*\{..|{'{'\'=},,'++1$\~}%$\;}:g~)\;2>*}{.{+}*\g)\;3>*}{g[2 3]=25*}{$:§;3,{).4+,\>§-}%1?)!!30*}{.$(\;.5+,\>\-!40*}{g)\;5=50*}{{+}*}]+]zip{~~}%{+}*

Bạn có thể kiểm tra chương trình tại đây

Chương trình chú thích:

n/                          # split input by newline
{~]}%                       # parse an int array from each line

6,{)`['{''=},,''*']*}%      # create {X=},,X* code blocks, 
                            # where X goes from 1 to 6 
                            # (needed for processing the first 
                            # half of the board)

[       # create an array of code blocks, for scoring:

        # three of a kind:
    {.{+}*\{..|{'{'\'=},,'++1$\~}%$\;}:g~)\;2>*}

        # four of a kind:
    {.{+}*\g)\;3>*}

        # full house:
    {g[2 3]=25*}

        # small straight:
    {$:§;3,{).4+,\>§-!}%1?)!!30*}

        # straight: 
    {.$(\;.5+,\>\-!40*}

        # yahtzee:
    {g)\;5=50*}

        #chance:
    {{+}*}
]+              # concatenate the 1-6 code block array with this one

]zip            # distribute each line in the input 
                # to the corresponding scoring rule (code block)

{~~}%           # evaluate each input/code pair
                # and get an array with score for each hand

{+}*            # sum up the partial scores.

1

Perl 527 ký tự

while(<>){$l++;$q=$c=0;$q=1if(($_=~/1/&&$_=~/2/&&$_=~/3/&&$_=~/4/)||($_=~/5/&&$_=~/2/&&$_=~/3/&&$_=~/4/)||($_=~/5/&&$_=~/6/&&$_=~/3/&&$_=~/4/));@a=split//;for(@a){$c++if/$l/;}$s+=$l*($c)if$l<7;$s+=35if$s>=63&&$l==6;for$i(1...6){$t=0;$f+=$c if($l==9&&($c==2||$c==3));$c=0if!($l==11&&$c>1);for(@a){$t+=$_;$c++if/$i/;}$s+=$t if($c>=3&&$l==7);$s+=$t if($c>=4&&$l==8);$s+=50if($c==5&&$l==12);$s+=$t if($l==13&&$i==6);}$s+=25if($f==5&&$l==9);$s+=30if($q==1&&$l==10);$s+=40if($c<2&&($t==15||$t==20)&&$l==11);exit(print $s)if($l==13);}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.