Game of Bar Diceで優勝したのは誰ですか?


24

チャレンジ

Bar Diceは、Bar with Dice(名前の由来)でプレイされるシンプルなゲームです。5つのサイコロを5つ振り、ベストハンドを作ろうとします。

スコアリングは、同じ数字で最大数のサイコロを集めることに基づいています。有効なハンドであるためには、各ハンドに少なくとも1つの「エース」または1つが含まれている必要があります。エースは「ワイルド」として機能し、他の数字とペアにすることができます。プレーヤーの手の強さは、最初に桁数、次にそれらの桁の値に依存します。例として、4つの3を持つハンド(ワイルドを数える)は3つの5を持つハンドよりも優れていますが、5つの2を持つハンドよりは良くありません。ウィキペディアの記事
から引用

つまり、最高ランクのハンドはすべて6と1で構成され、最低ランクのハンドは1のないハンドです。

あなたの課題は、両手を取り、勝ったプレーヤーを返すか、または同点の場合に戻すことです。

入力

1から6までの5つの数字の2つの未分類リスト。各リストはプレーヤーの手を表します。入力形式は柔軟です。

出力

プレイヤー1とプレイヤー2のどちらが勝ったか、それとも同点だったかを示す3つの異なるが一貫した静的な値(範囲は許可されません)。何にどの値を使用しているのかを答えてください。たとえば、-1P1が勝った0場合、同点の1場合、P2が勝った場合に戻ることができます。

ルール

  • 入力は常に有効です
  • 勝者を決定するために、各ハンドの可能な限り最高のスコアのみが使用されます。タイブレーカーはありません。例えば、[1,4,4,3,3]タイであろう[1,4,4,2,2]タイブレーカとして3つの2人の者を使用する代わりに。
  • 出力は、毎回選択した3つの値のいずれかでなければなりません。すべての負の数値を単にマッピングすることP1 Winsは許可されておらず、正規化する必要があります。
  • 無効なハンド、つまり1がないハンドは、すべての有効なハンドに負けますが、他のすべての無効なハンドと結びつきます。例えば、[2,2,2,2,2]ネクタイ[3,3,3,3,3]
  • [1,1,1,1,1]のランキングの目的のために6つの者の有効なセットとしてカウントされます。
  • これはので、最短バイト数が勝ちです。

#You guys are pretty good at finding edge-cases that break things. Good job!
Input:  [2,1,5,6,6], [6,2,6,6,6]
Output: P1 Wins

Input:  [2,4,5,6,6], [6,2,6,6,6]
Output: Tie

Input:  [1,2,3,4,5], [5,4,3,2,1]
Output: Tie

Input:  [1,5,5,3,2], [5,4,1,6,6]
Output: P2 Wins

Input:  [3,2,2,2,1], [4,1,3,6,6]
Output: P1 Wins

Input:  [1,1,1,1,1], [6,1,1,6,6]
Output: Tie

Input:  [1,3,3,4,4], [1,2,2,5,5]
Output: P2 Wins

Input:  [1,3,3,5,5], [1,3,3,2,2]
Output: P1 Wins

Input:  [1,3,3,3,4], [1,1,3,3,3]
Output: P2 Wins

Input:  [2,2,2,6,1], [5,3,3,1,2]
Output: P1 Wins

Input:  [5,5,5,1,5], [1,1,1,1,1]
Output: P2 Wins

Input:  [1,1,1,1,1], [1,1,5,1,1]
Output: P1 Wins

回答:


10

ゼリー17 14バイト

ċⱮ6Ḣ©+$®aĖUṀ)M

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

2つのリストのリストを引数として受け取り、[1]プレーヤー1が勝ち、[2]プレーヤー2が勝ち[1, 2]、引き分けで返されるモナドリンク。TIOリンクはこれを整理して表示します。

3バイトを節約してくれた@JonathanAllanに感謝します!

説明

            )   | For each input list (e.g. of one list 1,1,3,3,4)
ċⱮ6             | - Count each of 1..6 (e.g. 2,0,2,1,0,0)
      $         | - Following as a monad:
   Ḣ            |   - Head (number of 1s)
    ©︎           |   - Copy to register
     +          |   - Add (e.g. 2,4,3,0,0)
       ®a       | - Register logical and with this
         Ė      | - Enumerate (e.g. [1,2],[2,4],[3,3],[4,0],[5,0])
          U     | - Reverse each (e.g. [2,1],[4,2],[3,3],[0,4],[0,5])
            Ṁ   | - Max (e.g. 4,2)
              M | Index/indices of maximal score

1
あなたは置き換えることができIṠM、勝者(複数可)のリストを出力。
ジョナサンアラン

@JonathanAllan良い点!ありがとう
ニック・ケネディ

1
レジスタを使用して15バイト
ジョナサンアラン

1
リストは整数と同じようにソートされるため、これも冗長になると思います。
ジョナサンアラン

1
これは素晴らしいアプローチです。よくやった。
ジョナ

9

R115 96バイト

ジュゼッペのおかげで-6バイト。

アーロン・ヘイマンのおかげで-6バイト。

Arnauldのおかげで、JavaScriptのanswerの出力形式に従って-2バイト。

function(i,j)(f(i)-f(j))/0
f=function(x,s=tabulate(x,6),l=s[1]+s[-1]*!!s[1])max(l)*6+order(l)[5]

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

InfP1、Tie、P2 NaNを返します-Inf

f各ハンドのスコアを計算するヘルパー関数を使用します。スコアは次のように定義されます:let dが最も繰り返される数字とn、繰り返される回数です。次に、6*n+d少なくとも1つのエース0があり、エースがない場合のスコアです。次に、最高スコアのプレーヤーを見つける必要があります。

ゴルフをしていない:

f = function(x) {
  s = tabulate(x, 6)         # number of occurrences of each integer
  l = s[1] + s[-1] * !!s[1]  # add the number of wild aces to all values; set to 0 if s[1] == 0
  max(l) * 6 +               # highest number of repetitions (apart from aces)
    order(l)[5]              # most repeated integer (take largest in case of tie)
}
function(i, j){
  sign(f(i) - f(j))
}

order(l)[5]代わりに使用max.col(t(l),"l")して、96バイトのソリューションを取得できます。オンラインで試してください!
アーロンヘイマン

@AaronHaymanとても素敵です、ありがとう!
ロビンライダー

6

JavaScript(ES6)、 97  90バイト

入力をとして受け取ります(a)(b)+InfinityP1、-InfinityP2、またはNaN同点の場合に戻ります。

a=>b=>((g=(x,m)=>x>6?m*/1/.test(a):g(-~x,a.map(k=>n+=k<2|k==x,n=x/6)|m>n?m:n))()-g(a=b))/0

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

コメント済み

a => b => (                 // a[] = dice of P1; b[] = dice of P2
  ( g = (                   // g is a recursive function taking:
      x,                    //   x = dice value to test; initially, it is either undefined
                            //       or set to a non-numeric value
      m                     //   m = maximum score so far, initially undefined
    ) =>                    //
      x > 6 ?               // if x is greater than 6:
        m * /1/.test(a)     //   return m, or 0 if a[] does not contain any 1 
      :                     // else:
        g(                  //   do a recursive call:
          -~x,              //     increment x (or set it to 1 if it's non-numeric)
          a.map(k =>        //     for each dice value k in a[]:
            n +=            //       add 1 to n if:
              k < 2 |       //         k is equal to 1
              k == x,       //         or k is equal to x
            n = x / 6       //       start with n = x / 6
          ) |               //     end of map()
          m > n ?           //     if m is defined and greater than n:
            m               //       pass m unchanged
          :                 //     else:
            n               //       update m to n
        )                   //   end of recursive call
  )()                       // first call to g, using a[]
  - g(a = b)                // subtract the result of a 2nd call, using b[]
) / 0                       // divide by 0 to force one of the 3 consistent output values

6

05AB1E16 15バイト

ジョナサンアランのおかげで-1バイト

εWΘ*6L¢ć+°ƶà}ZQ

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

P1勝利の場合[1、0]、タイの場合[1、1]、P2勝利の場合[0、1]を返します。

2タプルの辞書式順序(ダイスカウント、ダイス値)を使用するのではなく、10 **ダイスカウント*ダイス値としてスコアを計算します。1スコアのない手5。

ε           }           # map each hand to its computed score
 WΘ                     # minimum == 1 (1 if the hand contains a 1, 0 otherwise)
   *                    # multiply (sets hands without 1 to [0, 0, 0, 0, 0])
    6L                  # range [1..6]
      ¢                 # count occurences of each in the hand
       ć                # head extract (stack is now [2-count, ..., 6-count], 1-count)
        +               # add the 1-count to all the other counts
         °              # 10**x
          ƶ             # multiply each element by its 1-based index
           à            # take the maximum

Z                       # maximum
 Q                      # equality test (vectorizes)

1
あー..私のようなć+(今、私はそれを見ることを私は私はそれについて考えていなかったと信じてすることはできません。)!それは私が試みていたものよりもはるかに優れてい°ます。私は20バイトですでにだった、まだテストケースのための問題を修正しなければならなかったことを除いて:) [[1,1,1,1,1],] [6,1,1,6,6]]私の時間を節約するために、私はゴミ箱に私の試みを置くことができるように感謝ので..; P
ケビンCruijssen

1
@KevinCruijssenええ、それはどれほどうまくć+機能するか驚くべきことです。私の最初のアイデアはで始まりましたがæʒW}ʒ1KË、これはこの[1,1,1,1,1]問題によって殺されます。
グリムミー

1
ええ、私のアプローチはの線に沿ってε1¢©Āy{γéθ¬sg®+°P}`.Sいましたが、[1,1,1,1,1]確かにそれをめちゃくちゃにしました。あなたの全体の答えはで素敵な相乗効果を得たWΘ*6L¢ć+、と°ƶ。特に、ビルトインWćƶはここで本当に力を発揮します。
ケビンクルーッセン

Wは実際には必要ではなく6L¢¬Ā*、と同じバイト数WΘ*6L¢です。
グリミー

うーん、良い点。:) Wポップせずに考えて、それ*が強さを示したが¬、ポップせずに、それから*基本的に同じです。それがポップしないという事実は、バイトを節約することを意味していた強さです。しかし、それは確かに主にćƶです。
ケビンクルーイッセン


4

Perl 6の60の 49バイト

&[cmp]o*.map:{.{1}&&max (.{2..6}X+.{1})Z ^5}o&bag

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

戻り値MoreSameLessのためにP1 WinsTieP2 Wins

説明

       *.map:  # Map input lists
                                             &bag  # Convert to Bag
             {                             }o  # Pass to block
              .{1}&&  # Return 0 if no 1s
                    max  # Maximum of
                         .{2..6}  # number of 2s,3s,4s,5s,6s
                                X+.{1}  # plus number of 1s
                        (             )Z     # zipped with
                                         ^5  # secondary key 0,1,2,3,4
&[cmp]o  # Compare mapped values

4

T-SQLクエリ、148バイト

入力としてテーブル変数を使用する

p:プレーヤー

v:ロールの値

DECLARE @ table(p int,v int)
INSERT @ values(1,5),(1,5),(1,5),(1,5),(1,5)
INSERT @ values(2,4),(2,3),(2,3),(2,1),(2,4)

SELECT sign(min(u)+max(u))FROM(SELECT(p*2-3)*(s+sum(sign(s)-1/v))*(s/5*5+v+30)u
FROM(SELECT*,sum(1/v)over(partition by p)s FROM @)c GROUP BY v,s,p)x

オンラインで試す

Player 1 wins returns -1
Tie returns 0 
Player 2 wins returns 1


2

PowerShellの112の 126 123 121バイト

入力をとして受け取ります(a)(b)-1P1の勝利、1P2、または0同点の場合に戻ります。

$args|%{$d=$($_-ne1|group|sort c*,n*|%{$m=$_};(7*(($o=($_-eq1).Count)+$m.Count)+$m.Name+6*!$m)[!$o])-$d}
[math]::Sign($d)

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

テストケースが@( @(1,1,5,1,1), @(1,1,1,1,1), 1)追加されました。

展開済み:

$args|%{
    $score=$(                                            # powershell creates a new scope inside expression $(...)
        $_-ne1|group|sort count,name|%{$max=$_}          # $max is an element with the widest group and the maximum digit except 1
        $ones=($_-eq1).Count                             # number of 1s in a player's hand
        $scoreRaw=7*($ones+$max.Count)+$max.Name+6*!$max # where $max.Name is digit of the widest group
        $scoreRaw[!$ones]                                # output $scoreRaw if the array contains 1, otherwise output $null 
    )                                                    # powershell deletes all variables created inside the scope on exit
    $diff=$score-$diff
}
[math]::Sign($diff)                                     # output the score difference

2

Wolfram言語(Mathematica)78 75 74バイト

グレッグ・マーティンによる-1バイト

Order@@(#~FreeQ~1||Last@Sort[Reverse/@Tally@Flatten[#/. 1->Range@6]]&)/@#&

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

プレーヤー1が勝った場合は-1、プレーヤー2が勝った場合は1、引き分けの場合は0を出力します。

                                    Helper function to score a list:
FreeQ[#,1] ||                       If there are 0 1s, score is True
Last@Sort[                          Otherwise, take the largest element of
    Reverse/@Tally@                 the {frequency, number} pairs in the flat list
       Flatten[ #/. 1->Range@6]     where each 1 is replaced by {1,2,3,4,5,6}.
]&                              e.g. {1,3,3,5,5} -> {1,2,3,4,5,6,3,3,5,5} -> {3,5}

Order @@ (...) /@ #&                Apply this function to both lists,
                                    then find the ordering of the result.

あなたは置き換えることにより、1つのバイトを保存することができFreeQ[#,1]#~FreeQ~1
グレッグマーティン

2

ジャワ8、244の 240 236 215 199バイト

a->b->{int c[][]=new int[2][7],m[]=new int[2],p,i=5;for(;i-->0;c[1][b[i]]++)c[0][a[i]]++;for(i=14;i-->4;)m[p=i%2]=Math.max(m[p],c[p][1]>0?i/2+9*(c[p][i/2]+c[p][1]):0);return Long.compare(m[0],m[1]);}

@someoneのおかげで-4バイト。@Neilの
おかげで-21バイト。@ceilingcatの おかげで-16バイト。

1P1が勝った場合に戻ります。-1P2が勝った場合。0ネクタイの場合。

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

説明:

a->b->{                        // Method with 2 integer-array parameters & integer return
  int c[][]=new int[2][7],     //  Create a count-array for each value of both players,
                               //  initially filled with 0s
      m[]=new int[2],          //  The maximum per player, initially 0
      p,                       //  Temp-value for the player
  i=5;for(;i-->0;              //  Loop `i` in the range (5, 0]:
    c[1]                       //   For player 2:
        [b[i]                  //    Get the value of the `i`'th die,
             ]++)              //    and increase that score-count by 1
    c[0][a[i]]++;              //   Do the same for player 1
  for(i=14;i-->4;)             //  Then loop `i` in the range (14, 4]:
    m[p=i%2]=                  //   Set the score of a player to:
                               //   (even `i` = player 1; odd `i` = player 2)
      Math.max(                //    The max between:
        m[p],                  //     The current value,
                               //     And the value we calculate as follows:
        c[p][1]>0?             //     If this player rolled at least one 1:
          i/2                  //      Use the current value `i` integer-divided by 2
          +9*                  //      With 9 times the following added:
             (c[p][i/2]        //       The amount of dice for value `i//2`
              +c[p][1])        //       Add the amount of dice for value 1
        :                      //     Else (no 1s were rolled):
         0);                   //      Use 0
  return Long.compare(m[0],m[1]);}
                               //  Finally compare the maximum scores of the players,
                               //  resulting in -1 if a<b; 0 if a==b; 1 if a>b

P以上のforループでは、あなたは置き換えることができ...*(c[p][1]>0?1:0)c[p][1]>0?...:0。TIOリンクを投稿することはできません。これは長すぎるため、短縮したくないためです。改変されていないバージョンには、その周りのどこかに不均衡な括弧があります。
私の代名詞は

@誰か、もちろん、ありがとう。私はc[p][1]>0?後でバグ修正としてチェックを追加しましたが、どうやらあまり考えずに。-4をありがとう。:)
ケビンクルーッセン

なぜ*(i<2?6:i)?あなただけのための努力を複製しているi=6i=1。これは単なるものです*i(2に達したらループを停止します)。
ニール

また、9間の任意のマジック番号を指定できます5し、約32、右?を使用する場合は8、代わりに(int)Math.pow(8,(...)*i)を使用できますi<<3*(...)
ニール

1
a->b->{int c[][]=new int[2][7],m[]=new int[2],s,p,i=5;for(;i-->0;c[1][b[i]]++)c[0][a[i]]++;for(i=7;i-->2;)for(p=2;p-->0;m[p]=s>m[p]?s:m[p])s=c[p][1]>0?i+9*(c[p][i]+(i>1?c[p][1]:0)):0;return Long.compare(m[0],m[1]);}結局、すべてのテストケースに合格したようです...
ニール

1

ゼリー、27バイト

’o5Rṗ5¤ṢŒr$€UẎṀ1e⁸¤×µ€_/Ṡo/

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

P1の場合は1、P2の場合は-1、タイの場合は0

説明

’o5Rṗ5¤ṢŒr$€UẎṀ1e⁸¤×µ€_/Ṡo/  Main link
                    µ€       For each list
’                            Decrement each value (so 1s become falsy)
 o                           Vectorized logical or (this replaces previous 1s (now 0s) with the test values)
  5Rṗ5¤                      1..5 cartesian-power 5 (1,1,1,1,1; 1,1,1,1,2; 1,1,1,1,3; ...)
          $€                 For each test list
       ṢŒr                   Sort and run-length encode (gives [digit, #digit])
            U                Reverse each list (gives [#digit, digit])
             Ẏ               Tighten by one (gives a list containing each possible hand for each possible wildcard)
              Ṁ              Take the maximum
               1e⁸¤×         Multiply the list values by (whether or not the original contained a 1) - becomes [0, 0] if not
                      _/Ṡ    Take the sign of the difference between the #digits and the digits
                         o/  If the number of digits differs, then 1/-1 is returned; otherwise, check the value of the digit (could still be 0)

1

スレッジハンマー0.4、27バイト

⢱⢙⢂⠠⡾⢃⠐⢈⠸⣞⠴⠻⠎⡥⡳⡐⢒⠘⢛⣩⡓⣮⡕⡠⣢⣡⠿

このWolfram言語関数に解凍する:

Order @@ (FreeQ[#1, 1] || Last[Sort[Reverse[Tally[Flatten[#1 /. 1 -> Range[6]]], 2]]] & ) /@ #1 & 

Mathematicaの答えとまったく同じであることがわかりました。


1

48 45バイト

UMθ⮌E⁷№ι∨λ¹UMθ׬¬⊟ι⁺⊟ιιUMθ⟦⌈ι±⌕ι⌈ι⟧I⁻⌕θ⌈θ⌕θ⌊θ

オンラインでお試しください!リンクは、コードの詳細バージョンです。入力を配列の配列として受け取り-1、プレーヤー1が勝った場合0、同点の1場合、およびプレーヤー2が勝った場合に出力します。説明:

UMθ⮌E⁷№ι∨λ¹

各ハンドを、値がハンドに表示される回数のカウントに置き換えます6..1。リストが逆になっているのは、a)最大カウントの最大値を見つけやすくし、b)1s のカウントを簡単に削除できるためです。1s のカウントは、2回削除する必要があるため2倍になります。1回はゼロでないことを確認し、1回は他のカウントに追加するためです。

UMθ׬¬⊟ι⁺⊟ιι

のカウントに1s のカウントを追加しますが、s 6..2のカウントがゼロの場合、すべてのカウントをゼロに設定し1ます。

UMθ⟦⌈ι±⌕ι⌈ι⟧

各ハンドについて、最高のカウントとそのカウントで最高の値を見つけます。(実際6、ゴルファーであるため、マイナスの値を見つけます。)

I⁻⌕θ⌈θ⌕θ⌊θ

勝ったハンドと負けたハンドのポジションを差し引くことで、勝ったハンドを決定します。(手が結ばれている場合、最初の手は勝ち負けであるため、結果は0望み通りです。)




1

Perl 5、80 -MList::Util=max -plバイト

sub t{$t=pop;$_=max map$_ x$t=~s/$_//g,2..6;/./;$t&&$_.$t*($&||6)}$_=t($_)<=>t<>

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

入力:

スペースなしの別々の行の各プレーヤー

出力:

1 ライン1が勝つ

0 ネクタイ

-1 ライン2勝


1
ゲームのルールの明確化に基づいて変更
Xcali
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.