Yahtzee의 게임 득점


12

Yahtzee 스코어 시트 의 13 행 각각에 대해 (stdin으로부터) 공백으로 구분 된 5 개의 숫자 (주사위) 목록이 제공됩니다. 당신의 임무는 각 라인의 점수를 계산 하고 게임의 총계출력하는 것 입니다.

입력 및 해석 방법 :

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

우리는 Yahtzee 보너스 및 Joker 규칙 을 무시하고 상단 및 하단 섹션과 상단 섹션의 보너스 점수 만 요약합니다. 의심스러운 경우 다음 규칙을 참조하십시오 .

가장 짧은 코드가 이길 수 있습니다!


노르웨이어를 못하는 사람들의 이익을 위해 사람들이 질문에 직접 구현하기를 원하는 점수 규칙을 나열 할 수 있습니까?
피터 테일러

Heh heh;) 규칙은 동일하며 위치가 변경된 블록 중 일부이며 1과 2 쌍이 추가되었습니다. 첫 번째 코드 블록은 거친 번역 ( "Sum"및 "Bonus"제외)이므로 해당 코드 블록을 참조하십시오. 노르웨이어 링크는 다른 설정에 익숙한 사람들의 블록 순서를 정당화하기위한 것입니다. 나는 규칙이 명확하고 "쌍"블록이 매우 설명 적이라고 생각합니다. 나머지 규칙은 내가 제공 한 영어 위키 링크에서 설명해야합니다.
daniero

아, 방금 규칙 다르다는 것을 깨달았습니다 . 그런 다음 공식적인 "국제"규칙을 사용합니다. yahtzeerules.com/yahtzee-scoring.htm (노르웨이 규칙 이 더 좋으며 가능한 점수가 더 다양합니다)-질문을 잠시 후에 변경하겠습니다.
daniero

실제로 입력 카드를 스코어링 라인에 일치 시키려고합니까? 주어진 손에 어떤 선이 가장 적합한 지 알아 내야합니까?
DavidC

1
@ 매트 특정 검색 엔진의 일부 최고 결과를 훑어 본 후 '예'라고 말합니다.
daniero

답변:


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
나는 이것이 외계인 우주선의 측면에서 읽은 것과 동일하게 보인다고 맹세합니다.
Kevin Elliott

이 프로그램이 작동하는지 아닌지는 모르겠지만 확실히 가장 짧습니다 : D
daniero

5

제 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 자)

입력으로

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

산출

[1] 194

누군가 가 올바른 출력을 얻는 것을 보게되어 기쁩니다 . : D 예제를 업데이트하겠습니다.
daniero

귀하의 프로그램이 풀 하우스를 잘못 처리한다고 생각합니다. 나는 주사위를 테스트 2 2 2 2 2했고 당신의 프로그램이 그것을 풀 하우스로 취급하고 25 점을 수여한다고 생각합니다.
Matt

나는 크고 작은 직선에도 문제가 있다고 생각합니다. 모든 주사위가 같은 경우 (다시 테스트 2 2 2 2 2) numeric(0)점수 대신 결과를 얻습니다 .
Matt

@Matt, 내가 어디에서 왔는지 (나의 규칙 또는 모든 사람의)? 2 2 2 2 2"풀 하우스"에서 yahtzee (예 :)를 얻을 수 있습니다 . 나는 당신이 스트레이트에 대해 맞다고 생각합니다. 생각했던 짧은 버전으로 코드를 업데이트하겠습니다.
flodel

4

파이썬 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]

요청에 따라 입력은 stdin에 있습니다.

$ yScore.py < dice.txt
194

다른 솔루션과 마찬가지로 데이터를 목록에 미리로드 할 수 있다면 62 문자를 제거하여 302에 도달 할 수 있습니다.


3

매스 매 티카 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]]}

짧은 직선을 확인하는보다 효율적인 방법이 있어야합니다.


1

GolfScript 180

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

여기 에서 프로그램을 테스트 할 수 있습니다

주석이 달린 프로그램 :

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

펄 527 자

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);}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.