누가 Bar Dice 게임에서 이겼습니까?


24

도전

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

답변:


10

젤리 , 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

1
당신은 대체 할 수 IṠM우승자 (들)의 목록 및 출력.
Jonathan Allan

@JonathanAllan 좋은 지적입니다! 감사합니다
Nick Kennedy

1
레지스터를 사용하여 15 바이트
Jonathan Allan

1
목록이 정수와 동일하게 정렬되므로 이제는 중복 될 수 있다고 생각합니다 .
Jonathan Allan

1
이것은 멋진 접근법입니다. 잘 했어.
요나

9

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

order(l)[5]대신 max.col(t(l),"l")96 바이트 솔루션을 사용하는 대신 사용할 수 있습니다 . 온라인으로 사용해보십시오!
애런 헤이먼

@AaronHayman 감사합니다!
로빈 라이더

6

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

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)

1
오 .. 나는 ć+(나는 그것을 생각하지 않았다는 것을 믿을 수 없다.) 그것은 내가 시도했던 것보다 훨씬 낫다. 나는 비슷한 생각을했다 °. :) 내가 이미 20 바이트에 있고 테스트 케이스의 문제를 해결해야한다는 점을 제외하고 [[1,1,1,1,1],] [6,1,1,6,6]].. 시간을 절약 해 주셔서 감사합니다. 쓰레기통에 시도해 볼 수 있습니다.; p
Kevin Cruijssen

1
@KevinCruijssen 그래, 얼마나 잘 ć+작동 하는지 놀랍습니다 . 내 초기 아이디어는로 시작 æʒW}ʒ1KË했지만 [1,1,1,1,1]문제로 인해 사망했습니다 .
그리미

1
그래, 내 접근 방식은의 라인을 따라 ε1¢©Āy{γéθ¬sg®+°P}`.S있었지만 [1,1,1,1,1]실제로는 그 문제를 극복했습니다. 전체 대답은 함께 좋은 시너지 효과를 가지고 WΘ*, 6L¢, ć+,와 °ƶ. 특히 내장은 Wćƶ실제로 여기에 힘을 보여줍니다.
Kevin Cruijssen

W실제로 필요하지는 않습니다 6L¢¬Ā*.와 동일한 바이트 수 WΘ*6L¢입니다.
그리미

흠, 좋은 지적이다. :) 터지지 W않고 생각 하고 *힘을 보였지만 ¬터지지 않고 *기본적으로 동일합니다. 그것이 터지지 않는다는 사실은 바이트를 절약하면서 암시하는 강도입니다. 그러나 그것은 실제로 주로 ćƶ입니다.
케빈 크루이 ssen


4

펄 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

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 Language (Mathematica) , 78 75 74 바이트

Greg Martin의 -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.

당신은 대체하여 하나의 바이트를 저장할 수 있습니다 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 바이트 .
-21 덕분에 바이트 @Neil . @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

페이지를 통해 대한 루프, 당신은 대체 할 수 ...*(c[p][1]>0?1:0)와 함께 c[p][1]>0?...:0. 너무 길어서 단축하고 싶지 않기 때문에 TIO 링크를 게시 할 수 없습니다. ungolfed 버전에는 어딘가에 불균형 괄호가 있습니다.
내 대명사는 monicareinstate

@someone 아, 물론 감사합니다. 나는 추가 c[p][1]>0?버그 수정과 같은,하지만 분명히 많은 생각없이 확인 후. -4 주셔서 감사합니다. :)
Kevin Cruijssen

*(i<2?6:i)? 당신은을 위해 노력을 복제하고 i=6i=1. 이것은 단지 *i(2에 도달하면 루핑을 멈출 수 있음) 일 수 있습니다 .

또한,이 9사이 마법의 숫자가 될 수 있습니다 532, 맞죠? 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 의 수를 쉽게 제거 할 수 있기 때문에 목록이 반대로 됩니다. 의 카운트 1그것이 다른 카운트에 추가 한 번 제로가 아닌 것을 확인하기 위해 한 번, 두 번 제거해야하기 때문들 배가됩니다.

UMθ׬¬⊟ι⁺⊟ιι

의 개수에 1s 개수를 더 6..2하지만 s 개수가 0 인 경우 모든 개수를 0 1으로 설정합니다.

UMθ⟦⌈ι±⌕ι⌈ι⟧

각 손에 대해 가장 높은 수와 해당 수로 가장 높은 값을 찾으십시오. (실제로 우리는 6골퍼로서 가치 마이너스 를 찾습니다.)

I⁻⌕θ⌈θ⌕θ⌊θ

이기는 손의 위치를 ​​빼서 어느 손이 이겼는지 결정합니다. (손이 묶인 경우 첫 번째 손이 이기고지는 것이므로 결과는 0원하는대로됩니다.)




1

펄 5 -MList::Util=max -pl , 80 바이트

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.