Yahtzee maçı


12

Bir Yahtzee skor çizelgesinin 13 satırının her biri için (stdin'den) 5 sayıdan (zar) boşlukla ayrılmış bir liste verilir. Senin görevin, her satır için puanı hesaplamak ve oyunun Genel Toplam çıktı .

Misal

Girdi ve nasıl yorumlanır:

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

Yahtzee Bonus ve Joker kurallarını göz ardı edeceğiz ve sadece Üst ve Alt Bölümden ve Üst Bölümdeki Bonus'u toplayacağız . Şüpheniz varsa, bu kurallara bakın .

En kısa kod kazanabilir!


Norveççe bilmeyenlerin yararı için, insanların doğrudan soruya uygulamasını istediğiniz puanlama kurallarını listeleyebilir misiniz?
Peter Taylor

Heh heh;) Kurallar aynı, sadece pozisyon değiştiren bloklardan bazıları ve 1 ve 2 çiftinin eklenmesi. İlk kod bloğu kaba çeviridir ("Sum" ve "Bonus" olmadan), sadece buna bakın. Norveç bağlantısı sadece diğer kurulumlara alışkın olabilecek insanlar için blokların sırasını haklı çıkarmaktı. Kuralların açık olduğunu ve "çift" blokların oldukça açıklayıcı olduğunu düşünüyorum. Kuralların geri kalanı, sağladığım İngilizce wiki bağlantısında açıklanmalıdır.
daniero

Oh, sadece fark, kurallar vardır farklı. O zaman resmi "uluslararası" kuralları kullanacağım : yahtzeerules.com/yahtzee-scoring.htm (Norveççe olanları daha çok seviyorum, olası puanlarda daha fazla varyasyon var) - Soruyu bir an değiştireceğim.
daniero

Giriş kartlarını puanlama çizgisiyle eşleştirecek misiniz? Herhangi bir el için hangi hattın en uygun olduğunu bulmamız gerekmez mi?
DavidC

1
@Matt Belirli bir arama motorundan en iyi sonuçları elde ettikten sonra, 'evet' diyeceğim.
daniero

Yanıtlar:


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
Yemin ederim, uzaylı bir uzay gemisinin yanında okuduğum bir şeyle aynı görünüyor.
Kevin Elliott


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

(Yorumlar hariç tutulduğunda 264 karakter)

Giriş ile

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

Çıktı

[1] 194

Birisinin doğru çıktıyı almayı başardığını görmek güzel : D Örneği güncelleyeceğim.
daniero

Bence programınız tüm evi yanlış ele alıyor. Zarları test 2 2 2 2 2ettim ve programınızın bunu tam ev olarak değerlendirdiğine ve 25 puan verdiğine inanıyorum.
Matt

Büyük ve küçük düzlüklerde de bir sorun olduğunu düşünüyorum. Eğer tüm zarlar aynıysa (tekrar test 2 2 2 2 2ettim) numeric(0)Puan yerine bir sonuç elde ederim .
Matt

@Matt, nereden geldiğim (kurallarım veya herkesin?) 2 2 2 2 2"Full house" altında bir yahtzee (örneğin ) puanı alabilirsiniz . Sanırım düzlükler konusunda haklısın, teşekkürler; Kodumu düşündüğüm daha kısa bir sürümle güncelleyeceğim.
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]

İstendiği gibi, girdi standart olarak:

$ yScore.py < dice.txt
194

Veriler bir listeye önceden yüklenebiliyorsa, diğer bazı çözümler yapıldığı gibi, 302'ye ulaşmak için 62 karakteri kaldırabilirim.


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

Kısa düzü kontrol etmenin daha etkili bir yolu olmalı.


1

GolfScript 180

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

Programı buradan test edebilirsiniz

Açıklamalı program:

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 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);}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.