Test Driver • Diskusi Tantangan • Kirim Adventurer
( Sumber Gambar )
Beberapa petualang saingan menggerebek reruntuhan untuk harta, tetapi mereka hanya bisa membawa begitu banyak pada suatu waktu dan memiliki batas daya tahan mereka. Mereka ingin mendapatkan harta yang paling berharga dan keluar sebelum mereka menjadi terlalu lelah untuk melanjutkan. Mereka berusaha menjadi sekaya mungkin dari kejahatan mereka yang menjarah.
Gameplay
Setiap petualang mulai di ruang pertama ruang bawah tanah dengan 1000 poin stamina dan 50kg ruang di ransel mereka.
Permainan beroperasi berdasarkan mode giliran, dengan semua pemain menyelesaikan giliran secara bersamaan. Setiap belokan, Anda dapat melakukan salah satu tindakan berikut:
- Pindah ke kamar sebelah.
- Pindah ke kamar sebelumnya.
- Tawaran stamina untuk mengambil harta.
- Jatuhkan harta.
Bergerak di antara kamar membutuhkan 10 stamina, ditambah 1 untuk setiap 5kg saat ini di ransel Anda, dibulatkan. Misalnya, seorang petualang yang membawa 3kg harta membutuhkan 11 stamina untuk bergerak dan satu yang membawa 47kg membutuhkan 20 stamina untuk bergerak.
Menjatuhkan harta membutuhkan 1 stamina terlepas dari harta yang dijatuhkan.
Saat keluar dari reruntuhan, tidak ada lagi belokan yang akan diambil oleh pemain.
Jika seorang pemain tidak dapat mengambil tindakan ini (karena kekurangan stamina atau tidak adanya harta), petualang mereka meninggal karena kelelahan, menumpahkan harta yang mereka miliki ke ruang yang saat ini diduduki. Demikian pula, jika seorang pemain mencoba melakukan tindakan yang tidak valid, petualang mereka akan terbunuh oleh jebakan, yang mengakibatkan tumpahan harta yang sama.
Menawar
Tawaran minimum untuk harta adalah 1 stamina per 1kg yang beratnya ditimbang. Anda juga dapat mengajukan poin stamina tambahan untuk lebih mungkin mendapatkan harta. Stamina yang dicoba dikonsumsi tidak peduli apa hasilnya.
Jika ada beberapa pemain yang memiliki tawaran untuk mengambil harta yang sama, pemain yang menawar tertinggi akan mendapat harta. Jika lebih dari satu pemain melakukan penawaran tertinggi, tidak ada dari mereka yang akan menerima harta.
Kondisi menang
Pemain dengan nilai total harta terbesar adalah pemenangnya. Dalam hal yang tidak mungkin terjadi dasi, ikatan pergi ke berat total terkecil, kemudian jumlah harta terkecil, kemudian nilai harta paling berharga, kedua paling berharga, ketiga ... sampai dasi rusak. Dalam hal yang hampir mustahil bahwa masih ada ikatan pada titik ini, pengemudi tes mengatakan "sekrupkan" dan pemenangnya ditentukan secara sewenang-wenang.
Dalam konteks turnamen, pemain akan diperingkat dengan tempat pertama menerima 10 poin, tempat kedua dengan 9 poin, tempat ketiga dengan 8 poin, dll ..., dengan pemain mati dan petualang tanpa harta mencetak 0 poin.
Tentang Reruntuhan
- Setiap kamar awalnya berisi antara danharta. (Di manaadalah nomor kamar)
- Ada banyak kamar yang sewenang-wenang, hanya dibatasi oleh stamina dan keinginan petualang untuk menjelajah.
- Setiap harta akan memiliki nilai moneter (dalam seluruh $) dan berat (dalam seluruh kg).
- Harta karun cenderung lebih berharga dan berlimpah saat Anda masuk lebih dalam ke reruntuhan.
- Rumus khusus untuk menghasilkan harta adalah sebagai berikut: (menggunakan notasi untuk dadu gulungan)
- Berat dihasilkan pertama kali menggunakan rumus (minimal 1)
- Nilai harta kemudian dihasilkan melalui (di mana adalah nomor kamar dan adalah berat)
Informasi Yang Terlihat oleh Pemain
Di setiap belokan, pemain mendapatkan informasi berikut:
- Jumlah kamar mereka saat ini. Ini adalah 1-diindeks, jadi secara konseptual pintu keluarnya ada di "kamar 0"
- Daftar harta saat ini di dalam ruangan
- Daftar pemain lain yang juga saat ini ada di dalam ruangan.
- Persediaan harta karun Anda saat ini
- Level stamina Anda saat ini
Coding
Driver tes dapat ditemukan di sini .
Anda harus mengimplementasikan subkelas dari Adventurer
kelas ini :
class Adventurer:
def __init__(self, name, random):
self.name = name
self.random = random
def get_action(self, state):
raise NotImplementedError()
def enter_ruins(self):
pass
Anda hanya perlu mengganti get_action
metode. enter_ruins
dijalankan sebelum permainan dimulai dan merupakan kesempatan Anda untuk mempersiapkan apa pun yang Anda ingin siapkan untuk permainan. Anda tidak perlu menimpa __init__
, dan Anda benar - benar tidak boleh melakukannya . Jika __init__
macet, Anda akan didiskualifikasi.
get_action
menerima argumen tunggal yang namedtuple
dengan bidang berikut (dalam urutan ini, jika Anda lebih suka merusak):
room
: jumlah kamar tempat Anda berada saat initreasures
: daftar harta karun di dalam ruanganplayers
: daftar pemain lain di dalam ruangan. Anda hanya mendapatkan nama pemain dengan cara ini, jadi Anda tidak tahu bot apa yang mengendalikan mereka atau inventaris / stamina mereka.inventory
: daftar harta di ransel Andastamina
: tingkat stamina Anda saat ini
Objek ini juga menyediakan dua properti utilitas:
carry_weight
: total berat semua harta yang Anda bawatotal_value
: nilai total semua harta yang Anda bawa
Daftar treasures
dan inventory
berisi namedtuple
s dengan atribut ini:
name
: nama harta karun (untuk keperluan kosmetik)value
: nilai moneter dari harta dalam $.weight
: berat harta dalam kg
get_action
harus mengembalikan salah satu dari nilai / pola berikut:
'next'
atau'previous'
untuk pindah ke kamar berikutnya / sebelumnya'take', <treasure index>, <bid>
(ya, sebagai tuple, meskipun urutan apa pun secara teknis akan berfungsi juga) untuk menawar harta pada indeks yang diberikan dalam daftar harta karun kamar. Kedua argumen harus bilangan bulat. Mengapung akan dibulatkan ke bawah.'drop', <inventory index>
untuk menjatuhkan harta yang dibawa ditemukan pada indeks yang diberikan. Indeks harus (secara alami) menjadi bilangan bulat.
Batasan Lainnya
- Anda hanya dapat menggunakan contoh acak yang diberikan kepada Anda selama inisialisasi untuk pseudorandomness.
- Hal lain yang mungkin memperkenalkan perilaku non-determinasi tidak diperbolehkan. Maksudnya di sini adalah untuk membuat bot berperilaku identik ketika diberi benih yang sama untuk membantu dalam menguji bot baru (dan berpotensi bug di driver tes). Hanya radiasi kosmik yang harus menyebabkan penyimpangan / nondeterminisme.
- Perlu diingat bahwa kode hash diacak dalam Python 3, jadi menggunakan
hash
untuk pengambilan keputusan apa pun tidak diperbolehkan.dict
s baik-baik saja bahkan ketika menggunakan perintah iterasi untuk keputusan karena pesanan telah dijamin konsisten sejak Python 3.6.
- Anda tidak boleh mengelak dari driver tes menggunakan
ctypes
hacks atauinspect
stack voodoo (atau metode lain). Ada beberapa hal menakutkan yang dapat Anda lakukan dengan modul-modul itu. Tolong jangan.- Setiap bot di-sandbox dengan cukup baik melalui salinan defensif dan
namedtuple
ketidakmampuan alami dari s, tetapi ada beberapa celah / eksploitasi yang tidak dapat ditambal. - Fungsionalitas lain dari
inspect
danctypes
dapat digunakan selama keduanya tidak digunakan untuk menghindari fungsi pengontrol. - Metode apa pun untuk mengambil instance bot lain dalam gim Anda saat ini tidak diperbolehkan.
- Setiap bot di-sandbox dengan cukup baik melalui salinan defensif dan
- Bot harus beroperasi sendiri dan tidak boleh berkoordinasi dengan bot lain dengan cara apa pun untuk tujuan apa pun. Ini termasuk menciptakan dua bot dengan tujuan yang berbeda sehingga satu mengorbankan dirinya untuk keberhasilan yang lain. Setelah ada lebih dari 10 pesaing, Anda tidak akan benar-benar dijamin memiliki dua bot dalam permainan yang sama dan nama petualang tidak memberikan indikasi kelas bot, jadi jenis strategi ini tetap terbatas.
- Saat ini tidak ada batasan keras pada waktu pelaksanaan, namun saya berhak untuk membatasi dengan keras di masa depan jika turnamen mulai memakan waktu terlalu lama. Bersikaplah masuk akal dan cobalah untuk tetap memproses di bawah 100 ms , karena saya tidak mengantisipasi perlu membatasi di bawah ambang itu. (Turnamen akan berjalan sekitar 2 jam jika semua bot membutuhkan waktu sekitar 100 ms per putaran.)
- Kelas bot Anda harus dinamai secara unik di antara semua kiriman.
- Anda mungkin tidak ingat apa pun di antara game. (Namun, Anda dapat mengingat hal-hal di antara belokan )
- Jangan edit sys.modules. Apa pun di luar variabel instance harus diperlakukan sebagai konstanta.
- Anda tidak boleh memodifikasi kode bot apa pun secara terprogram, termasuk kode Anda.
- Ini termasuk menghapus dan mengembalikan kode Anda. Ini untuk membuat debugging dan turnamen lebih efisien.
- Kode apa pun yang menyebabkan pengontrol macet akan segera didiskualifikasi. Sementara sebagian besar pengecualian akan ditangkap, beberapa mungkin lolos dan segfault tidak dapat ditandingi. (Ya, Anda dapat melakukan segmentasi dengan Python terima kasih kepada
ctypes
)
Pengajuan
Untuk membantu pengikisan jawaban, sebutkan nama bot Anda di bagian atas jawaban dengan #Header1
dan pastikan jawaban Anda menyertakan setidaknya satu blok kode (hanya yang pertama dalam jawaban Anda yang akan digunakan). Anda tidak perlu memasukkan impor atau dokumen, karena akan ditambahkan secara otomatis oleh scraper.
Saya akan lebih cenderung memilih jawaban dengan penjelasan terperinci dan dapat dimengerti. Orang lain cenderung berperilaku sama.
Secara kasar, jawaban Anda harus diformat seperti ini:
# Name of Bot
Optional blurb
#imports go here
class BotName(Adventurer):
#implementation
Explanation of bot algorithm, credits, etc...
(diterjemahkan sebagai)
Nama Bot
Uraian opsional
#imports go here class BotName(Adventurer): #implementation
Penjelasan tentang algoritma bot, kredit, dll ...
Menjalankan Test Driver Secara Lokal
Anda akan membutuhkan Python 3.7+ dan saya sarankan Anda juga menginstal tabulate
via pip. Memotong halaman ini untuk pengiriman juga membutuhkan lxml
dan requests
. Anda juga harus menggunakan terminal dengan dukungan untuk pelolosan warna ANSI untuk hasil terbaik. Info tentang cara mengatur ini di Windows 10 dapat ditemukan di sini .
Tambahkan bot Anda ke file dalam subdirektori dalam direktori yang sama dengan ruins.py
( ruins_bots
secara default) dan pastikan untuk menambahkan from __main__ import Adventurer
ke bagian atas modul. Ini ditambahkan ke modul ketika scraper mengunduh kiriman Anda, dan meskipun pasti hacky, ini adalah cara paling mudah untuk memastikan bot Anda memiliki akses Adventurer
.
Semua bot dalam direktori itu akan dimuat secara dinamis saat runtime, jadi tidak ada perubahan lebih lanjut yang diperlukan.
Turnamen
Pemenang utama akan ditentukan dalam serangkaian game dengan hingga 10 bot di setiap game. Jika ada lebih dari 10 total pengiriman, 10 bot teratas akan ditentukan dengan secara sistematis memecahnya menjadi kelompok-kelompok 10 hingga setiap bot telah memainkan (tepatnya) 20 pertandingan. 10 bot teratas akan dipilih dari grup ini dengan skor reset dan akan memainkan permainan sampai bot tempat pertama telah mencapai 50 poin memimpin di atas bot tempat kedua atau sampai 500 pertandingan telah dimainkan.
Sampai setidaknya ada 10 pengajuan, slot kosong akan diisi dengan "Pemabuk" yang berkeliaran secara acak melalui reruntuhan dan mengambil (dan kadang-kadang menjatuhkan) harta acak sampai kehabisan stamina dan harus menuju ke pintu keluar.
Turnamen akan dijalankan kembali setiap minggu jika ada kiriman baru. Ini adalah tantangan KOTH terbuka tanpa tanggal akhir yang ditetapkan.
Papan peringkat
Dari lari pada 4 Mei 2019 pada 16:25 MDT: (2019-05-04 4:25 -6: 00)
Seed: K48XMESC
Bot Class | Score | Mean Score
--------------+---------+--------------
BountyHunter | 898 | 7.301
Scoundrel | 847 | 6.886
Accountant | 773 | 6.285
Ponderer | 730 | 5.935
Artyventurer | 707 | 5.748
PlanAhead | 698 | 5.675
Sprinter | 683 | 5.553
Accomodator | 661 | 5.374
Memorizer | 459 | 3.732
Backwards | 296 | 2.407
Pembaruan - 15 Apr: pembaruan / klarifikasi peraturan pasangan
Pembaruan - 17 Apr: melarang beberapa kasus tepi dari tindakan jahat seperti memodifikasi kode bot lain.
Pembaruan - 4 Mei: Hadiah yang diberikan kepada Sleafar karena benar-benar menghancurkan Mundur. Selamat!
pip
menginstal dan menghidupkan PATH
(yang merupakan standar untuk instalasi yang lebih baru AFAIK) maka dari windows Anda dapat menjalankannya pip install modulename
di command prompt. Untuk keadaan lain (yang saya tidak tahu), buka pip , cari modul yang diperlukan dan pilih opsi.