Tujuan dari teka-teki ini adalah untuk mengambil setumpuk 52 kartu dan mengocoknya sehingga setiap kartu berada dalam posisi acak.
Diberikan:
- Array,,
deck
dari 52 bilangan bulat berbeda yang mewakili kartu. Ketika Anda mulai,deck
berisi persis satu dari setiap kartu dalam urutan yang tidak diketahui. - Fungsi,,
int rand(min, max)
yang mengembalikan bilangan bulat acak antara intmin
danmax
, inklusif. Anda dapat mengasumsikan bahwa fungsi ini benar-benar acak. - Suatu fungsi,
void swap(x, y)
yang menukar dua kartu di dek. Jika Anda meneleponswap(x, y)
, kartu di posisix
dany
akan berpindah tempat.
Kapan:
- Program panggilan
shuffle()
(ataushuffle(deck)
ataudeck.shuffle()
atau Namun implementasi Anda suka untuk menjalankan),
Kemudian:
deck
harus berisi tepat satu dari setiap kartu dalam urutan acak sempurna.
Tangkapan:
Anda tidak dapat mendeklarasikan variabel apa pun. Panggil swap
dan rand
sebanyak yang Anda suka, tetapi Anda tidak dapat mendeklarasikan variabel Anda sendiri. Ini termasuk for
penghitung lingkaran - bahkan yang tersirat seperti dalam a foreach
.
Klarifikasi:
- Anda dapat mengubah detail kecil agar sesuai dengan bahasa pilihan Anda. Misalnya, Anda dapat menulis
swap
untuk mengganti dua bilangan bulat dengan referensi. Perubahan seharusnya membuat ini berfungsi dengan bahasa Anda, bukan untuk membuat teka-teki lebih mudah. deck
bisa menjadi variabel global, atau Anda bisa menganggapnya sebagai parameter.- Anda dapat melakukan apa saja yang Anda inginkan
deck
, tetapi Anda tidak dapat mengubah panjangnya. - Kartu Anda dapat diberi nomor 0-51, 1-52, atau apa pun yang Anda suka.
- Anda dapat menulis ini dalam bahasa apa pun, tetapi jangan curang dengan
shuffle
fungsi bawaan bahasa Anda . - Ya, Anda bisa menulis baris yang sama 52 kali. Tidak ada yang akan terkesan.
- Waktu eksekusi tidak penting, tetapi keacakan yang sebenarnya tidak penting.
- Ini bukan kode golf, tapi jangan ragu untuk memperkecil / mengaburkan kode Anda.
Sunting: Kode dan visualizer Boilerplate
Jika Anda menggunakan .NET atau JavaScript, berikut ini beberapa kode uji yang mungkin berguna bagi Anda:
JavaScript:
- Visualizer JavaScript cepat-dan-kotor, dengan sumber CoffeeScript: https://gist.github.com/JustinMorgan/3989752bdfd579291cca
- Versi runnable (cukup tempelkan pada
shuffle()
fungsi Anda ): http://jsfiddle.net/4zxjmy42/
C #:
- Visualisasi ASP.NET dengan C # codebehind: https://gist.github.com/JustinMorgan/4b630446a43f28eb5559
- Stub hanya dengan metode utilitas
swap
danrand
: https://gist.github.com/JustinMorgan/3bb4e6b058d70cc07d41
Kode ini mengurutkan dan mengocok deck beberapa ribu kali dan melakukan beberapa pengujian kewarasan dasar: Untuk setiap shuffle, kode ini memverifikasi bahwa ada tepat 52 kartu di dalam deck tanpa pengulangan. Kemudian visualizer memplot frekuensi setiap kartu berakhir di setiap tempat di geladak, menampilkan peta panas skala abu-abu.
Output visualizer akan terlihat seperti salju tanpa pola yang jelas. Jelas itu tidak dapat membuktikan keacakan yang sebenarnya, tetapi ini adalah cara yang cepat dan mudah untuk melakukan pemeriksaan spot. Saya sarankan menggunakannya atau sesuatu seperti itu, karena kesalahan tertentu dalam algoritma pengocokan menyebabkan pola yang sangat dikenali dalam output. Berikut adalah contoh dari output dari dua implementasi, satu dengan kelemahan umum:
Versi cacat sebagian mengocok dek, jadi mungkin terlihat baik jika Anda memeriksa array dengan tangan. Visualizer memudahkan untuk melihat suatu pola.
deck
itu sendiri.
swap
Anda suka, asalkan memenuhi tujuan dasarnya. Bagian dari alasan saya swap
memberikan sesuatu adalah agar orang-orang dapat memperlakukannya sebagai 'sihir' dan berkonsentrasi pada masalah utama tanpa harus khawatir itu berfungsi dalam bahasa pilihan mereka. Anda dapat melakukannya atau menulis sendiri swap
, terserah Anda.