누가 Bar Dice 게임에서 이겼습니까? 먼저 자릿수와

도전

Bar Dice는 주사위가 달린 바에서 플레이하는 간단한 게임입니다. 6 면체 주사위 5 개를 굴려서 최고의 핸드를 만드십시오.

스코어링은 동일한 숫자로 주사위의 가장 큰 수를 모으는 것을 기반으로합니다. 유효한 핸드가 되려면 각 핸드에 최소한 하나의 “에이스”또는 하나를 포함해야합니다. 에이스는 “와일드”의 역할을하며 다른 숫자와 쌍을 이룰 수 있습니다. 플레이어의 손의 힘은 먼저 자릿수와 그 자릿수에 따라 달라집니다. 예를 들어, 3이 4 인 손 (와일드 카운팅)은 5가 3 인 손보다 낫지 만 5가 2 인 손보다 낫지는 않습니다. Wikipedia 기사
에서 가져온

이것은 가장 높은 순위의 핸드가 6과 1로 이루어져 있고 가장 낮은 핸드는 1이없는 핸드입니다.

당신의 도전은 두 손을 잡고 어느 플레이어가 이겼는지 또는 묶었는지 반환하는 것입니다.

입력

1에서 6까지의 5 개의 숫자로 구성된 2 개의 정렬되지 않은 목록. 각 목록은 플레이어의 손을 나타냅니다. 입력 형식이 유연합니다.

산출

플레이어 1 또는 플레이어 2가 이겼는지 또는 동점인지를 나타내는 세 가지의 일관된 정적 값 (범위는 허용되지 않음). 무엇을 위해 어떤 값을 사용하고 있는지 답하십시오. 예를 들어, -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


답변

젤리 , 17 14 바이트

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

온라인으로 사용해보십시오!

두 목록의 목록을 인수로 사용 [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

답변

R , 115 96 바이트

주세페 덕분에 -6 바이트.

Aaron Hayman 덕분에 -6 바이트.

JavaScript 응답 의 출력 형식에 따라 Arnauld 덕분에 -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, NaN넥타이, -InfP2에 대해 반환 합니다 .

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

답변

자바 스크립트 (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

답변

05AB1E , 16 15 바이트

JonathanAllan 덕분에 -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)

답변

파이썬 2 , 85 81 80 바이트

lambda p:cmp(*[max((h.count(i)+h.count(i>1),i)*(1in h)for i in[6]+h)for h in p])

온라인으로 사용해보십시오!

1P1, 0타이 및 -1P2에 대해 반환 합니다 .

오징어 덕분에 -1 바이트


답변

펄 6 , 60 49 바이트

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

온라인으로 사용해보십시오!

반환 More, Same, Less대한 P1 Wins, Tie, P2 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

답변

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