Ini Natal pada bulan Juli, jadi cara apa yang lebih baik untuk merayakannya selain pertukaran hadiah gajah putih virtual!
Untuk tantangan King of the Hill ini, Anda harus membuat bot yang bermain dalam simulasi pertukaran Gajah Putih , berusaha mendapatkan hadiah dengan nilai tertinggi yang bisa didapat.
Aturan Game
- Gim ini akan dimainkan dalam banyak putaran, masing-masing terdiri dari jumlah putaran yang bervariasi.
- Putaran Pengaturan : Akan ada banyak hadiah karena ada pemain dalam permainan, masing-masing dinilai secara acak dalam kisaran [0 ... 1), dengan nilai ini tidak diketahui hingga hadiah "dibuka". Pemain akan dimasukkan dalam urutan acak dalam antrian. Pemain pertama akan muncul dari depan antrian.
- Ketika giliran pemain, mereka dapat membuka hadiah atau mencuri hadiah pemain lain, melewati pemain yang hadiahnya dicuri.
- Setiap hadiah dapat dicuri hingga 3 kali.
- Anda tidak dapat mencuri dari pemain yang baru saja mencuri dari Anda.
- Setiap pemain hanya dapat memiliki satu hadiah pada suatu waktu.
- Setelah hadiah dibuka, bermain maju ke pemain berikutnya muncul dari depan antrian. Ini akan menjadi pemain berikutnya secara berurutan yang belum mendapat giliran.
- Round End : Ketika semua hadiah telah dibuka, babak berakhir, dan nilai dari hadiah yang dipegang oleh masing-masing pemain ditambahkan ke skor pemain itu. Babak baru dimulai, dengan masing-masing pemain sekarang tidak memegang hadiah dan urutan pemain diacak.
- Game End : Permainan akan berakhir ketika setidaknya satu pemain memiliki skor
100500 poin, dengan kemenangan diberikan kepada pemain dengan nilai total hadiah tertinggi.
Coding
Semua kiriman harus kompatibel dengan Python 3.7. Anda harus menulis kelas yang mewarisi langsung dari WhiteElephantBot
. Contohnya:
class FooBot(WhiteElephantBot):
# Your implementation here
Anda dapat memberikan __init__
metode (yang mengambil satu argumen, name
) di kelas bot Anda, yang harus dihubungi super().__init__(name)
. Kelas Anda harus memiliki take_turn
metode yang mengharapkan argumen berikut dalam urutan ini:
players
: Daftar nama pemain, secara berurutan, dari semua pemain yang belum memiliki hadiah.presents
: Kamus yang memetakan nama-nama pemain ke 2-tupel yang berisi nilai sekarang yang dipegang oleh pemain itu dan berapa kali ini telah dicuri. Ini hanya akan mencakup pemain lain yang saat ini memegang hadiah.just_stole
: Jika aksi terakhir yang diambil adalah mencuri, ini akan menjadi nama pemain yang baru saja mencuri. Jika tidak, itu akan terjadiNone
.
Setiap argumen akan berubah atau objek baru sehingga mengubah salah satu dari mereka tidak akan berpengaruh pada permainan. Anda dapat menyimpan salinan argumen apa pun jika diinginkan.
Nilai contoh untuk presents
:
{
'Alice': (0.35, 0),
'Bob': (0.81, 2),
'Charlie': (0.57, 1)
}
take_turn
Metode Anda harus mengembalikan nama pemain yang ingin Anda curi atau None
untuk membuka hadiah. Jika itu menimbulkan pengecualian, mengembalikan sesuatu selain dari str
atau None
, atau nama pemain yang tidak dapat Anda curi, Anda akan membuka hadiah secara default.
Konstruktor Anda akan dipanggil pada awal setiap putaran, sehingga Anda tidak bisa mengingat status dari putaran ke putaran.
Dengan mewarisi dari WhiteElephantBot
, Anda akan memiliki akses ke steal_targets
metode yang akan mengambil dict hadiah dan just_stole
dan mengembalikan daftar nama pemain yang dapat Anda curi.
Modul apa pun yang dibutuhkan skrip Anda harus diimpor di bagian atas entri Anda.
Driver Penguji
Driver tes dapat ditemukan di sini . Anda tidak perlu memasukkan from white_elephant import WhiteElephantBot
jawaban yang Anda kirim, namun modul lokal perlu melakukannya.
Pesaing Dasar
- Acak : Memilih secara acak apakah akan membuka hadiah baru atau mencuri, dengan target mencuri dipilih secara acak secara acak.
- Serakah : mencuri hadiah paling berharga yang bisa dicuri. Jika tidak ada hadiah yang bisa dicuri, buka hadiah.
- Bagus : Selalu membuka hadiah baru. Tidak pernah mencuri.
Aturan tambahan
- Adalah tanggung jawab Anda untuk menangkap semua pengecualian. Jika kelas Anda gagal menangkap pengecualian, itu akan didiskualifikasi. Selain itu, tolong jangan menangkap KeyboardInterrupts.
- Jangan menggunakan file atau metode lain untuk memotong ketidakmampuan untuk menyimpan keadaan di antara game. Anda mungkin tidak, misalnya, menyimpan status jaringan saraf ke file yang sedang berjalan.
- Bot Anda harus mandiri dalam kode kelas dan konstanta terkait.
- Anda hanya dapat menggunakan impor pustaka standar.
- Tidak ada persyaratan kinerja yang ketat. Bersikaplah masuk akal dan bijaksana. Jika kinerja menjadi masalah, saya berhak untuk menambah batas waktu.
Satu entri per orang.Jika Anda mengirim lebih dari satu entri, bot Anda mungkin tidak bekerja bersama. Saya akan memperbolehkan beberapa entri per orang untuk saat ini, meskipun saya dapat reban nanti jika itu menjadi masalah.- Ini adalah kompetisi terbuka tanpa tanggal akhir yang berbeda. Ini akan dijalankan kembali kapan saja saya bisa ketika ada perubahan signifikan.
EDIT1: Skor kemenangan berubah dari 100 menjadi 500 sehingga peringkat lebih konsisten. Driver penguji memiliki perbaikan bug baru dan juga mencerminkan perubahan skor menang.
EDIT2: Klarifikasi catatan tentang impor yang diperlukan.
Papan peringkat (per 8 Agustus 2018)
- SampleBot (500.093)
- LastMinuteBot (486.163)
- RobinHood (463.160)
- OddTodd (448.825)
- GreedyBot (438.520)
- SecondPlaceBot (430.598)
- ThresholdBot (390.480)
- Penjudi (313.362)
- NiceBot (275.536)
- RandomBot (256.172)
- GoodSamaritan (136.298)
sumber
Jawaban:
LastMinuteBot
(Dengan terima kasih banyak kepada @Mnemonic untuk kerangka kode, karena saya hampir tidak tahu Python.)
Manfaatkan fakta bahwa hadiah tidak dapat dicuri lebih dari tiga kali, lakukan pencurian ketiga sendiri jika Anda menemukan hadiah bernilai tinggi dan sebagian besar hadiah telah dibuka.
sumber
Todd ganjil
Mencuri hadiah terbaik yang dia bisa, tetapi tidak ingin menjadi orang kedua yang mencuri hadiah, karena jika dicuri, dia tidak bisa mendapatkannya kembali.
sumber
==
alih - alih=
dalam pemahaman daftar Anda.SecondPlaceBot
Semua orang akan berjuang untuk mendapatkan hadiah yang paling berharga. Hadiah terbaik berikutnya hampir sama baiknya, tetapi kecil kemungkinannya untuk dicuri.
sumber
ThresholdBot
Kami tidak benar-benar peduli tentang mendapatkan hadiah terbaik , hanya sesuatu yang cukup bagus . Selama ada sesuatu yang pantas dicuri, kami akan melakukannya.
sumber
SampleBot
Menjalankan 2000 simulasi dengan masing-masing pemain bertindak rakus dan memilih aksi terbaik.
sumber
Robin Hood
Curi dari orang kaya yang tidak mendapat hadiah
sumber
GoodSamaritan
Beri orang yang beruntung kesempatan lain untuk keberuntungan
sumber
Penjudi
The Gambler kecanduan, dia mencoba menjadi pemain terakhir, lalu bertaruh pada hadiah baru untuk mengalahkan semua pemain lainnya.
sumber
Top3Bot
Bot ini tidak mencoba untuk mendapatkan hadiah terbaik, tetapi mencoba untuk mendapatkan hadiah yang bernilai> = (n-3) / n, di mana n adalah jumlah hadiah. Dalam sebagian besar kasus, akan ada hadiah yang dihargai sebesar itu, dan Top3Bot akan mencoba untuk mendapatkan salah satu dari ini, tetapi dia tidak benar-benar peduli yang mana yang didapatnya.
sumber
__init__
hilangself