Marque um jogo de Yahtzee

12

Para cada uma das 13 linhas de uma planilha Yahtzee, você recebe (do stdin) uma lista separada por espaços de 5 números (dados). Sua tarefa é calcular a pontuação de cada linha e gerar o total geral do jogo.

Exemplo

Entrada e como interpretá-la:

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

Iremos desconsiderar as regras do Yahtzee Bonus e Joker, e somaremos apenas as pontuações da seção superior e inferior e o bônus na seção superior. Em caso de dúvida, consulte estas regras .

Que ganhe o menor código!

daniero
fonte
Para o benefício daqueles que não falam norueguês, você poderia listar as regras de pontuação que deseja que as pessoas implementem diretamente na pergunta?
Peter Taylor
Heh heh;) As regras são as mesmas, são apenas alguns dos blocos que mudaram de posição e a adição de 1 e 2 pares. O primeiro bloco de código é a tradução aproximada (sem "Soma" e "Bônus"), portanto, consulte essa. O link norueguês era apenas para justificar a ordem dos blocos para pessoas que podem estar acostumadas a outras configurações. Eu acho que as regras são claras e que os blocos de "pares" são bastante auto-explicativos. O restante das regras deve ser explicado no link wiki em inglês que eu forneci.
Daniero 26/09/12
Acabei de perceber, as regras são diferentes. Usarei as regras oficiais "internacionais": yahtzeerules.com/yahtzee-scoring.htm (eu gosto mais das norueguesas, tem mais variações nas pontuações possíveis) - vou mudar a questão daqui a pouco.
Daniero 26/09/12
Você realmente vai combinar os cartões de entrada com a linha de pontuação? Não deveríamos ter que descobrir qual linha é mais apropriada para qualquer mão?
27412
1
@Matt Baseado depois de pesquisar alguns dos principais resultados de um determinado mecanismo de pesquisa, direi 'sim'.
Daniero 27/09/12

Respostas:

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)
marinus
fonte
4
Juro que isso parece idêntico a algo que li ao lado de uma nave alienígena.
Kevin Elliott
Não tenho idéia se este programa funciona ou não, mas certamente é o mais curto: D
daniero 26/10/12
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 caracteres ao excluir os comentários)

Com a entrada

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

Resultado

[1] 194
modelo
fonte
É bom ver que alguém consegue obter a saída correta: D Atualizarei o exemplo.
Daniero 27/09/12
Acho que seu programa lida incorretamente com casa cheia. Testei dados 2 2 2 2 2e acredito que seu programa trata isso como um full house e premia os 25 pontos.
Matt
Eu acho que também há um problema com as retas grandes e pequenas. Se todos os dados forem iguais (eu testei novamente 2 2 2 2 2), obtive um resultado em numeric(0)vez de uma pontuação.
Matt
@ Matt, de onde eu venho (minhas regras ou de todos?), Você pode marcar um yahtzee (por exemplo 2 2 2 2 2) em "Casa completa". Eu acho que você está correto sobre as retas, obrigado; Vou atualizar meu código com uma versão mais curta em que pensei.
precisa saber é o seguinte
4

Python 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]

Conforme solicitado, a entrada está no stdin:

$ yScore.py < dice.txt
194

Se os dados pudessem ser pré-carregados em uma lista, como algumas outras soluções, eu poderia remover 62 caracteres para chegar a 302.

Matt
fonte
3

Mathematica 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]]}

Deve haver uma maneira mais eficiente de verificar a sequência curta.

DavidC
fonte
1

GolfScript 180

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

Você pode testar o programa aqui

Programa anotado:

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.
Cristian Lupascu
fonte
1

Perl 527 caracteres

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);}
beginnerProg
fonte