谁赢得了酒吧骰子游戏?


24

挑战

Bar Dice是在带有Dice的Bar(因此得名)中玩的简单游戏。您掷出5个六面骰子,并尝试做出最佳手牌。

计分基于累积相同位数的最大骰子数。每只手必须至少包含一个“ A”或一个,才能成为有效手;ace充当“野生字符”,并且可以与任何其他数字配对。牌手的力量首先取决于数字的位数,然后取决于这些数字的值。例如,具有四个3的一手(算出百搭)要比具有三个5的一手好,但并不比具有五个2的一手好。
摘自维基百科文章

这意味着排名最高的牌完全由6和1组成,而排名最低的牌是没有1的任何牌。

您面临的挑战是用两只手并返回哪个玩家赢了,或者他们是否平局。

输入项

两个未排序的5个数字列表,范围从1到6。每个列表代表玩家的手。输入格式灵活。

输出量

任何三个不同但一致的静态值(不允许范围)表示玩家1或玩家2赢了,还是平局。请在您的答案中说明您正在使用什么值。例如,-1如果P1获胜,0平局且1P2获胜,则可以返回。

规则

  • 输入将始终有效
  • 仅使用每手的最佳得分来确定获胜者。没有决胜局。例如,[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

Answers:


10

果冻17 14字节

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

在线尝试!

以两个列表中的一个列表作为参数并返回[1]给玩家1获胜,[2]玩家2获胜和并列的单子链接[1, 2]。TIO链接将其整理显示。

感谢@JonathanAllan节省了3个字节!

说明

            )   | 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
这是一个可爱的方法。做得好。
约拿(Jonah)

9

R115 96字节

-6个字节,感谢Giuseppe。

-6个字节感谢Aaron Hayman。

感谢Arnauld -2个字节,遵循他的JavaScript answer中的输出格式。

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]

在线尝试!

Inf对于P1,NaN对于平局,-Inf对于P2 ,返回。

使用帮助程序功能f来计算每只手的得分。分数定义如下:d设为重复次数最多n的数字,以及其重复的次数。那么分数是6*n+d如果至少有一张王牌,并且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字节感谢JonathanAllan

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

在线尝试!

对于P1获胜,返回[1,0],对于平局返回[1,1],对于P2获胜返回[0,1]。

而不是对2元组(骰子计数,骰子值)使用字典顺序,而是将分数计算为10 **骰子计数*骰子值。没有得分的手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]问题使它丧命。
Grimmy

1
是的,我的做法ε1¢©Āy{γéθ¬sg®+°P}`.S[1,1,1,1,1]相似,但实际上也是如此。你完整的答案有一个很好的协同作用的WΘ*6L¢ć+,和°ƶ。特别是内置程序Wćƶ确实在这里显示了它们的优势。
凯文·克鲁伊森

W实际上并不需要,6L¢¬Ā*与相同WΘ*6L¢
Grimmy

嗯,好点。:)思想W没有弹出,然后*显示出它的力量,但是¬没有弹出,然后*基本相同。它不会弹出的事实是我所隐含的力量,即节省了一个字节。但这确实是主要的ćƶ
凯文·克鲁伊森


4

Perl 6的60个 49字节

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

在线尝试!

返回MoreSameLessP1 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

果冻,21 字节

尼克·肯尼迪(Nick Kennedy)甚至在我把它发布之前就被压碎了:)

’-oÆṃṀ$$Ạ?fÆṃ$L;$o5)M

接受玩家列表的单子链接,该列表输出(1-索引)获胜者列表。

所以P1是[1],P2是[2],领带是[1,2]

在线尝试!


2

PowerShell中112个 126 123 121字节

将输入作为(a)(b)。返回-1为P1取胜,1为P2或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字节,格雷格·马丁(Greg Martin)

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.

您可以将替换FreeQ[#,1]为来节省一个字节#~FreeQ~1
格雷格·马丁

2

Java 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]);}

-4个字节感谢@someone
-21个字节感谢@Neil
-16个字节,感谢@ceilingcat

1如果P1获胜则返回;否则返回0 。-1如果P2获胜;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链接,因为它太长了,我不想缩短它。非高尔夫版本的括号周围不平衡。
我的代名词是monicareinstate,

@someone啊,当然,谢谢。c[p][1]>0?稍后我将检查添加为错误修复,但显然没有考虑太多。感谢-4。:)
Kevin Cruijssen

为什么*(i<2?6:i)呢?您只是在为i=6和重复工作i=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 的计数加倍,因为需要将其删除两次,一次是检查它是否为非零,一次是将其添加到其他计数中。

UMθ׬¬⊟ι⁺⊟ιι

1s的计数添加到的计数中6..2,但是如果1s 的计数为零,则将所有计数都设置为零。

UMθ⟦⌈ι±⌕ι⌈ι⟧

为每只手找到最高的计数和该计数的最高值。(实际上,我们发现价值减去的6是高尔夫球手。)

I⁻⌕θ⌈θ⌕θ⌊θ

通过减去获胜和失手的位置来确定获胜的手。(如果两手被绑在一起,那么第一手既有赢局也有输局,所以结果是0期望的。)


1

C(gcc) / 32位,117字节

t;m;s(int*r){int c[6]={};for(m=0;t=*r++;m=t>m?t:m)c[--t]+=5,t=t?c[t]+t:5;t=*c?*c+m:0;}f(a,b){t=s(a)-s(b);t=(t>0)-!t;}

在线尝试!

接受两个零结尾的整数数组。返回10-1P1 WinsP2 WinsTie


1
@Veskah好,固定。
nwellnhof

1

J47 44字节

*@-&([:({.([:>./#\@]+9^*@[*+)}.)1#.i.@6=/<:)

在线尝试!

受到尼克·肯尼迪(Nick Kennedy)的想法的启发。

不打高尔夫球

*@-&([: ({. ([: >./ #\@] + 9 ^ *@[ * +) }.) 1 #. i.@6 =/ <:)

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 第一线获胜

0 领带

-1 二线胜利


1
根据您对游戏规则的说明进行了更改
Xcali
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.