Giáo sư tại MIT cần một AP!


14

Trò ảo thuật gồm 5 lá bài liên quan đến một pháp sư có trợ lý đưa cho họ 4 lá bài được hiển thị và một lá bài ẩn, theo thứ tự này, và ảo thuật gia phải đoán được lá bài ẩn.

CẢNH BÁO: Giải pháp dưới đây! Để lại bây giờ hoặc được hư hỏng với nó.


Giải pháp

Mẹo ở đây là năm thẻ được đưa ra theo một thứ tự cụ thể !

c1,...,c5 là 5 thẻ theo thứ tự nhất định.

xnc n là số thẻ của theo N O = [ A, 2,3,4,5,6,7,8,9, T, J, Q, K ] (thứ tự số).cnNÔi= =[A, 2,3,4,5,6,7,8,9, T, J, Q, K]

một+b , trong đólà số thẻ vàlà số nguyên, bằng sốbướcthẻở bên phải củatrong, gói vào đầu nếu cần.mộtbbmộtNÔi

Sn là bộ quần áo của trong SO = [\ clubuit, \ diamondsuit, \ Heartsuit, \ spadesuit] (thứ tự phù hợp).cnSO=[,,,]

aba b a b , trong đó là số thẻ và là phù hợp, biểu thị thẻ có số thẻ và phù hợp .abab

a<ba b a b S O a b N O , nơi và là thẻ, là đúng nếu 's phù hợp là bên trái của ' s phù hợp trong , hoặc bộ quần áo của họ đều bình đẳng và 's số thẻ là ở phía bên trái của ' s thẻ số trong .ababSOabNO

a>ba b a < b , trong đó và là thẻ, là đúng nếu sai.aba<b

PI(a,b,c)a b , trong đó , và c là thẻ, là chỉ số hoán vị của thứ tự này, được chỉ định bởi bảng dưới đây: So sánh P I ( a , b , c ) a < b < c 1 một < b > c > một 2 một > b < c > một 3 một < b > c < một 4 một > b <abc
ComparisonPI(a,b,c)a<b<c1a<b>c>a2a>b<c>a3a<b>c<a4a>b<c<a5a>b>c6

Giải pháp cho trò ảo thuật 5 thẻ là vấn đề là:

c5=(x1+PI(c2,c3,c4))s1

Các thách thức

Càng xa càng tốt. Tuy nhiên, thực hiện tính toán được chỉ định ở trên đã được yêu cầu ở đây . Thay vào đó, thử thách của bạn là, đưa ra 5 thẻ không theo thứ tự cụ thể, để sắp xếp chúng đúng cách. Điều này có nghĩa là bốn thẻ đầu tiên trong đầu ra sẽ đại diện cho thứ năm. Nói cách khác, hãy là trợ lý. Yêu cầu:

  • s5=s1 .
  • x5=x1+PI(c2,c3,c4) (nghĩa là điều này phải có thể).

Thí dụ

Hãy xem xét các thiết lập 7H,2D,6D,5C,6C. Trước hết, chúng tôi lấy 25 cặp:

7H,7H 7H,2D 7H,6D 7H,5C 7H,6C
2D,7H 2D,2D 2D,6D 2D,5C 2D,6C
6D,7H 6D,2D 6D,6D 6D,5C 6D,6C
5C,7H 5C,2D 5C,6D 5C,5C 5C,6C
6C,7H 6C,2D 6C,6D 6C,5C 6C,6C

Sau đó, chúng tôi rõ ràng loại bỏ 5 cặp chứa cùng một thẻ hai lần, chúng không tồn tại trong một bộ bài:

      7H,2D 7H,6D 7H,5C 7H,6C
2D,7H       2D,6D 2D,5C 2D,6C
6D,7H 6D,2D       6D,5C 6D,6C
5C,7H 5C,2D 5C,6D       5C,6C
6C,7H 6C,2D 6C,6D 6C,5C      

Sau đó, vì các bộ đồ phải giống nhau, các bộ đồ khác nhau trong một cặp là không có:

                             
            2D, 6D            
      6D, 2D                  
                        5C, 6C
                  6C, 5C      

Cuối cùng, chúng tôi kiểm tra xem có thể lấy từ thẻ đầu tiên sang thẻ thứ hai hay không bằng cách thêm tối đa 6, loại bỏ một nửa các cặp còn lại:

                             
            2D, 6D            

                        5C, 6C
                             

Bây giờ chúng ta có các cặp hợp lệ: 2D,6D5C,6C. Thẻ đầu tiên của mỗi cặp là thẻ 1, trong khi thẻ cuối cùng là thẻ 5.

Chúng tôi sẽ đi với 5C,6Cở đây cho dễ dàng. Toàn bộ tập hợp là 7H,2D,6D,5C,6C, vì vậy, loại bỏ 2 thẻ trong cặp chúng tôi đã chọn, chúng tôi có 7H,2D,6D. Các thẻ này sẽ đại diện 6 - 5 = 1, vì vậy chúng tôi phải đặt hàng chúng như "min, mid, max". 7H > 2D < 6D < 7H, hoặc đơn giản 2D < 6D < 7H, vì vậy bây giờ chúng ta có 2D,6D,7H.

Bước cuối cùng là đặt tất cả những thứ này lại với nhau, vì vậy kết quả của chúng tôi sẽ là 5C,2D,6D,7H,6C.

Làm rõ

  • Bạn có thể sử dụng 10thay vì T.
  • Bạn có thể sử dụng một trong ♠♥♦♣, ♤♡♢♧hoặc ♠♡♢♣thay vì CDHS, tương ứng.
  • Đây là , mã ngắn nhất sẽ thắng.

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

Bạn có thể xuất một hoặc nhiều giải pháp hợp lệ cho mỗi trường hợp thử nghiệm.

8S,TD,5C,QS,TS -> 8S,5C,QS,TD,TS
              ... 8S,TD,TS,5C,QS
              ... TS,5C,8S,TD,QS

JD,KH,4S,9D,8S -> 9D,KH,8S,4S,JD
              ... 4S,JD,KH,9D,8S

4H,4D,TH,KH,2C -> 4H,KH,4D,2C,TH
              ... TH,4D,2C,4H,KH
              ... KH,4D,TH,2C,4H

3S,KS,8S,KH,9H -> 9H,8S,KS,3S,KH
              ... 3S,KS,9H,KH,8S
              ... 8S,3S,9H,KH,KS
              ... KS,KH,9H,8S,3S

KH,TS,3C,7H,JD -> 7H,TS,JD,3C,KH

4C,KC,TD,JD,QS -> KC,JD,QS,TD,4C
              ... TD,4C,KC,QS,JD

AC,5H,8D,6D,8S -> 6D,AC,8S,5H,8D

AS,TC,3S,2H,9C -> 9C,2H,AS,3S,TC
              ... AS,9C,2H,TC,3S

4C,JS,AS,8H,JC -> JC,JS,AS,8H,4C
              ... JS,JC,4C,8H,AS

4H,QS,TH,QC,AC -> QC,4H,QS,TH,AC
              ... 4H,QS,QC,AC,TH

Có thể dễ dàng hơn để hình dung các hoán vị bằng cách thêm một cột Ví dụ .
Arnauld


Làm thế nào khoan dung là đầu vào? Các bộ thẻ số và nhà thay vì các chuỗi có độ dài-2 có được chấp nhận không?
21 giờ 43 phút

@ Urous Điều đó không được chỉ định trong thử thách; miễn là nó hợp lý (trong trường hợp của bạn, điều đó có vẻ đủ hợp lý), điều đó được cho phép.
Erik the Outgolfer 7/11/18

Câu trả lời:


3

Node.js , 190 186 180 byte

f=(a,p,g=c=>"A23456789TJQK".search(c[0])+10,[A,B,C,D,E]=a.sort(_=>p>>i++&1,i=0))=>A[k=1]!=E[1]|[B,C,D].sort((a,b)=>k=k*2|a[1]+g(a)>b[1]+g(b))|(k^4)%6+1-(g(E)-g(A)+13)%13?f(a,-~p):a

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

Làm sao?

Xác định và so sánh số thẻ

Hàm trợ giúp g trả về một chỉ số biểu thị số lượng thẻ đã cho.

g = c => "A23456789TJQK".search(c[0]) + 10

Chúng tôi thêm 10 để buộc hai chữ số cho tất cả các mục, để các chỉ số này có thể được sắp xếp một cách an toàn theo thứ tự từ điển. Do đó, Ace là 10 và King là 22 .

Cho 2 thẻ mộtb"NS"định dạng, chúng ta có thể so sánh chúng theo cách phù hợp đầu tiên và số thứ hai với:

a[1] + g(a) > b[1] + g(b)

Tạo hoán vị của đầu vào

120mộtpMộtBCDE

[A, B, C, D, E] = a.sort(_ => p >> i++ & 1, i = 0)

699

Kiểm tra bộ quần áo

Thử nghiệm rõ ràng đầu tiên là đảm bảo rằng các thẻ đầu tiên và cuối cùng là cùng một bộ. Chúng tôi từ chối hoán vị nếu chúng không bằng nhau.

A[k = 1] != E[1] // we also initialize k, which is used right after that

Kiểm tra khoảng cách

Chúng tôi tính khoảng cách giữa số thẻ đầu tiên và số thẻ cuối cùng với:

(g(E) - g(A) + 13) % 13

BCD

Thử nghiệm này dựa trên cách sort()thuật toán của Node.js đang hoạt động.

sort()[Một,B,C]

  1. MộtB
  2. MộtC
  3. BC

Hãy xem xét các mã sau đây:

[1, 2, 3].sort((a, b) => k = k * 2 | (a > b), k = 1)

Một<B1<2Một<C1<3B<C2<3k23k= =số 8

Bây giờ, nếu chúng ta làm:

[3, 2, 1].sort((a, b) => k = k * 2 | (a > b), k = 1)

k= =15

Mỗi hoán vị tạo ra một bitmask duy nhất, được ánh xạ tới một khoảng cách duy nhất:

 A, B, C | A>B | A>C | B>C | k  | distance
---------+-----+-----+-----+----+----------
 1, 2, 3 |  0  |  0  |  0  |  8 |    1
 1, 3, 2 |  0  |  0  |  1  |  9 |    2
 2, 1, 3 |  1  |  0  |  0  | 12 |    3
 2, 3, 1 |  0  |  1  |  1  | 11 |    4
 3, 1, 2 |  1  |  1  |  0  | 14 |    5
 3, 2, 1 |  1  |  1  |  1  | 15 |    6

k

d= =((kxor4)mod6)+1

  k | xor 4 | mod 6 | +1
----+-------+-------+----
  8 |   12  |   0   |  1
  9 |   13  |   1   |  2
 12 |    8  |   2   |  3
 11 |   15  |   3   |  4
 14 |   10  |   4   |  5
 15 |   11  |   5   |  6

Đặt mọi thứ lại với nhau, chúng tôi có bài kiểm tra sau:

[B, C, D]
.sort((a, b) =>
  k = k * 2 | a[1] + g(a) > b[1] + g(b)
)
| (k ^ 4) % 6 + 1
- (g(E) - g(A) + 13) % 13

1

Python 3 , 260 248 232 byte

N="A23456789TJQK".find
D=lambda x,y="KC":(N(y[0])+~N(x[0]))%13+15*abs(ord(x[1])-ord(y[1]))
def f(l):a,e,b,c,d=[[x,y]+sorted({*l}-{x,y},key=D)for x in l for y in l if D(x,y)<6][0];print(a,*map(eval,"bbccddcdbdbcdcdbcb"[D(a,e)::6]),e)

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

-12 byte nhờ Eric Outgolfer
-14 byte bằng cách xóa phần hiểu danh sách


0

Sạch , 225 220 209 byte

import StdEnv,Data.List
n=['A23456789TJQK':n]

filter(\[[x,s],b,c,d,e]#[p,q,r:_]=map snd(sort(zip2[(elemIndices a n,b)\\[a,b]<-[b,c,d]][1..]))
=[snd(span((<>)x)n)!!(p+if(p>q)0if(q<r)(q+r)q),s]==e)o permutations

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

Là một chức năng sáng tác :: [[Char]] -> [[Char]], với một số người trợ giúp.

Mở rộng:

n = ['A23456789TJQK': n] // infinitely repeating card number list

filter (...) o permutations // filter the permutations of the argument by ...
  \[[x, s], b, c, d, e] // deconstruct each permutation via pattern matching
    #[p, q, r: _] = ... // define p, q, r as ...
      map snd (...) // the second component of every element in ...
      sort (...) // the sorted list of ...
      zip2 ... [1..] // pairs of ... and the numbers 1, 2, 3, ..
      [... \\ [a, b] <- [b, c, d]] // ... for every pair of number a and house b in [b, c, d]
      (elemIndices a n, b) // pair of the value of that card number and the house
    = ... == e // check ... for equality against the last card
      [..., s] // ..., paired with house s
      snd (span ((<>) x) n) !! (...) // the card number ... places from x
      p + ... // this is kinda obvious
      if(p > q) 0 ... // if p is greater than q, zero, else ...
      if(q < r) (q + r) q // if q is less than r, q + r, else q

0

Ruby , 175 byte

->a{g=->j{j.tr('ATJQKCHS','1:;<=)_z').sum}
e=b=a.sort_by{|i|g[i]}
4.times{|i|(d=g[b[i+1]]-g[b[i]])<13&&(a=b[i,2];e=d)}
[a[e/7],*(b-a).permutation.to_a[e<7?e-1:12-e],a[e/7-1]]}

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

Hàm lambda lấy một mảng các thẻ làm chuỗi

Đã bình luận

->a{g=->j{j.tr('ATJQKCHS','1:;<=)_z').sum}
#helper function converts card to integer, ATJQK to 1:;<= and CHS to )_z then sum ascii values 

e=b=a.sort_by{|i|g[i]}  
#sort according to g. we declare 2 variables here in order to avoid undefined variable error at pre-interpretation check stage.

4.times{|i|(d=g[b[i+1]]-g[b[i]])<13&&(a=b[i,2];e=d)}
#compare each pair of values. if in same suit, store the pair of cards to a
#and the value difference to e. Loop exits with the last suitable pair stored

[a[e/7],*(b-a).permutation.to_a[e<7?e-1:12-e],a[e/7-1]]}
#return array containing the two cards of the same suit in the correct order
#with the correct permutation of the remaining cards (b-a) in the middle

0

Thạch , 41 byte

ØD;“TJQK”¤io2)1¦€µUḊỤ3R¤œ¿+""Om4%13E
Œ!ÇƇ

Liên kết đơn âm chấp nhận danh sách các danh sách các ký tự trả về danh sách tất cả các sắp xếp hợp lệ theo cùng định dạng.

Hãy thử trực tuyến! (chân trang định dạng kết quả dưới dạng lưới để tránh bản in bị vỡ ngầm được thực hiện bởi mã của Liên kết khi chạy dưới dạng chương trình đầy đủ)

Hoặc xem một bộ thử nghiệm .

Tôi có một nghi ngờ lén lút một cách tiếp cận khác sẽ ngắn gọn hơn nhiều. Tôi sẽ phải xem lại thử thách này sau!

... hmm, tôi đã có một cú chọc khác và có thêm 41 lượt ( kiểm tra ):

O¹*@<74$?€€29%⁽:0%⁴UµṪ_Ḣ%13Ḍ⁼Ụ3R¤œ¿Ɗ
Œ!ÇƇ
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.