Segna una partita a Yahtzee


12

Per ciascuna delle 13 righe di un referto Yahtzee ti viene dato (dallo stdin) un elenco separato da spazi di 5 numeri (dadi). Il tuo compito è calcolare il punteggio per ogni riga e generare il totale complessivo del gioco.

Esempio

Input e come interpretarlo:

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

Ignoreremo le regole del Bonus Yahtzee e del Joker e sommeremo solo i punteggi della sezione superiore e inferiore e il bonus nella sezione superiore. In caso di dubbi, consultare queste regole .

Che vinca il codice più corto!


A beneficio di coloro che non parlano norvegese, potresti elencare le regole di punteggio che desideri che le persone implementino direttamente nella domanda?
Peter Taylor,

Heh heh;) Le regole sono le stesse, sono solo alcuni dei blocchi che hanno cambiato posizione e l'aggiunta di 1 e 2 coppie. Il primo blocco di codice è la traduzione approssimativa (senza "Somma" e "Bonus"), quindi fai riferimento a quella. Il collegamento norvegese era solo per giustificare l'ordine dei blocchi per le persone che potrebbero essere utilizzate per altre configurazioni. Penso che le regole siano chiare e che i blocchi di "coppia" siano piuttosto esplicativi. Il resto delle regole dovrebbe essere spiegato sul link wiki inglese che ho fornito.
daniero,

Oh, ho appena capito, le regole sono diverse. Userò quindi le regole "internazionali" ufficiali: yahtzeerules.com/yahtzee-scoring.htm (Mi piacciono di più quelle norvegesi, ha più variazioni nei punteggi possibili) - Cambierò la domanda in un momento.
daniero,

In realtà abbinerai le carte di input alla linea di punteggio? Non dovremmo capire quale linea è più appropriata per una data mano?
DavidC,

1
@Matt Basandomi dopo aver sfogliato alcuni dei migliori risultati di un determinato motore di ricerca, dirò "sì".
daniero,

Risposte:


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
Giuro che sembra identico a qualcosa che ho letto sul lato di un'astronave aliena.
Kevin Elliott l'

Non ho idea se questo programma funzioni o meno, ma sicuramente è il più breve: 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 caratteri quando si escludono i commenti)

Con l'input

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

Produzione

[1] 194

Bello vedere che qualcuno riesce a ottenere l'output giusto: D Aggiornerò l'esempio.
daniero,

Penso che il tuo programma gestisca in modo errato full house. Ho testato i dadi 2 2 2 2 2e credo che il tuo programma lo consideri come un full e assegna i 25 punti.
Matt,

Penso che ci sia anche un problema con i rettilinei grandi e piccoli. Se tutti i dadi sono uguali (ho provato di nuovo 2 2 2 2 2) ottengo un risultato numeric(0)anziché un punteggio.
Matt,

@Matt, da dove vengo (le mie regole o quelle di tutti?) Puoi segnare uno yahtzee (es. 2 2 2 2 2) In "Full house". Penso che tu abbia ragione sui rettilinei, grazie; Aggiornerò il mio codice con una versione più breve a cui ho pensato.
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]

Come richiesto, l'input è su stdin:

$ yScore.py < dice.txt
194

Se i dati potessero essere precaricati in un elenco, come hanno fatto alcune altre soluzioni, potrei rimuovere 62 caratteri per arrivare a 302.


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

Ci deve essere un modo più efficiente per verificare la scala corta.


1

GolfScript 180

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

Puoi testare il programma qui

Programma commentato:

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 caratteri

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);}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.