Tugas ini diambil dari kuliah MIT oleh Prof. Devadas bernama You can read mind . Penjelasan terperinci tentang trik ini dapat ditemukan di video yang ditautkan, atau dalam dokumen ini . Saya akan mencoba menjelaskannya secara lebih sederhana.
Ternyata ini diciptakan pada tahun 1930-an, dan dikenal sebagai "Trik Lima Kartu Fitch Cheney" .
Caranya seperti ini:
- Lima kartu acak dipilih dari setumpuk kartu. Penonton dan asisten Anda dapat melihat mereka, tetapi Anda tidak melihatnya.
- Asisten Anda (dengan siapa Anda telah berlatih) akan memilih empat kartu itu dan menunjukkannya kepada Anda dalam urutan tertentu. Perhatikan bahwa kartu yang tersembunyi tidak diambil secara acak dari 5 kartu. Asisten mengambil kartu yang akan membuat trik bekerja.
- Anda akan menyimpulkan, berdasarkan informasi yang Anda dapat kumpulkan dari empat kartu apa kartu kelima itu.
Bagaimana?
Ingatlah dua hal berikut:
Saat memilih 5 kartu acak, Anda dijamin bahwa setidaknya dua kartu memiliki jenis kartu yang sama 1 .
Gambar di bawah ini menunjukkan lingkaran dengan semua peringkat 2 . Karena itu lingkaran, dimungkinkan untuk menghitung: J, Q, K, A, 2, 3 (yaitu penghitungan modular). Anda dijamin bahwa kartu yang disembunyikan tidak memiliki peringkat yang sama dengan yang pertama, karena mereka akan memiliki kartu yang sama (dijelaskan di bawah). Selalu dimungkinkan untuk memilih kartu pertama dan kartu tersembunyi sedemikian rupa sehingga kartu tersembunyi berada di antara peringkat 1 dan 6 lebih tinggi daripada yang pertama (saat menghitung dalam lingkaran). Jika kartu pertama adalah 1 , maka kartu yang disembunyikan adalah 2,3,4,5,6 atau 7 . Jika kartu pertama adalah J , maka kartu yang disembunyikan adalah Q, K, A, 2,3 atau 4 dan seterusnya.
Algoritma:
Kartu pertama: Kartu ini memiliki jenis yang sama dengan kartu tersembunyi. Kartu tersebut juga akan menjadi titik referensi yang akan Anda gunakan ketika mencari tahu peringkat kartu yang tersembunyi.
Kartu ke-2, ke-3 dan ke-4 menerjemahkan nilai dalam rentang inklusif 1 ... 6 . Kami akan memanggil tiga kartu S, M, L (kartu terkecil, kartu tengah, kartu terbesar). Nilai-nilai akan dikodekan seperti ini (urutan leksikografis):
S M L -> 1
S L M -> 2
M S L -> 3
M L S -> 4
L S M -> 5
L M S -> 6
Jadi, jika peringkat kartu pertama adalah 5 , dan tiga kartu sisanya memiliki peringkat 4 Q 7 (mereka memesan SLM ), maka kartu terakhir memiliki peringkat 5 + 2 = 7 . Anda dapat memilih apakah kartu as harus merupakan kartu tertinggi atau terendah, asalkan konsisten.
Jika beberapa kartu berbagi peringkat, maka suit akan menentukan urutan, di mana C <D <H <S .
Masukkan format:
Keempat kartu akan diberikan sebagai H3 (tiga hati), DK (Raja berlian) dan sebagainya. Anda dapat memilih untuk mengambil input sebaliknya sebagai 3H dan KD sebagai gantinya.
Masukan bisa dalam format apa pun yang mudah, tetapi Anda tidak dapat menggabungkan daftar pakaian dalam satu variabel dan daftar peringkat di yang lain. 'D5', 'H3' ..
dan [['D',5],['H',3] ...
keduanya OK, tetapi 'DHCH',[5,3,1,5]
tidak. Anda tidak dapat menggunakan angka alih-alih huruf, kecuali untuk T .
Keluaran
Kartu tersembunyi, dalam format yang sama dengan input.
Contoh
Mari kita lakukan langkah-langkah:
Input:
D3 S6 H3 H9
Kita tahu kartu yang disembunyikan adalah berlian, karena kartu pertama adalah berlian. Kita juga tahu bahwa peringkatnya adalah 4,5,6,7,8 atau 9 karena peringkat kartu pertama adalah 3 .
Kartu yang tersisa dipesan 6,3,9 ==> M, S, L , yang mengkodekan nilai 3 . Karenanya, kartu tersembunyi adalah 3 + 3 = 6 berlian, sehingga hasilnya harus D6 .
Kasus uji:
C3 H6 C6 S2
C9 # The order is LMS (H6 > C6, and 2 < 6). 3+6=9
SQ S4 S3 ST # (ST = S10. Format is optional)
S2 # The order is MSL. 12+3=2
HA CA DA SA
H2 # The order is SML. 14+1=2
Ini adalah kode-golf , sehingga solusi terpendek dalam setiap bahasa menang. Penjelasan didorong!
1 Ada empat setelan ( C lubs, D iamonds, H earts dan S pades).
2 Ada 13 jajaran, 2,3,4,5,6,7,8,9,10, J, Q, K, A . Anda dapat memilih untuk menggunakan T daripada 10 .
sumber
92427**3
dan modifikasik+7
untukk+8
menghemat 1 byte:a=>(k='A23456789TJQK'+92427**3)[[[r,s],...x]=a.map((c,i)=>[k.search(c[0])+10,c[1],i]),(r-k[x.sort().map(c=>k=k*2|c[2])|k+8])%13]+s
187**97
dank+15
juga berfungsi, tapi saya cukup yakin itu hanya dua set yang lebih pendek untuk algoritma ini.1/34547
dengank+14
juga berfungsi.Python 2 ,
143140138136127125124123121 byteCobalah online!
Aces tinggi
Encode ketiga kartu dengan menemukan posisinya di daftar kartu yang diurutkan (
0=smallest, 1=middle, 2=largest
):Ini dikonversi menjadi bilangan bulat di basis 3 dan dikalikan dengan 3, dan dibagi dengan 10:
Pengkodean yang berbeda adalah:
Disimpan:
sumber
3
itu pintar! Jawaban yang bagus :)0
sampai akhir dan membaginya dengan 10, yang terlihat setara.Jelly , 33 byte
Cobalah online!
Penjelasan
Baris pertama adalah niladik. Ini menghasilkan daftar 52 kartu
Di tautan utama,
¢
panggil hasil dari tautan pertama yang merupakan daftar kartu.sumber
1
untuk kartu as.APL (Dyalog Unicode) , 49 byte SBCS
Cobalah online!
Ikhtisar:
'CDHS'∘.,2↓⎕D,'TJQKA'
menghasilkan produk luar, jadi matriks 2d dengan(C2 C3 C4 ...), (D2 D3 D4 ...), ...
. Kami kemudian memindahkan matriks ini untuk mendapatkan(C2 D2 H2 ...), ...
dan kemudian meratakannya.Berkat @ngn untuk
2-⌊1.8⊥
, yang mengambil urutan kartu (SML = 1 2 3) dan menilai mereka (seperti 1 hingga 6 di OP).Penjelasan kode:
sumber
Retina ,
218208 byteCobalah online!
Penjelasan:
Menggantikan Aces, Jacks, Queens dan Kings dengan 1, 11, 12 dan 13. Dua baris pertama mendahului a
1
sebelum huruf, dan yang terakhir mentransliterasikan digit kedua.The
*
menunjukkan bahwa tahap ini tidak harus memodifikasi string bekerja. Ini mungkin membuat panggung tampak tidak ada gunanya, tetapi akan bermanfaat nantinya. The'
membagi string bekerja di setiap ruang, danG0
mengambil yang pertama (sehingga menemukan kartu pertama).Dua baris pertama mengalikan angka pada kartu dengan 5, kemudian mengubahnya menjadi unary (misalnya, 5 diwakili sebagai _____), sehingga kita dapat menambahkan jumlah yang lebih kecil untuk jas nanti. Baris terakhir terbagi menjadi spasi dan menyimpan tiga kartu terakhir.
Ini mengkonversi Clubs, Diamonds, Hearts and Spades menjadi 0, 1, 2 dan 3 masing-masing, dan mengubah angka menjadi unary. Karena sekarang terpasang pada bagian nomor kartu, itu akan memberikan nilai unik untuk kartu, menentukan seberapa tinggi kartu itu.
Ini menemukan urutan kartu, dan nilai yang ditambahkan ke kartu pertama. Misalnya, pada baris pertama
/^(_+)¶\1_+/(
cocok dengan pesanan yang memiliki nilai tengah lebih besar dari nilai pertama. Ini membuat loop if-else untuk apa yang harus dilakukan (karena pesanan ini cocok dengan permutasi 1, 2 dan 4).K
menandai sebuah konstanta.Ingat sebelumnya ketika kami
*
menunjukkan bahwa sebuah panggung tidak akan memengaruhi string yang berfungsi? Di sinilah kita menggunakannya. Tahap ini adalah tahap penggantian; itu menggantikan nomor untuk ditambahkan$+3-$&
.$+3
mengakses*
panggung, dan mendapatkan kartu dan nomor kartu pertama,-
bertindak sebagai pemisah, dan$&
merupakan pasangan. Jadi string yang bekerja sekarang{suit}{original number}-{number to add}
Ini mengubah dua angka menjadi unary dan menambahkannya bersama.
Baris teratas menangkap baik angka atau angka - 13 (sehingga kita tidak mendapatkan output misalnya S16). Intinya mengubah nomor yang ditangkap kembali menjadi basis 10, dan hasilnya dicetak secara implisit.
sumber
Arang ,
6462 byteCobalah online! Tautan adalah untuk mengucapkan versi kode. Gunakan
T
untuk 10 dan jenisA
tinggi. Indeks permutasi tidak mudah diterjemahkan; urutan permutasi yang berbeda akan menyelamatkan saya setidaknya tiga byte. Penjelasan:Tambahkan 2 ke semua bilangan bulat 0 hingga 7, lalu konverente dan sufiks
TJQKA
untuk kartu gambar dan kartu as. Ini menghemat 2 byte lebih dari string literal, meskipun ternyata memilikiA
tinggi akan menyimpan byte melalui kompresi string.Peta di atas kartu dan jas, menyatukan keduanya. Karena ini biasanya akan menghasilkan array bersarang, hasilnya malah digabungkan menjadi satu string yang kemudian dipisah menjadi pasangan karakter lagi.
Temukan posisi kartu kedua, ketiga dan keempat.
Hitung indeks permutasi 1-diindeks. Dua permutasi pertama memiliki kartu terkecil pertama; ini diuji melalui
⌕υ⌊υ
. Dua pasang permutasi lainnya dibedakan apakah kartu terbesar adalah yang pertama; ini diuji melalui⌕υ⌈υ
. Operasi logis dan aritmatika kemudian memetakan tes ini ke nilai-nilai0
,2
dan4
; ini kemudian ditingkatkan dengan1
tergantung pada perbandingan antara kartu ketiga dan keempat, diuji melalui‹⊟υ⊟υ
. Akhirnya indeks bertambah untuk memberikan pengkodean yang diinginkan.Lipatgandakan dengan 4 repesenting jarak antara kartu dengan jenis yang sama, tambahkan pada posisi kartu pertama, dan indeks secara siklis dan cetak hasilnya.
sumber
Python 2 , 147 byte
Cobalah online!
sumber
Pyth, 42 byte
Jelek banget...
Cobalah online: Demontration atau Test Suite
sumber
J , 68 byte
Cobalah online!
Catatan: -3 off byte TIO karena
f=.
tidak dihitung. Akan berusaha bermain golf lebih lanjut dan menambahkan penjelasan besok.sumber
JavaScript (Node.js) , 124 byte
Cobalah online!
JavaScript (Node.js) , 125 byte
Cobalah online!
sumber
T-SQL, 211 byte
Input adalah variabel tabel. Menggunakan T untuk 10, ace rendah
Format untuk peringkat kartu / kartu KH, 6D, TS
Cobalah secara online ungolfed
Perhatikan bagaimana nilai SML (12-17) dihitung:
Secara logis S, M, L (1,2,3) dikonversi ke nilai numerik
Dengan mengalikan dengan 3, akar kuadrat dibulatkan menjadi angka berurutan yang bagus.
sumber
05AB1E , 37 byte
Port jawaban Jelly @dylnan , tapi sayangnya 05AB1E tidak memiliki indeks permutasi yang dibangun ..
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
Lihat tip tambang 05AB1E ini (bagian Bagaimana mengompresi string bukan bagian dari kamus? ) Untuk memahami mengapa
.•3u§•
ini"jqka"
dan.•ôì•
itu"cdhs"
.sumber