Anota un juego de Yahtzee

12

Para cada una de las 13 filas de una hoja de puntaje de Yahtzee , se le da (a partir de stdin) una lista separada por espacios de 5 números (dados). Su tarea es calcular el puntaje de cada línea y generar el Gran Total del juego.

Ejemplo

Entrada y cómo interpretarla:

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

Ignoraremos las reglas de Yahtzee Bonus y Joker, y solo resumiremos los puntajes de la Sección Superior e Inferior y el Bonus en la Sección Superior. En caso de duda, consulte estas reglas .

¡Que gane el código más corto!

daniero
fuente
Para el beneficio de aquellos que no hablan noruego, ¿podría enumerar las reglas de puntuación que desea que las personas implementen directamente en la pregunta?
Peter Taylor
Je je;) Las reglas son las mismas, son solo algunos de los bloques que han cambiado de posición, y la adición de 1 y 2 pares. El primer bloque de código es la traducción aproximada (sin "Suma" y "Bonificación"), así que simplemente refiérase a esa. El enlace noruego fue solo para justificar el orden de los bloques para las personas que pueden estar acostumbradas a otras configuraciones. Creo que las reglas son claras y que los bloques de "pares" se explican por sí mismos. El resto de las reglas deben explicarse en el enlace wiki en inglés que proporcioné.
daniero
Oh, me acabo de dar cuenta, las reglas son diferentes. Usaré las reglas oficiales "internacionales" entonces: yahtzeerules.com/yahtzee-scoring.htm (Me gustan más las noruegas, tiene más variaciones en los puntajes posibles). Cambiaré la pregunta en un momento.
daniero
¿Realmente vas a unir las tarjetas de entrada con la línea de puntuación? ¿No deberíamos tener que averiguar qué línea es la más apropiada para cualquier mano?
DavidC
1
@Matt Basado después de hojear algunos de los mejores resultados de un determinado motor de búsqueda, diré 'sí'.
daniero

Respuestas:

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
fuente
44
Juro que esto se ve idéntico a algo que leí al costado de una nave extraterrestre.
Kevin Elliott
No tengo idea si este programa funciona o no, pero seguramente es el más corto: 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 caracteres al excluir los comentarios)

Con la entrada

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

Salida

[1] 194
flodel
fuente
Es bueno ver que alguien logra obtener el resultado correcto: D Actualizaré el ejemplo.
daniero
Creo que su programa maneja incorrectamente la casa completa. Probé los dados 2 2 2 2 2y creo que su programa lo trata como un full y otorga los 25 puntos.
Matt
Creo que también hay un problema con las rectas grandes y pequeñas. Si todos los dados son iguales (nuevamente probé 2 2 2 2 2) obtengo un resultado en numeric(0)lugar de un puntaje.
Matt el
@ Matt, de donde vengo (¿mis reglas o las de todos?), Puedes marcar un yahtzee (por ejemplo 2 2 2 2 2) en "Full house". Creo que tienes razón sobre las rectas, gracias; Actualizaré mi código con una versión más corta que pensé.
flodel
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]

Según lo solicitado, la entrada está en stdin:

$ yScore.py < dice.txt
194

Si los datos pudieran precargarse en una lista, como lo han hecho otras soluciones, podría eliminar 62 caracteres para llegar a 302.

Mate
fuente
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]]}

Debe haber una forma más eficiente de verificar la recta corta.

DavidC
fuente
1

GolfScript 180

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

Puedes probar el programa aquí

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
fuente
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);}
principianteProg
fuente