Profesor di MIT membutuhkan AP!


14

Trik sulap 5 kartu melibatkan pesulap yang asistennya memberi mereka 4 kartu yang ditunjukkan dan yang tersembunyi, dalam urutan ini, dan pesulap harus menebak yang tersembunyi.

PERINGATAN: Solusi di bawah ini! Tinggalkan sekarang atau manja dengan itu.


Solusinya

Kuncinya di sini adalah bahwa lima kartu diberikan dalam urutan tertentu !

c1,...,c5 adalah 5 kartu dalam urutan yang diberikan.

xn adalah nomor kartu dalam (urutan nomor).cnNO=[A,2,3,4,5,6,7,8,9,T,J,Q,K]

a+b , di mana adalah nomor kartu dan adalah bilangan bulat, sama dengan nomor kartu langkah ke kanan dalam , membungkus dengan awal jika perlu.abbaNO

sn adalah setelan dalam (urutan pesanan).cnSO=[,,,]

ab , di mana adalah nomor kartu dan adalah jas, menunjukkan kartu dengan nomor kartu dan jas .abab

a<b , di mana dan adalah kartu, benar jika 's jas adalah ke kiri dari ' s gugatan di , atau pakaian mereka adalah sama dan 's nomor kartu adalah ke kiri dari ' s kartu nomor dalam .ababSOabNO

a>b , di mana dan adalah kartu, benar jika salah.aba<b

PI(a,b,c) , di mana , dan adalah kartu, adalah indeks permutasi dari urutan ini, yang ditentukan oleh tabel di bawah ini:abc
ComparisonPI(a,b,c)a<b<c1a<b>c>a2a>b<c>a3a<b>c<a4a>b<c<a5a>b>c6

Solusi untuk 5-kartu trik sulap adalah masalah adalah:

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

Tantangan

Sejauh ini baik. Namun, melakukan perhitungan yang ditentukan di atas sudah diminta di sini . Sebaliknya, tantangan Anda adalah, mengingat 5 kartu tanpa urutan tertentu, untuk memesannya dengan benar. Ini berarti bahwa empat kartu pertama dalam output akan mewakili yang kelima. Dengan kata lain, jadilah asisten. Persyaratan:

  • s5=s1 .
  • x5=x1+PI(c2,c3,c4) (artinya, ini harus dimungkinkan).

Contoh

Mari kita pertimbangkan set 7H,2D,6D,5C,6C. Pertama-tama, kami mengambil 25 pasangan:

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

Kemudian, kami jelas menghapus 5 pasang yang berisi kartu yang sama dua kali, mereka tidak ada dalam satu dek:

      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      

Setelah itu, karena jas harus sama, setelan yang berbeda pada pasangan adalah tidak-tidak:

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

Akhirnya, kami memeriksa apakah mungkin untuk beralih dari kartu pertama ke kartu kedua dengan menambahkan paling banyak 6, menghilangkan setengah dari pasangan yang tersisa:

                             
            2D, 6D            

                        5C, 6C
                             

Sekarang kami memiliki pasangan yang valid: 2D,6Ddan 5C,6C. Kartu pertama dari setiap pasangan adalah kartu 1, sedangkan yang terakhir adalah kartu 5.

Kita akan pergi dengan di 5C,6Csini untuk kemudahan. Seluruh set adalah 7H,2D,6D,5C,6C, jadi, mengeluarkan 2 kartu dari pasangan yang kami pilih, kami miliki 7H,2D,6D. Kartu-kartu ini akan mewakili 6 - 5 = 1, jadi kami harus memesannya seperti "min, mid, max". 7H > 2D < 6D < 7H, atau sederhananya 2D < 6D < 7H, jadi sekarang kita miliki 2D,6D,7H.

Langkah terakhir adalah menyatukan semua ini, jadi hasilnya adalah 5C,2D,6D,7H,6C.

Klarifikasi

  • Anda dapat menggunakan 10sebagai gantinya T.
  • Anda dapat menggunakan salah satu ♠♥♦♣, ♤♡♢♧atau ♠♡♢♣bukan CDHS, masing-masing.
  • Ini , kode terpendek yang menang.

Uji kasus

Anda dapat mengeluarkan satu atau beberapa solusi valid yang disertakan untuk setiap test case.

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

Mungkin lebih mudah untuk memvisualisasikan permutasi dengan menambahkan kolom Contoh .
Arnauld


Seberapa lunak input? Apakah tupel nomor kartu dan rumah bukan panjang-2 string dapat diterima?
Surous

@ Οurous Itu tidak ditentukan dalam tantangan; selama itu masuk akal (dalam kasus Anda, itu tampaknya cukup masuk akal), itu diperbolehkan.
Erik the Outgolfer

Jawaban:


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

Cobalah online!

Bagaimana?

Mengidentifikasi dan membandingkan nomor kartu

Fungsi helper g mengembalikan indeks yang menunjukkan jumlah kartu yang diberikan.

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

101022

ab"NS"

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

Menghasilkan permutasi dari input

120apABCDE

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

699

Menguji jasnya

Tes jelas pertama adalah memastikan bahwa kartu pertama dan terakhir dari jenis yang sama. Kami menolak permutasi jika mereka tidak sama.

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

Menguji jarak

Kami menghitung jarak antara nomor kartu pertama dan nomor kartu terakhir dengan:

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

BCD

Tes ini bergantung pada cara sort()algoritma Node.js bekerja.

sort()[SEBUAH,B,C]

  1. SEBUAHB
  2. SEBUAHC
  3. BC

Mari kita pertimbangkan kode berikut:

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

SEBUAH<B1<2SEBUAH<C1<3B<C2<3k23k=8

Sekarang, jika kita lakukan:

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

k=15

Setiap permutasi menghasilkan bitmask unik, yang dipetakan ke jarak unik:

 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

Menyatukan semuanya, kami memiliki tes berikut:

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

Cobalah online!

-12 byte terima kasih kepada Eric the Outgolfer
-14 byte dengan menghapus daftar pemahaman


0

Bersih , 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

Cobalah online!

Sebagai fungsi tersusun :: [[Char]] -> [[Char]],, dengan beberapa pembantu.

Diperluas:

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

Cobalah online!

Fungsi lambda mengambil array kartu sebagai string

Berkomentar

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

Jelly , 41 byte

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

Tautan monadik yang menerima daftar daftar karakter yang mengembalikan daftar semua pengaturan yang valid dalam format yang sama.

Cobalah online! (footer memformat hasilnya sebagai kisi untuk menghindari cetak smashing implisit seperti yang dilakukan oleh kode Link ketika dijalankan sebagai program lengkap)

Atau lihat test-suite .

Saya memiliki kecurigaan yang menyelinap pendekatan lain akan jauh lebih singkat. Saya harus meninjau kembali tantangan ini nanti!

... hmm, saya punya colekan lain dan mendapat 41 byter lainnya ( tes ):

O¹*@<74$?€€29%⁽:0%⁴UµṪ_Ḣ%13Ḍ⁼Ụ3R¤œ¿Ɗ
Œ!ÇƇ
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.