Cầu điểm


13

Một trong những điều làm cho cầu hợp đồng trở nên rất thú vị là trò chơi meta "nhân tạo" rất phức tạp của nó. Hệ thống ghi bàn này là một phần nhỏ của nó.

Cầu là một trò chơi đánh lừa. Mỗi người chơi được một tay gồm 13 lá bài và trò chơi bắt đầu bằng việc đấu thầu . Việc đặt giá thầu xác định cách phần còn lại của trò chơi diễn ra và đó là một phần quan trọng của trò chơi. Để đảm bảo rằng bạn và đối tác của bạn không trả giá quá cao (hoặc quá thấp), hệ thống tính điểm nhân tạo này đã được phát triển để cho bạn biết tay của bạn tốt như thế nào.

Chấm điểm

Đây là một bàn tay mẫu:

S:KQT5
H:J72
D:965
C:AK8

S, H, D, C đại diện cho các bộ đồ (spades, trái tim, kim cương và câu lạc bộ) và phần còn lại là các thẻ trong những bộ đồ đó. Vì vậy, bàn tay này có một nữ hoàng của spades (Q), king of spades (K), ten of spades (T), five of spades, jack of heart, seven of heart, v.v.

Hệ thống tính điểm hoạt động như sau:

  • Bạn nhận được 4 điểm cho mỗi ace (A) bạn có, 3 điểm cho mỗi vị vua (K), 2 điểm cho mỗi nữ hoàng (Q) và 1 điểm cho mỗi jack (J). Không có thẻ khác cho điểm.
  • Mỗi thẻ sau lần thứ tư trong một bộ đồ cho bạn 1 điểm. Vì vậy, nếu bạn có sáu trái tim, bạn sẽ nhận được 2 điểm.
  • Một bộ đồ mà bạn chỉ có 2 thẻ cho bạn 1 điểm (đây là một đôi). Một bộ đồ mà bạn chỉ có 1 thẻ cho bạn 2 điểm (đây là một đơn). Nếu bạn không có thẻ trong một bộ đồ nhất định, bạn sẽ nhận được 3 điểm (đây là một khoảng trống). (Thông thường những điều này chỉ được tính khi bạn đồng ý về một vụ kiện với đối tác của mình, nhưng tôi bao gồm chúng để làm cho thử thách trở nên thú vị hơn.)

Vì vậy, tay trên có 13 điểm.

Thử thách

Đưa tay cầu theo định dạng hiển thị ở trên, tính toán bàn tay có bao nhiêu điểm. Các bộ đồ sẽ luôn được liệt kê theo thứ tự spades, trái tim, kim cương và câu lạc bộ, và các thẻ sẽ luôn được sắp xếp theo thứ tự A, K, Q, J, T, 9 - 2.

Đầu vào và đầu ra mẫu

S:KQT5
H:J72
D:965
C:AK8
       \-> 13

S:AKQT6
H:54
D:J83
C:732
       \-> 12

S:
H:KQT8754
D:A86
C:432
       \-> 15

S:9876
H:843
D:652
C:432
       \-> 0

S:AKQT5
H:AQJ6
D:Q3
C:AK
       \-> 28

Đây là , vì vậy mã ngắn nhất tính bằng byte thắng.

Câu trả lời:


4

Thạch, 27 25 21 byte

Cảm ơn @Dennis cho -3 byte!

L_5.AḞW+“JQKA”i$€Sµ€S

Điều này có đầu vào như một danh sách các dòng. Để lấy đầu vào dưới dạng một chuỗi nhiều dòng, hãy tạo trước a ṣ⁷µ.

Lập bảng các điểm tần số:

Cards:    0  1  2  3  4  5  6 ... 4+k
Points:   3  2  1  0  0  1  2 ... k

chúng ta có thể thấy rằng chúng bằng nhau abs(c-3.5)-.5, trong đó c là số lượng thẻ. Vì mỗi dòng chứa hai ký tự phụ và số điểm luôn là một số nguyên, đây là floor(abs(l-5.5))nơi l là độ dài của dòng.

Lưu ý rằng các chỉ số của Jelly là dựa trên 1 và cũng là hành vi của các hàm được vector hóa trên các kích thước không khớp: các phần tử bổ sung của danh sách dài hơn không bị ảnh hưởng. Vì vậy, [1] + [3,2,0,0]cho [4,2,0,0].

                  µ      The program is two monadic fs applied in turn; an atop.
L_5.AW+“JQKA”i$€S       Helper function:
                 €        For €ach line:
L                         Get the line Length.
 _5.                      Subtract 5.5 (Numeric literals' decimal parts default to .5)
    A                     Apply Absolute value
     Ḟ                    Floor
      W                   Then Wrap it in an array. "S:AKQT6" gives [1].
        “JQKA”i$          Monadic function: index into the string "JQKA".
                €         Apply ^ over €ach char of the line; [3,2,0,0,0].
       +                  Add the two arrays together; [4,2,0,0,0].
                 S        Sum; 6.
                    S    Main link: Sum all results

Hãy thử nó ở đây .


3

ES6, 107 99 89 byte

s=>(t=0,[...s].map(c=>t+="JQKA".search(c)+1),s.split`
`.map(l=>t+=(l=l.length-6)^l>>4),t)

2

Pyth, 27 25 24 byte

sms+a5.5ldshMxL"JQKA"d.z

Chúng tôi tính toán các giá trị riêng cho từng bộ đồ, sau đó thêm chúng.

  s m                 sum of map lambda d:  (d is a line of input)
      +                 add the
        s a                 floor of the absolute difference between
            5.5               5.5
            l d               and len(d)
          s hM xL           to the sum of the indices each incremented by one
                  "JQKA"      of each char in d in the string "JQKA"
                  d
      .z

Bộ thử nghiệm .


1

Võng mạc, 77 59 byte

T`AKQJTd`5-1
:(.){0,3}(.)?
$#1$#1$#2 3$0
\S
$0$*1
+`1 1

1

Giải thích theo cặp dòng / dòng:

  • Trong dòng đầu tiên, chúng tôi chuyển đổi ký tự AKQJT987655432sang 5432111111111. Điều này có nghĩa cho mỗi bộ đồ chúng tôi có một khoản tiền. Nếu chúng tôi có 0 1 2 3 4 5 6 7 ...thẻ trong bộ đồ này, tổng số sẽ được tính bằng +3 +1 -1 -3 -4 -4 -4 -4 ...số điểm chính xác.
  • Trong dòng 2 và 3 để sửa lỗi này, chúng tôi thêm 3 vào mỗi dòng và trước một khoảng trắng, chúng tôi sẽ thêm các giá trị mà chúng tôi sẽ trừ đi. Giá trị bị trừ này gấp đôi chiều dài của thẻ với tối đa là 3 và thêm 1 nếu có ít nhất 4 thẻ.
  • Trong dòng 4 và 5, chúng tôi chuyển đổi các chữ số thành unary bỏ mọi thứ khác trừ không gian phân cách.
  • Trong dòng 6 và 7, chúng tôi thực hiện phép trừ unary.
  • Trong dòng 8, chúng tôi đếm 1các kết quả cho kết quả.

Hãy thử trực tuyến tại đây.



1

Stax , 18 byte

½Γ}♣▓="pì∩û╨▐M↨}╚-

Câu trả lời ngắn nhất cho đến nay, đã đánh bại Jelly (mặc dù tôi hy vọng sẽ sớm bị đánh bại ...)

Chạy và gỡ lỗi trực tuyến!

Giải trình

Sử dụng phiên bản giải nén để giải thích.

LZF{"JQKA"I^+i5-:++F5+
L                         Collect input in a list (if this is not needed, we can yet save another byte)
 Z                        Put a zero under the top of the stack, used as the accumulator
  F                       Loop for every suit
   {               F      Calculate the "score" for the string describing the suit
    "JQKA"I^              Find the 1-based index of current character in "JQKA", 0 for not found
            +             Add to the accumulator
             i5-:+        Subtract 5 from the current 0-based index, and take the sign
                  +       Add to the accumulator
                    5+    Add 5 extra points for each suit

Điều này đạt được bằng cách dịch

  • Mỗi thẻ sau lần thứ tư trong một bộ đồ cho bạn 1 điểm. Vì vậy, nếu bạn có sáu trái tim, bạn sẽ nhận được 2 điểm.
  • Một bộ đồ mà bạn chỉ có 2 thẻ cho bạn 1 điểm (đây là một đôi). Một bộ đồ mà bạn chỉ có 1 thẻ cho bạn 2 điểm (đây là một đơn). Nếu bạn không có thẻ trong một bộ đồ nhất định, bạn sẽ nhận được 3 điểm (đây là một khoảng trống).

Đến

  • Ghi thêm 3 điểm cho mỗi bộ đồ
  • Mỗi thẻ trước số thứ tư trong một bộ đồ mang lại cho bạn -1 điểm, mỗi thẻ sau lần thứ tư cho bạn 1 điểm, thẻ thứ tư có điểm 0.

Sau đó chúng ta có thể sử dụng thuộc tính của hàm Signum.

Bằng cách này, chúng ta có thể tránh việc xử lý rõ ràng số lượng thẻ tiết kiệm một vài byte.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.