Gagnez une partie de Yahtzee

12

Pour chacune des 13 lignes d'une feuille de match Yahtzee, vous recevez (de stdin) une liste de 5 chiffres (dés) séparés par des espaces. Votre tâche consiste à calculer le score de chaque ligne et à générer le grand total du jeu.

Exemple

Saisie et comment l'interpréter:

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

Nous ne tiendrons pas compte des règles du Yahtzee Bonus et du Joker, et nous résumerons uniquement les scores des sections supérieure et inférieure et du bonus dans la section supérieure. En cas de doute, reportez-vous à ces règles .

Que le code le plus court gagne!

daniero
la source
Pour ceux qui ne parlent pas le norvégien, pourriez-vous énumérer les règles de notation que vous souhaitez que les gens mettent en œuvre directement dans la question?
Peter Taylor
Heh heh;) Les règles sont les mêmes, ce ne sont que certains des blocs qui ont changé de position, et l'ajout de 1 et 2 paires. Le premier bloc de code est la traduction approximative (sans "Sum" et "Bonus"), il suffit donc de se référer à celui-ci. Le lien norvégien était juste pour justifier l'ordre des blocs pour les personnes pouvant être utilisées pour d'autres configurations. Je pense que les règles sont claires et que les blocs "paires" sont assez explicites. Le reste des règles doit être expliqué sur le lien wiki anglais que j'ai fourni.
daniero
Oh, je viens de réaliser que les règles sont différentes. J'utiliserai ensuite les règles officielles "internationales": yahtzeerules.com/yahtzee-scoring.htm (j'aime mieux les norvégiennes, il y a plus de variations dans les scores possibles) - je changerai la question dans un instant.
daniero
Vous allez réellement faire correspondre les cartes d'entrée à la ligne de score? Ne devrions-nous pas avoir à déterminer quelle ligne est la plus appropriée pour une main donnée?
DavidC
1
@Matt Après avoir parcouru certains des meilleurs résultats d'un certain moteur de recherche, je dirai «oui».
daniero

Réponses:

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
la source
4
Je jure que cela semble identique à quelque chose que j'ai lu sur le côté d'un vaisseau spatial extraterrestre.
Kevin Elliott
Je n'ai aucune idée si ce programme fonctionne ou non, mais c'est sûrement le plus court: 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 caractères en excluant les commentaires)

Avec l'entrée

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

Production

[1] 194
flodel
la source
C'est bien de voir que quelqu'un parvient à obtenir la bonne sortie: D Je vais mettre à jour l'exemple.
daniero
Je pense que votre programme gère de façon incorrecte full house. J'ai testé les dés 2 2 2 2 2et je crois que votre programme considère cela comme un full et attribue les 25 points.
Matt
Je pense qu'il y a aussi un problème avec les grandes et petites lignes droites. Si tous les dés sont les mêmes (j'ai à nouveau testé 2 2 2 2 2) j'obtiens un résultat numeric(0)au lieu d'un score.
Matt
@Matt, d'où je viens (mes règles ou tout le monde?), Vous pouvez marquer un yahtzee (par exemple 2 2 2 2 2) sous "Full house". Je pense que vous avez raison sur les lignes droites, merci; Je mettrai à jour mon code avec une version plus courte à laquelle j'ai 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]

Comme demandé, l'entrée se fait sur stdin:

$ yScore.py < dice.txt
194

Si les données pouvaient être préchargées dans une liste, comme l'ont fait d'autres solutions, je pourrais supprimer 62 caractères pour atteindre 302.

Mat
la source
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]]}

Il doit y avoir un moyen plus efficace de vérifier la courte ligne droite.

DavidC
la source
1

GolfScript 180

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

Vous pouvez tester le programme ici

Programme annoté:

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
la source
1

Perl 527 caractères

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
la source