ヤッツィー最高スコア


26

ヤッツィーは、5つの6面のサイコロと、スコアを記入するための13の異なるボックスのスコアシートでプレイされるゲームです。各ボックスには、独自のスコアリングルールがあります。

  • 1秒、2秒、3秒、4秒、5秒、6秒はすべて、それぞれのサイコロの合計に等しいポイントを獲得します(つまり、3として獲得した[3、2、3、1、5]のロールは6ポイントを獲得します:3それぞれ3)。
  • 3種類と4種類(聞こえると、3つまたは4つのサイコロが転がった)は、5つのサイコロすべての合計に等しいポイントを獲得します。
  • フルハウス(2つのサイコロが1つの値を示し、他の3つのサイコロが別の値を示す)が25ポイントを獲得
  • 小さなストレート(4つの連続した値)が30ポイントを獲得
  • 大きなストレート(すべて連続した値)が40ポイントを獲得
  • ヤッツィー(すべてのサイコロが同じ値を示す)が50ポイントを獲得

13番目(チャンス)はゲーム内では理にかなっていますが、この課題にはそれほど意味がありません。さらに、ゲームには余分なヤッツィーのボーナスがありますが、ここでは意味がありません。課題は...

5つのサイコロを入力として(5つの整数1〜6、ただし入力は便利ですが、入力は常に有効であると想定できます)、その「手」で可能な最高スコアを出力します。このチャレンジでは、上記のリストのスコアリング方法のみが有効です(具体的には、このチャレンジではチャンスは有効なスコアボックスではありません)。スコアは、それが整数であろうと文字列表現であろうと、その小数の数値として出力されるべきです。すぐに数字として認識できるはずです。空白の先頭/末尾は問題ありません。これはプレゼンテーションではなくスコアを取得することです。

ゴルフをコーディングすれば、特定の言語で最も少ないバイト数で答えが得られます。標準的な抜け穴は禁止されています。

テストケース

(これらはすべて独立していることに注意してください、挑戦はサイコロの1つの「ハンド」を獲得することです):

in: 1 5 4 3 2
out: 40
in: 1 1 4 3 1
out: 10
in: 2 2 6 5 3
out: 6
in: 2 4 2 4 6
out: 8
in: 1 1 1 1 1
out: 50
in: 5 2 5 3 6
out: 10
in: 1 6 3 4 2
out: 30
in: 1 3 1 1 3
out: 25
in: 6 5 5 6 6
out: 28
in: 1 2 3 5 6
out: 6

3
代わりに古い質問を閉じますか?IMOこれは...その1つのより良い質問です
ジュゼッペ

5
IMOこれは、ヤッツィーのゲームスコアの複製ではありません。 これは、一方のハンドの最高スコアであり、もう一方の質問がサイコロのリストからスコア全体を要求していることを明示しています。最後に、そして最も重要なことは、ここで「コピーアンドペースト」シナリオで使用できる可能性のあるだまされた人からの答えを見ないことです。再開を検討してください。
開発者


2
FWIW、私はこの質問をまとめたとき、古い質問を知っていました。私の考えは、@ DevelopingDeveloperが言ったことを反映していました。これを以前の演習として行ったことがあるので、このプロセスを最適化する興味深い機会を見つけました。また、これはもっときれいな挑戦だと思います。
brhfl

「13番目(チャンス)はゲーム内で意味がありますが、このチャレンジではそれほど意味がありません。」
ユニヘドロン

回答:


6

R146 141バイト

function(d)max(unique(d<-sort(d))*(g=table(d)),any(g>2)*sum(d),all(2:3%in%g)*25,(s=sum((R=diff(d))==1))<4&all(R<2)*30,(s>3)*40,(0==sd(d))*50)

オンラインでお試しください!

plannapusによるアウトゴルフ

入力をリストとして取得し、スコアを返します。

少し変更しました:

function(d){
 d <- sort(d)
 u <- unique(d)                  # unique dice
 g <- table(d)                   # table of counts
 Ns <- u*g                       # scores as 1s, 2s, ... etc.
 NKind <- any(g>2)*sum(d)        # 3 or 4 of a kind if any counts are at least 3
 FHouse <- all(2:3%in%g)*25      # full house is 25 if 2 & 3 are in counts
 R <- diff(d)                    # consecutive differences
 s <- sum(R==1)                  # sum of differences equal to 1
 sStraight <- s<4 &              # if the number of 1s is 3 and
               all(R<2)*30       # no consecutive numbers are 2 apart
 bStraight <- (s>3)*40           # all 1s means big straight
 Yahtzee <- sd(d)==0             # sd = 0 means all are equal
 max(Ns,NKind,FHouse,sStraight,bStraight,Yahtzee)
}


f(c(1,2,3,5,6))失敗します— 6を生成する必要があり、代わりに30を生成します。これは、1つの異なるペア(ポストソート)をカウントしているためであるようです。 4人の。...私は、私はしばらく前にエクササイズAとしてこれをやったときに私はこれに走ったと思うし、私はおそらく、テストケースとしてあることを追加する必要があります
brhfl

@brhflこれは修正されました。
ジュゼッペ


4

R、136 134バイト

function(n,y=table(factor(n,1:6)),z=sum(!diff(diff(sort(n)))))max(1:6*y,c(25,sum(n),10*3:5)[c(all(y<4&y-1),any(y>2),z>1,z>2,any(y>4))])

@Giuseppeのおかげで2バイトダウンしました

インデント、

function(n, #vector of die scores
         y=table(factor(n,1:6)), #Contingency table
         z=sum(!diff(diff(sort(n))))) #Diff of diff of ordered scores
    max(1:6*y,
        c(25,sum(n),10*3:5)*c(all(y<4&y-1), #Full house
                            any(y>2), #3 and 4 of a kind
                            z>1, #Small straight
                            z>2, #Long straight
                            any(y>4))] #Yahtzee

いくつかのテストケース:

> f=function(n,y=table(factor(n,1:6)),z=sum(!diff(diff(sort(n)))))max(1:6*y,c(25,sum(n),10*3:5)*c(all(y<4&y-1),any(y>2),z>1,z>2,any(y>4)))
> f(c(2,4,2,4,6))
[1] 8
> f(c(1,2,3,5,6))
[1] 6
> f(c(6,5,5,6,6))
[1] 28
> f(c(6,5,3,1,4))
[1] 30
> f(c(6,5,3,2,4))
[1] 40

1
factor気が散る前に、私は熱い秒を考えました。しかし、私は私があなたのアプローチを使用している場合を考えるzs...私の答えで)、私は134にダウンゴルフ鉱山することができます
ジュゼッペ・

また、の代わりにを使用all(y<4&y-1)して使用し、関数の引数としてではなくインラインを設定することで3バイトを節約できますが、それでもすべてのテストケースに合格します。*[y
ジュゼッペ

また、私は再構築しmax、バイトをyインライン設定から節約したと思います。
ジュゼッペ

3

バッチ、359バイト

@echo off
set/at=s=m=r1=r2=r3=r4=r5=r6=0
for %%r in (%*)do set/a"m+=!(m-r%%r),r%%r+=1,t+=%%r,p=s-r%%r*%%r,p&=p>>9,s-=p
goto %m%
:1
if %r1% neq %r6% set s=40&goto g
:2
set/at=r3*r4*(r2*(r1+r5)+r5*r6)
if %t% gtr 0 set s=30
goto g
:3
set/a"s=r1^r2^r3^r4^r5^r6"
if %s%==1 if %t% lss 25 set s=25&goto g
:4
set/as=t
goto g
:5
set s=50
:g
echo %s%

説明:

@echo off
set/at=s=m=r1=r2=r3=r4=r5=r6=0
for %%r in (%*)do set/a"m+=!(m-r%%r),r%%r+=1,t+=%%r,p=s-r%%r*%%r,p&=p>>9,s-=p
goto %m%

各番号のサイコロの数、最大数、すべてのサイコロの合計、同じ数のサイコロの最大合計を計算します。

:1
if %r1% neq %r6% set s=40&goto g

すべてのサイコロが異なる場合、これは長いストレートかもしれませんが、それはno 1またはnoである必要があり6ます。

:2
set/at=r3*r4*(r2*(r1+r5)+r5*r6)
if %t% gtr 0 set s=30
goto g

それ以外の場合、または最大で2つのサイコロが同じ場合、これはまだ短いストレートになる可能性があります。そこ少なくともでなければならない34し、また、他の4つの数字の組み合わせ。

:3
set/a"s=r1^r2^r3^r4^r5^r6"
if %s%==1 set s=25&goto g

同じサイコロが3つある場合は、満杯の家があるかどうかを確認し3^2==1ます。ただし、6代や5代などの一部のフルハウスでは、3-of-kindのスコアが高くなります。

:4
set/as=t
goto g

それ以外の場合、または同じものが4つある場合は、合計をスコアします。

:5
set s=50

そして、同じものが5つあるなら、ヤッツィー!

:g
echo %s%

最高のスコアを出力します。


1
[5,5,6,6,6]-フルハウスとして記録される落とし穴の可能性を思い出させてくれてありがとう-これをテストケースとして追加しました。私が忘れていた奇妙なフリンジケースがいくつかあることを知っていました。
brhfl

3

ゼリー、58バイト

ċЀ`Ṁ>2ȧS
ṢI=1Ạµ-ƤẸ,E;ṢI$E$;⁸Lƙ`Ṣ⁼2,3¤a3,5,4,2.Ṁ×⁵»Ç»Sƙ`Ṁ$

オンラインでお試しください!


それは完全に有効ですが、私は好奇心が強く、ジェリーを自分で調べるほど十分に知りません... 25.0他のケースにはトレーリングがないのに、なぜフルハウスが戻り.0ますか?
brhfl

@brhflまあ、それは2.5 × 10 = 25.0(浮動小数点演算)として推論されるのに対して、などの他の整数303 × 10 = 30(整数演算)として推論されるからです。
エリックアウトゴルファー

2
ありがとう!私は質問を本当に上手く言いませんでした。私はあなたがフルハウスを検出するためにどのような方法を使用しているかをより知りたいのですが、今ではそれを考えると、2.5、3、4、5 * 10 vs 25、30、40、50。自分の質問に答えたと思う。
brhfl

@brhfl正確に言うと、× 10は2バイトであり、の2.5よう25に2バイトであり、で3,5,43バイトを節約する30,50,40ため、3 + 0-2 = 1バイトが節約されます。
エリックアウトゴルファー

2

Perl 6、159バイト

->\b{max map {$_(b)},|(1..6).map({*{$_}*$_}),{.kxxv.sum*?.values.grep(*>2)},{25*(6==[*]
.values)},30*?*{3&4&(1&2|2&5|5&6)},40*?*{2&3&4&5&(1|6)},50*(*.keys==1)}

オンラインでお試しください!

入力は「どんなに便利でも」受け入れられるので、私の関数はそれをBagクラスのインスタンスとして受け取ります。これは、多重度を持つコンテナです。A Bagも連想コンテナです。バッグ内で発生した$bag{$key}回数を返します$key

関数の大部分は、可能なYahtzeeの各ハンドを評価する関数のリストに過ぎず、そのハンドのスコアを返すか、ハンドの条件が満たされない場合はゼロを返します。

  • |(1..6).map({ *{$_} * $_ })1〜6の繰り返し実行に基づいて手を評価する6つの関数のリストです。リーディング|はこのリストを周囲のリストにフラット化します。
  • {.kxxv.sum * ?.values.grep(* > 2) }3種類と4種類のハンドを評価します。 .kxxva Bagは、それぞれの多重度で繰り返されるキーを返し、ダイスロールの元のリストを復元し、.sumもちろんサイコロを合計します。その合計にブール値(?)を掛けます。これは、バッグ.values(つまり、多重度)に2より大きい値が含まれている場合に真になります。
  • { 25 * (6 == [*] .values) }フルハウスハンドを評価します。25は、多重度の積が6である場合に真であるブール値で乗算されます。5つのサイコロは、一方が3で他方が2の場合にのみ発生します。
  • 30 * ?*{ 3 & 4 & (1 & 2 | 2 & 5 | 5 & 6) }小さなまっすぐな手を評価します。それはWhateverCode機能です。2番目の星*Bag。中括弧間の式は、値3と4、および1と2、または2と5、または5と6の接合部です。この接合部をBag検索すると、対応する多重度の接合部が得られます。3と4の多重度、および1と2、または2と5、または5と6の少なくとも1つがゼロ以外の場合、ブール値に強制されたときにジャンクションはtrueに?なり、このブール値に30が掛けられますスコアを取得します。
  • 40 * ?*{ 2 & 3 & 4 & 5 & (1 | 6) }同様に、大きなストレートハンドを評価します。サイコロには2〜5の各数字と1または6のいずれかを含める必要があるため、より簡単です。
  • 50 * (*.keys == 1)ヤッツィー手を評価します。これは、個別のサイコロの数が1である場合にtrueとなるブール値の50倍です。

2

ピップ65 63バイト

n:_NgM\,6MXn*\,6AL[2<MXn23=JSNn3<Y#MX Jn^0MXn=5]*[$+g25--y*t50]

5つのコマンドライン引数としてサイコロを受け取ります。オンラインでお試しください!

Ungolfed +説明

(これは元のバージョンです。)

                    g is list of cmdline args; t is 10 (implicit)

Y                   Yank into y:
  _Ng                function that counts occurrences of its argument in g
 M                   mapped to
  \,6                inclusive range from 1 to 6
                    This gives us how many dice are showing each number 1-6

s:                  Assign to s:
  # MX               length of max of
      Jy ^ 0         join y into string and split on zeros
                    This gives us the length of the longest straight

MX                  Max of
   y * \,6           each die frequency in y, times its value
 AL                  to which list append
   [                 this list:
                      3- and 4-of-a-kind:
    MXy > 2 & $+g      If max frequency is 3 or more, sum of g (else 0)
                      Full house:
    23 = J SNy & 25    Sort y and join into string; if it's 000023, 25 (else 0)
                      Straights:
    s > 3 & --s*t      If s is 4 or more, (s-1)*10 (else 0)
                      Yahtzee:
    MXy = 5 & 50       If max frequency is 5, 50 (else 0)
   ]
                    The result of the last expression is autoprinted

1

ルビー、184バイト

完全なプログラム。入力をテストしやすくするために$/=' '、先頭に追加して「スペースで区切られた数字」形式で読み取ります。(191文字)

a=$<.map &:to_i
b=a.|c=[]
d=(1..6).map{|x|e=a.count x
c<<x*e
e}
e=a.sum
p !b[1]?50:b[4]&&!(a&[1,6])[1]?40:(1..3).any?{|x|(a&[*x..x+3])[3]}?30:(d-[0,2,3])[0]?d.max>2?e:c.max: [25,e].max

200バイトの障壁を破り、数十バイトを残して簡単に破壊することができました!

オンラインでお試しください!

説明

しかし、あまり良いものではありません。Rubyの知識があることを願っています〜

a=$<.map &:to_i # a: input as [number]*5
b=a.|c=[]       # c: [], b: a.uniq
d=(1..6).map{|x|
    e=a.count x # e: occurrence count in a 
    c<<x*e      # add (number * occurrence count) to c
    e           # return value in d
}
e=a.sum         # e: sum of input
p !b[1] ? 50 :  #   condition to print 50 <= if a.uniq has length 0 (el 1 is nil)
  b[4] &&       #   condition to print 40 <= if a.uniq has length 5 (el 4 exists)
  !(a&[1,6])[1] ? 40 : # <- arr & [mask]  # and a does not have both 1 and 6
  (1..3).any?{|x| # condition to print 30 <= if any of 1..4, 2..5, 3..6
  (a&[*x..x+3])[3]} ? 30 : # [3] to assert entire mask is found in a
  (d-[0,2,3])[0] ? # if, after removing 0 (not found) 2 (a pair) 3 (a triple)
                   # and something is found, this is not full house
  d.max > 2 ?   # is triple / quadruple ?
     e :        # weakly dominating alternatives
     c.max      # choose best by-suit
  : [25,e].max  # choose best by-score
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.