Ai thắng được mánh Spades


19

Viết mã để xác định ai thắng trò lừa bốn thẻ trong trò chơi Spades . Ít byte nhất sẽ thắng.

Đầu vào là một chuỗi liệt kê bốn thẻ được chơi theo trình tự như TH QC JH 2H(Ten of Hearts, Queen of Club, Jack of Hearts, Two of Hearts). Một thẻ được đưa ra bởi hai nhân vật: một bộ đồ từ CDHSvà một giá trị từ 23456789TJQKA. Bạn được đảm bảo rằng đầu vào là hợp lệ và các thẻ là khác biệt.

Bạn nên xuất số 1, 2, 3 hoặc 4 cho người chiến thắng. Trong ví dụ TH QC JH 2H, jack of heart thắng lừa, vì vậy bạn nên xuất 3.

Đầu vào và đầu ra của bạn phải chính xác như được mô tả, ngoại trừ các dòng mới theo dõi là tùy chọn.

Dưới đây là các quy tắc Spades để giành chiến thắng một mánh khóe. Thẻ chiến thắng là thẻ cao nhất trong bốn người, với một số cảnh báo. Spades là phù hợp với át chủ bài , vì vậy bất kỳ thuổng nào vượt trội hơn bất kỳ thuổng nào. Bộ đồ của lá bài đầu tiên được chơi là bộ đồ dẫn đầu , và chỉ những lá bài của bộ đồ hoặc quả cầu đó mới đủ điều kiện để giành được mánh khóe. Thẻ của cùng một bộ đồ được so sánh bởi các giá trị của chúng, được đưa ra theo thứ tự tăng dần như 23456789TJQKA.

Các trường hợp thử nghiệm:

TH QC JH 2H
3
KC 5S QS 9C
3
QD 2D TD 5D
1
9S 5D AD QS
4
3D 4C 3H JH
1
9S 4S TS JS
4
5H 9H 2C AD
2
5S 4C 3H QD
1
2H 2S KH AH
2

Câu trả lời:


10

Bình thường, 28 27 25 byte

J"KTAZ"hxcz)eo_XN+@z1JJcz

Dùng thử trực tuyến: Trình diễn hoặc Test Suite (4 ký tự đầu tiên là cấu trúc của bộ thử nghiệm)

Cảm ơn @isaacg cho một mẹo, đã lưu 2 ký tự.

Ý tưởng chính là sửa đổi ký tự của mỗi tay theo cách như vậy, rằng tay thắng có giá trị tối đa.

Các giá trị của bàn tay 23456789TJQKAđã gần sắp xếp. Tôi chỉ phải thay thế Tbằng A, Kvới TAvới Z, kết quả với 23456789AJQSZ.

Thứ tự của bộ đồ CDHSlà cho hầu hết không thực sự quan trọng. S, bộ đồ mạnh nhất, vốn đã là giá trị tối đa. Quan trọng là cung cấp cho bộ đồ của tay thứ nhất giá trị mạnh thứ hai. Vì vậy, tôi dịch bộ đồ này vào K.

Tất cả các tay cũng phải được đọc ngược lại, vì bộ đồ mạnh hơn giá trị.

                           implicit: z = input string
J"KTAZ"                    J = "KTAZ"
             o         cz  orders the hands N of split(z) by:
              _              the reversed of 
               XN+@z1JJ      N, where the values z[1]+J are replaced by J
            e              last element (winning hand)
        xcz)               index of the winning hand in split(z)
       h                   + 1

Tôi bỏ cuộc, chơi tốt: P
orlp

Tôi không nghĩ những .ethứ đó đáng giá - sử dụng ongắn hơn 1 ký tự như tôi nghĩ.
isaacg

@isaacg Quyền của bạn. Điều thú vị là, tôi đã có giải pháp 27 trước .egiải pháp 28. Nhưng giải pháp 27 kết thúc bằng một )và do đó cũng có 28 byte. : oops:
Jakube

1
Tôi đã nghĩ ra một cách để lưu 2 ký tự khác: Dịch từ +@z1"KTA"sang "KTAZ", nhưng thay vì sử dụng các chuỗi trực tiếp sử dụng J"KTAZ"ở đầu và +@z1Jđến J.
isaacg

@isaacg Rất thông minh. Cảm ơn. Btw. Tôi suy nghĩ khá lâu về việc đưa ra đối số thứ 3 của Xtùy chọn (Chỉ khi a và b là các chuỗi). Nhưng tôi không thực sự chắc chắn, nếu Xab)nên đánh giá Xab_b(đảo ngược b, sẽ tốt cho những thứ như Xa"</\>") hoặc Xab+tbhb(b thay đổi). Sở thích của bạn là gì?
Jakube

6

CJam, 34 33 byte

lS/_{)2$0='S+\#\"TQKA"_$er+}$W>#)

Thuật toán

Logic rất đơn giản. Tôi có một loại tùy chỉnh đang diễn ra, trong đó trước tiên tôi ưu tiên cho nhân vật thứ hai đại diện cho bộ đồ. Trong đó, Spades được ưu tiên cao nhất và sau đó là bộ ném đầu tiên. Nghỉ ngơi tất cả là -1. Sau đó, tôi sắp xếp nhân vật đầu tiên bằng cách hoán đổi Tvới AQ với Kcó phân loại từ vựng.

Giải thích mã

Trước hết, hãy xem thứ tự từ vựng của các giá trị khuôn mặt của thẻ là gì:

"23456789TJQKA"$

23456789AJKQT

Vì vậy, tất cả các số là ở vị trí chính xác. Jcũng ở vị trí chính xác. Chúng ta cần phải trao đổi KQJAđể có được thứ tự từ vựng.

lS/_{)2$0='S+\#\"TQKA"_$er+}$W>#)
lS/                                 "Read an input line and split on spaces";
   _{                      }$       "Copy the array and sort it using this custom logic";
     )                              "Take off the last character of each hand.";
      2$0=                          "Get the suit of the first hand";
          'S+                       "Add Spades suit to it";
             \#                     "Get the index of the current hand suit.
                                     1 for Spades, 0 for first hand suit, -1 otherwise";
               \                    "Put face value of this hand on top of stack";
                "TQKA"              "Put string TQKA on stack";
                      _$            "Copy and sort. This essentially reverses the string
                                     TQKA to form AKQT. This is 1 byte shorter than _W%";
                        er+         "Swap T with A and K with Q and add to the
                                     suit index calculated previously";
                                    "After the above tuple, sorting will automatically
                                     convert the tuple to string and sort lexically";
                             W>     "Get the array containing only the last element";
                               #)   "Get the index of this hand in original set and
                                     increment to convert it to 1 based";

Dùng thử trực tuyến tại đây


3

JavaScript (ES6), 112

Quét danh sách và trả về vị trí của giá trị cao nhất được tìm thấy.

Chạy đoạn mã để kiểm tra (trong Firefox)

F=t=>t.split(' ').map((c,i)=>(n='23456789TJQKA'.search(c[0])+(c[1]>'H'?40:c[1]==t[1]&&20))>m&&(m=n,r=i+1),m=0)|r

C.innerHTML=['TH QC JH 2H','KC 5S QS 9C','QD 2D TD 5D','9S 5D AD QS','3D 4C 3H JH','9S 4S TS JS','5H 9H 2C AD','5S 4C 3H QD'].map(h=>h+' -> '+F(h)).join('\n')
<pre id=C></pre>


3

Perl, 73 byte

#!perl -pl
/\B./;s/$&/P/g;y/TKA/IRT/;$_=reverse;@a=sort split;/$a[-1]/;$_=4-"@-"/3

Hãy thử tôi .

Chuyển đổi tên thẻ sao cho thứ tự giá trị trò chơi tuân theo thứ tự bảng chữ cái, sau đó chọn mức cao nhất bằng cách sắp xếp và tìm kiếm nó trong chuỗi gốc cho vị trí.


2

Ruby, 59 + 2 = 61

Với cờ dòng lệnh na, chạy

p (1..4).max_by{|i|$F[i-1].tr($_[1]+'SJQKA','a-z').reverse}

2

J, 47 byte

1+[:(i.>./)_3+/\16!@-]i.~'SXAKQJT9876543'1}~1&{

Sử dụng:

   (1+[:(i.>./)_3+/\16!@-]i.~'SXAKQJT9876543'1}~1&{) 'TH QC 9S 8S'
3

Phương pháp:

  • Đối với mỗi char đầu vào, chúng ta gán một giá trị dựa trên vị trí của nó trong 'S[second char of input]AKQJT9876543'chuỗi. Chars không tìm thấy có được giá trị last position + 1ngầm. Các ký tự khác có giá trị ít hơn nhiều ( value=(16-position)!).
  • Tính tổng cho 3 bộ ba đầu vào và một bộ đôi (ví dụ TH_ QC_ 9S_8S).
  • Chọn chỉ số dựa trên 1 của giá trị tối đa.

(Thật không may, J không thể so sánh trực tiếp các ký tự hoặc chuỗi. Nó chỉ có thể kiểm tra sự bằng nhau của chúng mà loại trừ một số cách tiếp cận khác cho thử thách này.)

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


2

C #, 237

using System;namespace S{class P{static void Main(string[] a){var V="23456789TJQKA";int x=0;int y=0;var z=a[0][1];for(int i=0;i<4;i++){int q=V.IndexOf(a[i][0])+2;var w=a[i][1];q*=w==z?1:w=='S'?9:0;if(q>y){x=i;y=q;}}Console.Write(x+1);}}}

Cách thức hoạt động: Lặp lại mỗi tay để tính "giá trị" của thẻ .. lưu trữ chỉ số có giá trị cao nhất. Giá trị thẻ được xác định là thứ hạng của thẻ nhân với 0 nếu nó không phải là thuổng hoặc bộ đồ mở, 1 nếu đó là bộ đồ mở và 9 nếu là bộ thuổng nhưng không phải bộ đồ mở. (9 choosen b / c 2 * 9 = 18> A = 14 & 9 là một char duy nhất)


1

Bình thường, 36 33 byte

KczdhxKeo,x,ehK\SeNXhN"TKA""AYZ"K

Cách tiếp cận khá đơn giản, sử dụng sắp xếp với chức năng khóa tùy chỉnh, sau đó tìm chỉ mục có giá trị cao nhất.


Bạn đã cố gắng tránh các loại và chỉ tìm giá trị cao nhất? Trong JavaScript hóa ra ngắn hơn
edc65

@ edc65 Trong Pyth không có hoạt động để tìm giá trị cao nhất, chỉ để sắp xếp. Nhưng với một ký tự ( e) bạn có thể nhận được phần tử cuối cùng, vì vậy việc tìm giá trị cao nhất chỉ là sắp xếp theo sau là lấy phần tử cuối cùng.
orlp

Downvoter, quan tâm để giải thích?
orlp

1

Bình thường, 31 byte

hxczdeo}\SNo}@z1Zox"TJQKA"hNScz

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

Làm thế nào nó hoạt động:

Cách thích hợp để đọc thủ tục này là trở lại phía trước. Quy trình sắp xếp thẻ mong muốn vào cuối danh sách, sau đó rút thẻ ra và tìm chỉ mục của nó trong danh sách ban đầu.

  • cz: Điều này tạo ra danh sách các chuỗi thẻ. c, chop, thông thường là một hàm nhị phân (arity 2), nhưng khi được gọi chỉ trên một đầu vào, đóng vai trò là .split()phương thức chuỗi.

  • S: Điều này áp dụng hành vi sắp xếp thông thường, sắp xếp các thẻ được đánh số thấp hơn trước những thẻ cao hơn.

  • ox"TJQKA"hN: Điều này sắp xếp các thẻ theo chỉ mục ( x) trong chuỗi "TJQKA"của chữ cái đầu tiên của thẻ ( hN). Đối với thẻ có số, chữ cái đầu tiên không được tìm thấy, cho kết quả -1. Vì chức năng sắp xếp của Pyth ổn định, thứ tự các thẻ được đánh số không bị ảnh hưởng.

  • o}@z1Z: Tiếp theo, chúng tôi đặt hàng bằng cách xem bộ đồ của thẻ đầu tiên được chơi ( @z1) có trong thẻ được đề cập hay không. Vì Truesắp xếp phía sau False, điều này sẽ gửi các lá bài của bộ đồ dẫn ra phía sau.

  • o}\SN: Điều này giống như cách sắp xếp trước đây, nhưng nó sắp xếp xem liệu chữ cái Scó trong thẻ hay không, gửi các khoảng trống đến mặt sau.

  • hxczde: Điều này trích xuất thẻ cuối cùng được sắp xếp theo cách này ( e), tìm chỉ mục của nó trong danh sách các thẻ ( xczd) và tăng thêm 1 ( h), đưa ra vị trí người chơi mong muốn.

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.