Erziele eine Partie Yahtzee

12

Für jede der 13 Reihen eines Yahtzee-Scoresheets erhalten Sie (nach Standard) eine durch Leerzeichen getrennte Liste mit 5 Zahlen (Würfeln). Ihre Aufgabe ist es, die Punktzahl für jede Zeile zu berechnen und die Gesamtsumme des Spiels auszugeben .

Beispiel

Eingabe und Interpretation:

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

Wir werden die Regeln für den Yahtzee- Bonus und den Joker ignorieren und nur die Punkte aus dem oberen und unteren Bereich sowie den Bonus im oberen Bereich zusammenfassen. Im Zweifelsfall beziehen Sie sich auf diese Regeln .

Möge der kürzeste Code gewinnen!

daniero
quelle
Können Sie für diejenigen, die kein Norwegisch sprechen, die Bewertungsregeln auflisten, die die Leute direkt in der Frage implementieren sollen?
Peter Taylor
Heh heh;) Die Regeln sind die gleichen, es sind nur einige der Blöcke, die ihre Position geändert haben, und das Hinzufügen von 1 und 2 Paaren. Der erste Codeblock ist die grobe Übersetzung (ohne "Summe" und "Bonus"), beziehen Sie sich also einfach auf diese. Der norwegische Link diente nur dazu, die Reihenfolge der Blöcke für Personen zu rechtfertigen, die an andere Konfigurationen gewöhnt sind. Ich denke, die Regeln sind klar und die "Paar" -Blöcke sind ziemlich selbsterklärend. Der Rest der Regeln sollte auf dem von mir bereitgestellten englischen Wiki-Link erklärt werden.
Daniero
Oh, ich habe gerade realisiert, die Regeln sind anders. Ich werde dann die offiziellen "internationalen" Regeln anwenden : yahtzeerules.com/yahtzee-scoring.htm (Ich mag die norwegischen besser, es gibt mehr Variationen in möglichen Punkten) - Ich werde die Frage gleich ändern.
Daniero
Wirst du die Eingabekarten tatsächlich der Wertungslinie zuordnen? Müssen wir nicht herausfinden, welche Linie für eine bestimmte Hand am besten geeignet ist?
DavidC
1
@Matt Nachdem ich einige der besten Ergebnisse einer bestimmten Suchmaschine durchgesehen habe, sage ich "Ja".
Daniero

Antworten:

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
quelle
4
Ich schwöre, das sieht genauso aus wie etwas, das ich auf der Seite eines außerirdischen Raumschiffs gelesen habe.
Kevin Elliott
Ich habe keine Ahnung, ob dieses Programm funktioniert oder nicht, aber es ist sicherlich das kürzeste: 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 Zeichen beim Ausschließen der Kommentare)

Mit der Eingabe

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

Ausgabe

[1] 194
Flodel
quelle
Schön zu sehen, dass es jemand schafft, die richtige Ausgabe zu bekommen: D Ich werde das Beispiel aktualisieren.
Daniero
Ich denke, Ihr Programm behandelt Full House falsch. Ich habe Würfel getestet 2 2 2 2 2und ich glaube, dass Ihr Programm das als Full House behandelt und die 25 Punkte vergibt.
Matt
Ich denke, es gibt auch ein Problem mit den großen und kleinen Geraden. Wenn alle Würfel gleich sind (habe ich nochmal getestet 2 2 2 2 2), erhalte ich numeric(0)anstelle einer Punktzahl ein Ergebnis von .
Matt
@Matt, wo ich herkomme (meine Regeln oder die von allen?), Kannst du 2 2 2 2 2unter "Full House" einen yahtzee (z. B. ) erzielen . Ich denke, Sie haben Recht mit den Geraden, danke. Ich werde meinen Code mit einer kürzeren Version aktualisieren, über die ich nachgedacht habe.
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]

Die Eingabe erfolgt wie gewünscht über stdin:

$ yScore.py < dice.txt
194

Wenn die Daten wie bei einigen anderen Lösungen in eine Liste geladen werden könnten, könnte ich 62 Zeichen entfernen, um 302 zu erhalten.

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

Es muss einen effizienteren Weg geben, um nach der kurzen Gerade zu suchen.

DavidC
quelle
1

GolfScript 180

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

Sie können das Programm testen hier

Kommentiertes Programm:

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
quelle
1

Perl 527 Zeichen

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);}
AnfängerProg
quelle