Aku punya yang sulit untukmu!
Pacar saya baru-baru ini menemukan acara baru di MTV (AS). Ini adalah pertunjukan yang mengerikan, dan semua orang di dalamnya adalah sampah, tetapi "permainan" itu cukup menarik. Dari Wikipedia:
Apakah Anda Orangnya?mengikuti 20 orang yang tinggal bersama di Hawaii untuk menemukan pasangan yang cocok. Jika 10 pria dan 10 wanita dapat memilih dengan benar semua sepuluh pertandingan yang sempurna dalam sepuluh minggu, mereka akan mendapatkan $ 1 juta untuk dibagi di antara mereka.
Sekarang untuk bagian permainan (juga dari Wikipedia):
Setiap episode para pemain akan berpasangan dengan siapa yang mereka yakini sebagai pasangan sempurna mereka untuk bersaing dalam sebuah tantangan. Pemenang tantangan akan berkencan, dan memiliki kesempatan untuk menguji pertandingan mereka di stan kebenaran. Anggota pemeran akan memilih salah satu pasangan yang menang untuk pergi ke stan kebenaran untuk menentukan apakah mereka pasangan yang cocok atau tidak. Ini adalah satu-satunya cara untuk mengkonfirmasi kecocokan.Setiap episode berakhir dengan upacara pencocokan di mana pasangan akan diberitahu berapa banyak pasangan yang cocok yang mereka miliki, tetapi tidak yang cocok.
TL; DR: Ini adalah turunan Mastermind (M (10,10) untuk lebih spesifik). Aturan mainnya adalah sebagai berikut:
Anda mulai dengan 2 set 10, sebut mereka Set A: {A, B, C, D, E, F, G, H, I, J} dan Set 2: {1,2,3,4,5, 6,7,8,9,10}
Komputer menciptakan solusi (tidak terlihat oleh Anda) dalam bentuk {A1, B2, C3, D4, E5, F6, G7, H8, I9, J10}, di mana anggota di set A dipetakan 1-ke-1 untuk mengatur 2. Contoh lain dari solusi bisa {A2, B5, C10, D8, E1, F7, G6, H4, I9, J3}.
Sebelum giliran pertama Anda, Anda harus bertanya apakah satu pasangan tertentu pilihan Anda sudah benar. Pertanyaan Anda akan dalam bentuk {A1} (mis. {C8}), dan Anda menerima 1 (artinya benar) atau 0 (artinya tebakan Anda salah).
Giliran aktual pertama Anda. Anda membuat tebakan pertama Anda dalam bentuk {A1, B2, C3, D4, E5, F6, G7, H8, I9, J10}, atau permutasi pilihan Anda. Tebakan Anda tidak dapat berisi kelipatan dari setiap item yaitu tebakan {A1, A2, A3, A4, A5, B6, B7, B8, B9, B10} BUKAN tebakan yang valid. Setelah setiap belokan, komputer memberi tahu Anda jumlah kecocokan yang benar, tetapi BUKAN kecocokan mana yang benar.
Ulangi langkah 3 dan 4 sampai Anda mendapatkan setiap pertandingan yang benar (yaitu respons 10), atau sampai 10 gerakan Anda naik (mana yang lebih cepat). Jika Anda menyelesaikannya sebelum atau pada giliran 10 Anda, Anda memenangkan $ 1 juta. Kalau tidak, Anda kalah, dan beberapa orang (atau huruf dan angka) pulang sendirian untuk menghabiskan keabadian dengan 10 kucing mereka.
Ini BUKAN kontes kode terpendek. Orang yang dapat menyelesaikan pencocokan acak dalam jumlah tebakan rata-rata paling rendah akan menjadi pemenang. Bermain game yang cerdas dan kecepatan kalkulasi juga kemungkinan akan menjadi faktor. Saya mengasumsikan jumlah rata-rata belokan hampir pasti lebih besar dari 10, sehingga kemungkinan Anda memenangkan hadiah $ 1 juta (mungkin dibayar oleh MTV, bukan saya) tipis. Hanya bagaimana mungkin itu untuk pemain untuk memenangkan hadiah utama?
Catatan: Menempatkannya dalam format {A1, B2, ...} tidak harus dilakukan. Saya hanya menggunakan formulir itu dalam pertanyaan untuk membuatnya jelas apa teka-teki itu. Jika Anda tidak memasukkannya dalam formulir ini, cukup jelaskan bagaimana cara menyebutnya.
Semoga berhasil!
sumber
Jawaban:
Python 2 (berjalan lebih cepat jika dijalankan menggunakan Pypy)
Diyakini hampir selalu menebak pasangan yang benar dalam 10 putaran atau lebih rendah
Algoritme saya diambil dari jawaban saya untuk dalang sebagai hobi saya (lihat di Ideone ). Idenya adalah untuk menemukan tebakan yang meminimalkan jumlah kemungkinan yang tersisa dalam kasus terburuk. Algoritme saya di bawah ini hanya memaksa, tetapi untuk menghemat waktu, pilih saja tebakan acak jika jumlah kemungkinan yang tersisa lebih besar dari
RANDOM_THRESHOLD
. Anda dapat bermain-main dengan parameter ini untuk mempercepat atau untuk melihat kinerja yang lebih baik.Algoritma ini sangat lambat, rata-rata 10s untuk satu kali dijalankan jika dijalankan menggunakan Pypy (jika menggunakan juru bahasa CPython normal sekitar 30-an) jadi saya tidak dapat mengujinya pada seluruh permutasi. Tetapi kinerjanya cukup baik, setelah sekitar 30 tes saya belum melihat contoh di mana ia tidak dapat menemukan pasangan yang benar dalam 10 putaran atau lebih rendah.
Lagi pula, jika ini digunakan dalam pertunjukan kehidupan nyata, ia memiliki banyak waktu sebelum babak berikutnya (satu minggu?) Sehingga algoritma ini dapat digunakan dalam kehidupan nyata = D
Jadi saya pikir aman untuk mengasumsikan bahwa rata-rata ini akan menemukan pasangan yang benar dalam 10 tebakan atau lebih rendah.
Cobalah sendiri. Saya mungkin meningkatkan kecepatan dalam beberapa hari ke depan (EDIT: tampaknya sulit untuk lebih meningkatkan, jadi saya hanya akan meninggalkan kode apa adanya. Saya hanya mencoba melakukan pengambilan acak, tetapi bahkan pada
size=7
, gagal dalam 3 dari 5040 kasus , jadi saya memutuskan untuk tetap menggunakan metode yang lebih pintar). Anda dapat menjalankannya sebagai:Atau, jika Anda hanya ingin melihat cara kerjanya, masukkan angka yang lebih kecil (agar dapat berjalan lebih cepat)
Untuk menjalankan tes penuh (peringatan: akan sangat lama
size
> 7), tulis angka negatif.Tes penuh untuk
size=7
(diselesaikan dalam 2m 32s):Jika
RANDOM_THRESHOLD
danCLEVER_THRESHOLD
keduanya diatur ke nilai yang sangat tinggi (seperti 50.000), itu akan memaksa algoritma untuk menemukan tebakan optimal yang meminimalkan jumlah kemungkinan dalam kasus terburuk. Ini sangat lambat, tetapi sangat kuat. Misalnya, menjalankannya dengansize=6
menyatakan bahwa ia dapat menemukan pasangan yang benar dalam maksimum 5 putaran.Meskipun rata-rata lebih tinggi dibandingkan dengan menggunakan perkiraan (yang rata-rata adalah 4,11 putaran), tetapi selalu berhasil, bahkan lebih dengan satu putaran tersisa untuk cadangan. Ini semakin memperkuat hipotesis kami bahwa ketika
size=10
, hampir selalu harus menemukan pasangan yang benar dalam 10 putaran atau kurang.Hasilnya (selesai dalam 3m 9d):
Kode.
sumber
len(remove_perms ...)
bagian). Dan ya, yang saya maksudkan dalam <= 10 putaran =). Btw dalam kode di atas, tebakan yang benar-benar optimal tidak pernah dibuat, karena saya katakanCLEVER_THRESHOLD=0
, yang berarti hanya akan mencoba menebak dari daftar kemungkinan, meskipun tebakan optimal mungkin di luar set ini. Tetapi saya memutuskan untuk menonaktifkannya untuk menghemat waktu. Saya menambahkan tes penuh untuksize=7
, menunjukkan bahwa selalu berhasil.size=8
dan menemukan bahwa versi terbaru hanya memiliki 40308 keberhasilan (bukan 40320) jika pengaturan ini digunakan. Tapi itu masih tingkat keberhasilan 99,97%! Kira kita bisa membuat penyelenggara acara TV bangkrut.CJam -19 ternyata- Strategi An Idiot
Ini bukan jawaban yang serius tetapi sebuah demonstrasi. Ini adalah solusi orang bodoh di mana dia tidak memperhitungkan jumlah informasi pasangan yang benar yang diberikan dari bagian kedua belokan. Dengan pasangan yang sepenuhnya acak, ini membutuhkan rata-rata 27 minggu. Jawaban ini tidak cukup seperti yang saya katakan tetapi menunjukkan bahwa peluang untuk kelompok intellegent (jauh lebih cerdas dari program ini) kemungkinan tidak setipis yang Anda harapkan. Algoritma yang lebih cerdas yang saya tulis, namun membutuhkan banyak waktu untuk menjalankannya sehingga saya benar-benar bisa mendapatkan jawaban dari mereka.
Pembaruan: Kode di bawah ini diperbarui untuk menggunakan status yang seharusnya menghapus yang tidak berfungsi jika yang benar adalah yang sudah kita ketahui benar. Itu juga diedit untuk menunjukkan generator "jawaban yang benar" secara acak. Hasil rata-rata sekarang hanya 19. Ini masih merupakan solusi bodoh tetapi lebih baik dari sebelumnya secara marginal.
sumber
Versi C ++ Multi-Threaded Cepat
Saya tahu sudah lama sejak utas ini aktif, tetapi saya memiliki tambahan yang keren untuk dibagikan: Berikut ini adalah implementasi C ++ dari algoritma minimax untuk Are You The One? , yang menggunakan multi-threading untuk mempercepat evaluasi setiap tebakan yang mungkin.
Versi ini jauh lebih cepat daripada versi Python (lebih dari 100x lebih cepat ketika versi Python asli diatur ke maksimum
RANDOM_THRESHOLD
danCLEVER_THRESHOLD
). Itu tidak menggunakan tebakan acak, melainkan mengevaluasi semua permutasi dan mengirimkan sebagai tebakan permutasi yang menghilangkan jumlah terbesar dari solusi yang mungkin (diberikan respon kasus terburuk).Untuk gim yang lebih kecil, memanggil "ayto -n" akan menjalankan gim di semua n! kemungkinan kecocokan tersembunyi, dan akan memberi Anda ringkasan singkat hasil di akhir.
Karena masih sulit untuk mengevaluasi semua 10! kemungkinan kecocokan tersembunyi, jika Anda memanggil "ayto 10", misalnya, simulator membuat tiga tebakan pertamanya, lalu jalankan minimax untuk memilih tebakannya dan mengasumsikan bahwa ia diberi evaluasi kasus terburuk. Ini membawa kita ke "jalur kasus terburuk" ke vektor tersembunyi yang mungkin ada di kelas vektor yang menggunakan algoritma jumlah maksimum dugaan untuk diidentifikasi. Dugaan ini belum diuji.
Hingga n = 9 , belum ada simulasi yang harus diselesaikan lebih dari n putaran.
Untuk mengujinya sendiri, contoh kompilasi adalah sebagai berikut:
Inilah contoh kecil dengan output:
Kode
sumber