Skor game Yahtzee

12

Untuk masing-masing dari 13 baris daftar skor Yahtzee Anda diberikan (dari stdin) daftar 5 angka yang dipisahkan spasi (dadu). Tugas Anda adalah menghitung skor untuk setiap baris dan menghasilkan Total Total permainan.

Contoh

Input dan cara menafsirkannya:

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

Kami akan mengabaikan Bonus Yahtzee dan aturan Joker, dan hanya merangkum skor dari Bagian Atas dan Bawah dan Bonus di Bagian Atas. Jika ragu, lihat peraturan ini .

Semoga kode terpendek menang!

daniero
sumber
Demi mereka yang tidak bisa bahasa Norwegia, bisakah Anda membuat daftar aturan penilaian yang Anda ingin orang terapkan secara langsung dalam pertanyaan?
Peter Taylor
Heh heh;) Aturannya sama, hanya saja beberapa blok yang sudah berganti posisi, dan penambahan 1 dan 2 pasangan. Blok kode pertama adalah terjemahan kasar (tanpa "Jumlah" dan "Bonus") jadi lihat saja itu. Tautan Norwegia hanya untuk membenarkan urutan blok untuk orang-orang yang mungkin digunakan untuk pengaturan lain. Saya pikir aturannya jelas, dan bahwa blok "pasangan" cukup jelas. Sisa aturan harus dijelaskan pada tautan wiki bahasa Inggris yang saya berikan.
daniero
Oh, saya baru sadar, aturan yang berbeda. Saya akan menggunakan aturan resmi, "internasional": yahtzeerules.com/yahtzee-scoring.htm (saya lebih suka yang Norwegia, memiliki lebih banyak variasi dalam skor yang mungkin) - Saya akan mengubah pertanyaan ini sebentar lagi.
daniero
Anda benar-benar akan mencocokkan kartu input dengan garis penilaian? Tidakkah kita harus mencari tahu baris mana yang paling cocok untuk setiap tangan tertentu?
DavidC
1
@ Matt Berbasis setelah membaca beberapa hasil teratas dari mesin pencari tertentu, saya akan mengatakan 'ya'.
daniero

Jawaban:

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
sumber
4
Saya bersumpah ini terlihat identik dengan sesuatu yang saya baca di sisi pesawat ruang angkasa alien.
Kevin Elliott
Saya tidak tahu apakah program ini bekerja atau tidak, tapi pasti ini yang terpendek: 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 karakter saat tidak termasuk komentar)

Dengan input

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

Keluaran

[1] 194
flodel
sumber
Senang melihat bahwa seseorang berhasil mendapatkan hasil yang benar: D Saya akan memperbarui contoh.
daniero
Saya pikir program Anda salah menangani rumah penuh. Saya menguji dadu 2 2 2 2 2dan saya percaya program Anda memperlakukannya sebagai rumah penuh dan memberikan 25 poin.
Matt
Saya pikir ada juga masalah dengan lurus besar dan kecil. Jika semua dadu sama (saya diuji lagi 2 2 2 2 2) saya mendapatkan hasil numeric(0)bukannya skor.
Matt
@ Mat, dari mana asalku (aturan saya atau semua orang?) Anda dapat mencetak yahtzee (misalnya 2 2 2 2 2) di bawah "Full house". Saya pikir Anda benar tentang lurus, terima kasih; Saya akan memperbarui kode saya dengan versi yang lebih pendek yang saya pikirkan.
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]

Seperti yang diminta, input ada di stdin:

$ yScore.py < dice.txt
194

Jika data dapat dimuat ke dalam daftar, karena beberapa solusi lain telah dilakukan, saya dapat menghapus 62 karakter untuk mencapai 302.

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

Harus ada cara yang lebih efisien untuk memeriksa jalan lurus pendek.

DavidC
sumber
1

GolfScript 180

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

Anda dapat menguji program di sini

Program beranotasi:

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

Perl 527 karakter

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
sumber