Có phải đó là một Shuffle ™ tuyệt vời


8

Theo câu hỏi này, Super Shuffle ™ được định nghĩa là một bộ bài đầy đủ (bao gồm cả những người thích đùa) tuân theo bộ quy tắc này:

  • Không có hai thẻ (trừ Jokers) của cùng một bộ đồ được liền kề.
  • Không có thẻ (trừ Jokers) liền kề với một trong những giá trị tương tự.
  • Không có thẻ nào (ngoại trừ Jokers) liền kề với một trong các giá trị liền kề (một cao hơn hoặc thấp hơn theo thứ tự này, A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A. Lưu ý rằng Ace không thể liền kề với 2 hoặc King).
  • The Jokers có thể ở bất kỳ vị trí nào.

Các thẻ được thể hiện dưới dạng một giá trị (A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K), theo sau là một bộ đồ (C, D, H, S). Ví dụ: 'AS' là Ace of Spades. The Jokers được đại diện bởi một chữ cái J.

  • Viết một số mã để cho biết một mảng thẻ có phải là Super Shuffle ™ hay không.
  • Sử dụng bất kỳ ngôn ngữ nào bạn thích.
  • Cố gắng làm như vậy trong số byte nhỏ nhất.

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

1: Đây là Tuyệt vời ™

[
  "AS", "5D", "9H", "KC", "2D", "6H", "10C", "QS", "3H", "7C", "9S", 
  "KD", "4C", "6S", "10D", "AC", "3S", "7D", "JH", "J", "4D", "8H", 
  "QC", "AD", "5H", "9C", "JS", "2H", "6C", "8S", "QD", "3C", "5S", 
  "9D", "KH", "2S", "6D", "10H", "J", "3D", "7H", "JC", "KS", "4H", 
  "8C", "10S", "AH", "5C", "7S", "JD", "2C", "4S", "8D", "QH"
]

# true

2: Đây là tất cả được sắp xếp

[
  "AS", "2S", "3S", "4S", "5S", "6S", "7S", "8S", "9S", "10S", "JS", "QS", "KS", 
  "AD", "2D", "3D", "4D", "5D", "6D", "7D", "8D", "9D", "10D", "JD", "QD", "KD", 
  "AH", "2H", "3H", "4H", "5H", "6H", "7H", "8H", "9H", "10H", "JH", "QH", "KH", 
  "AC", "2C", "3C", "4C", "5C", "6C", "7C", "8C", "9C", "10C", "JC", "QC", "KC", 
  "J", "J"
]

# false

3: Ách với nhau

[
  "AC", "AS", "AD", "AH", "5D", "9H", "KC", "2D", "6H", "10C", "QS",
  "9S", "KD", "4C", "6S", "10D", "3S", "7D", "JH", "J", "4D", "8H", 
  "QC", "5H", "9C", "JS", "2H", "6C", "8S", "QD", "3C", "5S", "3H", 
  "9D", "KH", "2S", "6D", "10H", "J", "3D", "7H", "JC", "KS", "4H", 
  "8C", "10S", "5C", "7S", "JD", "2C", "4S", "8D", "7C", "QH"
]

# false

4: Điên 8

[
  "AS", "5D", "9H", "KC", "2D", "6H", "10C", "QS", "3H", "7C", "9S", 
  "KD", "4C", "6S", "10D", "AC", "3S", "7D", "JH", "J", "4D", "AH",
  "QC", "AD", "5H", "9C", "JS", "2H", "6C", "QD", "3C", "5S", "10S", 
  "9D", "KH", "2S", "6D", "10H", "J", "3D", "7H", "JC", "KS", "4H", 
  "5C", "7S", "JD", "2C", "4S","QH", "8D", "8S", "8C", "8H"
]

# false

5: Cũng tuyệt vời

[
  "AS", "6H", "9S", "AC", "4D", "9C", "QD", "2S", "7H", "10S", "2C", 
  "5D", "10C", "KD", "3S", "8H", "JS", "3C", "6D", "JC", "AH", "4S", 
  "9H", "QS", "4C", "7D", "QC", "2H", "5S", "10H", "KS", "5C", "8D", 
  "KC", "3H", "6S", "JH", "AD", "6C", "9D", "J", "4H", "7S", "QH", 
  "2D", "7C", "10D", "J", "5H", "8S", "KH", "3D", "8C", "JD"
]

# true

6: Ace 2

[
  "AS", "2S", "6H", "9S", "AC", "4D", "9C", "QD",  "7H", "10S", "2C", 
  "5D", "10C", "KD", "3S", "8H", "JS", "3C", "6D", "JC", "AH", "4S", 
  "9H", "QS", "4C", "7D", "QC", "2H", "5S", "10H", "KS", "5C", "8D", 
  "KC", "3H", "6S", "JH", "AD", "6C", "9D", "J", "4H", "7S", "QH", 
  "2D", "7C", "10D", "J", "5H", "8S", "KH", "3D", "8C", "JD"
]

# false

7: Ace của vua

[
  "AS", "KH", "2S", "6H", "9S", "AC", "4D", "9C", "QD",  "7H", "10S", 
  "2C", "5D", "10C", "KD", "3S", "8H", "JS", "3C", "6D", "JC", "AH", 
  "4S", "9H", "QS", "4C", "7D", "QC", "2H", "5S", "10H", "KS", "5C",  
  "8D", "KC", "3H", "6S", "JH", "AD", "6C", "9D", "J", "4H", "7S", 
  "QH", "2D", "7C", "10D", "J", "5H", "8S", "3D", "8C", "JD"
]

# false

8: Joker cùng nhau

[
  "AS", "5D", "9H", "KC", "2D", "6H", "10C", "QS", "3H", "7C", "9S",
  "KD", "4C", "6S", "10D", "AC", "3S", "7D", "JH", "J", "J", "4D",
  "8H", "QC", "AD", "5H", "9C", "JS", "2H", "6C", "8S", "QD", "3C",
  "5S", "9D", "KH", "2S", "6D", "10H", "3D", "7H", "JC", "KS", "4H",
  "8C", "10S", "AH", "5C", "7S", "JD", "2C", "4S", "8D", "QH"
]

# true

9: Bộ đồ / giá trị liền kề cách nhau bởi Jokers

[
  "AS", "6H", "9S", "AC", "4D", "J", "4H", "2S", "7H", "10S", "2C",
  "5D", "10C", "KD", "3S", "8H", "JS", "3C", "6D", "JC", "AH", "4S",
  "9H", "QS", "4C", "7D", "QC", "2H", "5S", "10H", "KS", "5C", "8D",
  "KC", "3H", "6S", "JH", "AD", "6C", "9D", "J", "QD", "7S", "QH",
  "2D", "7C", "10D", "8C", "5H", "8S", "KH", "3D", "9C", "JD"
]

# true 

2
Nếu bất kỳ thẻ đang thiếu, đó không phải là một tuyệt vời ngẫu nhiên " - Boo-Đỉnh để xác nhận đầu vào!
Shaggy

Cá nhân tôi đồng ý với @Arnauld và Shaggy. Một thách thức xác nhận hai điều này của bộ bài 54 lá được xáo trộn: 1. Không có phần phụ của cùng một bộ đồ. 2. Không có giá trị phụ nào giống nhau, một giá trị thấp hơn hoặc một giá trị cao hơn có vẻ như là một thách thức tốt. Nếu chúng ta cũng nên xác nhận: Có chính xác 54 thẻ (không quá ít hoặc quá nhiều); là tất cả các thẻ trong định dạng chính xác; không có đầu vào ASCII kỳ lạ; không có chuỗi trống; không có thẻ trùng lặp; vv vv có vẻ như quá mức đối với cá nhân tôi.
Kevin Cruijssen

@KevinCruijssen Tôi đã bỏ lỡ cái đó
AJFaraday

2
Trình tự như 4D, J, 3Dhoặc J, JScũng có thể dẫn đến âm tính giả.
Arnauld

@Arnauld Ah, shit .. Có một giải pháp mà tôi sắp đăng, nhưng nó thực sự thất bại cho 4D, J, 3D..
Kevin Cruijssen

Câu trả lời:


9

JavaScript (ES7), 88 byte

Trả về true cho Super ™ hoặc sai cho Ugly ™.

a=>a.every(r=s=([a,b,c])=>!s|!b|!((r-(r='34567891JQKA'.search(a)))**2%13<2|s==(s=c||b)))

Hãy thử trực tuyến!

Làm sao?

Mỗi thẻ được chia thành 3 ký tự a , bc , một số trong đó có thể không được xác định .

Thứ hạng được cho bởi vị trí của a trong chuỗi "34567891JQKA" ( '2' cho -1 ). Bộ đồ được đưa ra bởi b cho tất cả các thẻ trừ 10, thay vào đó chúng tôi cần kiểm tra cJokers có bộ đồ không xác định .

Chúng tôi theo dõi thứ hạng trước trong r và bộ trước đó trong s .

(r-new_rmộtnk)2mod13

  • 0
  • 11
  • 11441441(mod13)
  • 1

Chúng tôi chỉ đơn giản so sánh bộ đồ mới với s để phát hiện bộ đồ liên tiếp giống hệt nhau.

Chúng tôi sử dụng biểu thức ! S | ! b để phát hiện ra rằng thẻ trước hoặc thẻ hiện tại là Joker , trong trường hợp đó, kết quả của các thử nghiệm khác sẽ bị loại bỏ.


2
Chắc chắn là xấu xí ™;)
AJFaraday

4

Võng mạc 0.8.2 , 68 byte

.*,(.*)
$1,$&
J\b
--
10
T
\b\w
$&$&
T`Ao`2-9TJQKA`\b.
(\w).{2,4}\1.*

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Đầu ra 0nếu tuyệt vời, 1nếu không. Giải trình:

.*,(.*)
$1,$&

Sao chép thẻ cuối cùng vào đầu để mô phỏng bao quanh.

J\b
--

Thay thế các trò đùa bằng các trình giữ chỗ hai ký tự, đủ để đảm bảo rằng các thẻ xung quanh không khớp với nhau.

10
T

Và thay 10s bằng hàng chục.

\b\w
$&$&

Nhân đôi thứ hạng của mỗi thẻ.

T`Ao`2-9TJQKA`\b.

Tính thứ hạng liền kề.

(\w).{2,4}\1.*

Tìm kiếm các thẻ liền kề của cùng một bộ đồ hoặc cùng cấp hoặc liền kề.


3

Java 10, 246 210 205 178 170 byte

d->{var r=1>0;int p=-1,P=p,q,u;for(var c:d)r&=p<0|(u=(p-(p=(q=c.length())<2?-1:"A234567891JQK".indexOf(c.charAt(0))))%12)<-1|u>1&P!=(P=q<2?p:c.charAt(q>2?2:1));return r;}

Hãy thử trực tuyến.

Giải trình:

d->{                   // Method with String-array parameter and boolean return-type
  var r=1>0;           //  Result-boolean, starting at true
  int p=-1,            //  Previous value, starting at -1
      P=p,             //  Previous suit, starting at -1
      q,u;             //  Temp integers
  for(var c:d)         //  Loop over the cards of the input-deck:
    r&=p<0             //   Validate whether the previous value is -1
       |(u=(p-         //   Or if the difference between the previous and current value,
          (p=          //   where the current value is:
                       //   (and replace the previous with the current value for the next
                       //   iteration at the same time)
             (q=c.length())<2?
                       //    Is it a Joker:
               -1      //     Use -1
              :        //    Else:
               "A234567891JQK".indexOf(c.charAt(0))
                       //     Use 0-12 depending on the order
        ))%12)         //   (Modulo-12 for 'A' and 'K')
              <-1|u>1  //   is more than 2
       &P!=            //   And the previous and current suits are not equal,
           (P=         //   where the current suit is:
                       //   (and replace the previous with the current suit for the next
                       //   iteration at the same time)
              q<2?     //    Is it a Joker:
               p       //     Use -1
              :        //    Else:
               c.charAt(q>2?2:1));
                       //     Use the suit-character
                       //     where the `q>2?2:1` is for cards of value 10
  return r;}           //  Return if all validations inside the loop have succeeded

3

Python 2 , 108 byte

lambda l:all('J'in(a,b)or(q(a[0])-q(b[0])+1)%13>2<a[-1]!=b[-1]for a,b in zip(l,l[1:]))
q='234567891JQK'.find

Hãy thử trực tuyến!


Python 3 , 109 byte

lambda l:all([(q(a[0])-q(b[0])+1)%13*(A!=B)>2for(*a,A),(*b,B)in zip(l,l[1:])if a>[]<b])
q='234567891JQK'.find

Hãy thử trực tuyến!

Python 3 thắng byte với giải nén lặp nhưng mất byte bằng cách từ chối xâu chuỗi các so sánh với nhau của các mục được gõ khác nhau. Việc giải nén cần xử lý cả hai 'J''10S', có nghĩa là nó có thể trích xuất giá trị đầu tiên hoặc giá trị cuối cùng, nhưng không phải cả hai.


2

Ruby , 123 byte

->a{a.each_cons(2).all?{|a,b|a==?J||b==?J||(s="A234567891JQK".chars).zip(s.rotate).all?{|f|((a.chars|b.chars)-[?0]-f)[2]}}}

Hãy thử trực tuyến!

Giải trình:

Không đi sâu vào chi tiết:

  • chia mỗi cặp thành các ký tự đơn
  • xóa '0' nếu có
  • xóa các ký tự trùng lặp
  • cố gắng loại bỏ các cặp giá trị liền kề

Nếu sau khi điều trị, 3 ký tự còn lại, cặp đôi là tốt.


2

Trăn 3, 130 125 byte

5 byte được lưu nhờ Chas Brown

v="A234567891JQK".find;s=lambda d:len(d)<2or("J"in d[:2]or 1<abs(v(d[0][0])-v(d[1][0]))<12and d[0][-1]!=d[1][-1])and s(d[1:])

Bài viết đầu tiên của tôi ở đây, vì vậy điều này có thể có thể được đánh golf xuống một chút nữa.

Giải trình

Lambda đệ quy; kiểm tra xem hai thẻ đầu tiên của danh sách hiện tại có phù hợp với nhau không, có cấp bậc khác nhau và thứ hạng của chúng khác nhau nhiều hơn 1 (nhưng nhỏ hơn 12, để chiếm Ace-King) hoặc nếu một trong hai thẻ là một Joker, trong trường hợp đó là tốt, sau đó tiêu thụ phần tử đầu tiên của danh sách và đệ quy.


1
Lưu 5 byte bằng cách thay thế v="A234567891JQK"bằng v="A234567891JQK".find; sau đó bạn có thể sử dụng abs(v(d[0][0])-v(d[1][0]). Ngoài ra, chào mừng bạn đến với PPCG! Câu trả lời đầu tiên tốt đẹp.
Chas Brown

@ChasBrown Ah, bắt tốt. Cảm ơn!
nthistle

@nthistle Chuyển đổi thứ tự logic Boolean sẽ tiết kiệm một byte
mbomb007


1

Ruby , 119 byte

f=->s,c=20,d=?Z{a,*b=s;a ?(x=a[-1];x==?J||(e=((i="A234567891JQK".index(a[0]))-c)%13;e>1&&e<12)&&x!=d)&&f[b,i||20,x]:!p}

Hãy thử trực tuyến!

Phiên bản đệ quy.
Nó đi qua mảng và so sánh thẻ hiện tại với thẻ cuối cùng. Thứ hạng được tìm kiếm trong chuỗi "A234567891JQK" và những người thích đùa bị bỏ qua. Nó bắt đầu với một thẻ giả "20Z" trước đó sẽ chấp nhận bất kỳ người hàng xóm nào.


Nếu thẻ 20Z có thể chấp nhận bất kỳ người hàng xóm nào, thì đó có phải là quy tắc giống như quy tắc dành cho Jokers không? Bạn có thể cắt hai byte bằng cách biến nó thành một trò đùa?
AJFaraday

Trên thực tế, những người thích đùa được tạo ra để có thứ hạng 20 và màu "J", vì vậy tôi có thể thay đổi từ đầu tiên? Z thành? J nhưng tôi không chắc mình có thể lưu byte. Xử lý trường hợp cạnh có hai trò đùa liên tiếp buộc tôi phải kiểm tra rõ ràng cho "J"
crashoz

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.