CATATAN : Pemenang kompetisi ini adalah Jack !!!. Tidak ada lagi kiriman yang akan diterima.
Ini adalah ruang obrolan untuk tantangan king-of-the-hill ini . Ini adalah yang pertama saya jadi saya terbuka untuk saran!
Reaper adalah konsep permainan yang dikembangkan oleh Art of Problem Solving yang melibatkan kesabaran dan keserakahan. Setelah memodifikasi game agar sesuai dengan kontes gaya KOTH (Terima kasih kepada @NathanMerrill dan @dzaima atas saran dan peningkatan Anda), inilah tantangannya.
Gim berfungsi sebagai berikut: kami memiliki nilai yang dikenal sebagai Menuai yang dikalikan dengan konstanta yang diberikan setiap centang. Setelah setiap kutu, setiap bot memiliki opsi "menuai", yang berarti menambahkan nilai saat ini dari Reap ke skor seseorang, dan mengurangi menuai ke 1.
Namun, ada sejumlah kutu yang harus ditunggu oleh bot di antara "menuai", dan sejumlah poin tetap yang diperlukan untuk memenangkan permainan.
Cukup sederhana? Berikut masukan Anda:
I / O
Anda harus menulis fungsi dengan Python 3 yang membutuhkan 3 input. Yang pertama adalah self
, digunakan untuk referensi objek kelas (ditampilkan nanti). Yang kedua adalah Reap
, nilai saat ini dari Menuai yang akan Anda peroleh jika Anda ingin "menuai". Yang ketiga adalahprevReap
, daftar bot yang menuai selama centang sebelumnya.
Objek lain yang dapat Anda akses di fungsi Anda:
self.obj: An object for your use to store information between ticks.
self.mult: The multiplier that Reap is multiplied by each tick
self.win: The score you need to win
self.points: Your current set of points
self.waittime: The amount of ticks that you must wait between reaps during the game
self.time: The number of ticks since your last reap
self.lenBots: The number of bots (including you) in the game.
self.getRandom(): Use to produce a random number between 0 and 1.
Anda HARUS tidak mengedit konten dari objek-objek ini, kecuali untukself.obj
.
Anda harus keluar 1
untuk menuai, dan apa pun (atau tidak sama sekali) untuk tidak menuai. Perhatikan bahwa jika Anda menuai ketika Anda belum cukup menunggu kutu, saya akan mengabaikan fakta bahwa Anda telah memilih untuk menuai.
Aturan
Parameter saya akan menggunakan yang winning_score=10000
, multiplier=1.6-(1.2/(1+sqrt(x)))
, waittime = floor(1.5*x)
di mana x
adalah jumlah bots di Koth.
- Permainan berakhir ketika seorang pemain (atau beberapa) mencapai skor kemenangan.
- Ketika beberapa bot meminta untuk menuai sekaligus, prioritas diberikan kepada bot yang telah menunggu lebih lama (jika ada ikatan, bot yang telah menunggu waktu maksimum semua diizinkan untuk menuai dan mendapatkan poin di menuai)
- Bot Anda harus rata-rata tidak lebih dari 100 ms melintasi 5 tick.
- Jika Anda ingin mengimpor perpustakaan, tanyakan! Saya akan mencoba menambahkan perpustakaan yang dapat saya jalankan di Python versi desktop saya (matematika sudah diimpor: silakan menggunakannya)
- Semua celah standar untuk KoTHs, seperti duplikat bot, bot 1-up, dll, juga dilarang.
- Setiap bot yang menggunakan segala jenis keacakan harus menggunakan
getRandom
fungsi yang saya berikan.
Anda dapat menemukan pengontrol di tautan TIO di bawah ini. Untuk menggunakannya, tambahkan nama fungsi Anda BotList
sebagai string, lalu tambahkan fungsi ke kode. Ubah multiplier
untuk mengubah apa menuai dikalikan dengan setiap centang, modifikasi winning_score
untuk mengubah skor apa yang diperlukan untuk mengakhiri permainan, dan modifikasiwaittime
untuk mengubah jumlah tick untuk menunggu di antara menuai.
Untuk kenyamanan Anda, berikut adalah beberapa bot sampel (dan agak konyol). Mengirimkan bot yang serupa dengan ini tidak akan diizinkan. Namun, mereka menunjukkan cara kerja pengontrol.
def Greedybot(self,Reap, prevReap):
return 1
def Randombot(self,Reap, prevReap):
if self.obj == None:
self.obj=[]
self.obj.append(prevReap)
if self.getRandom()>0.5:
return 1
Bagi yang berminat, inilah Controller dengan 15 kiriman yang disertakan di dalamnya: Cobalah Online
HASIL AKHIR
WOO MEREKA AKHIRNYA AKAN DI SINI! Periksa TIO Link di atas untuk melihat kode apa yang saya gunakan untuk menghasilkan peringkat akhir. Hasilnya tidak terlalu menarik. Lebih dari 1000 berjalan saya lakukan dengan biji acak yang berbeda, hasilnya adalah
1000 wins - Jack
0 wins - everyone else
Selamat kepada pemenang Bounty, Jack !! (alias @Renzeee)
sumber
len(BotList)
?25
bot bermain. Akan lebih dulu menunggu sedikit juga melihat bot orang lain. Rushabh Mehta , apakah akan ada batas waktu / tanggal akhir ketika semua bot akan dijalankan dan pemenang ditentukan?Jawaban:
Bingung Twitchy Mess
Bot ini melakukan pengecekan seperti biasa (Bisakah saya menuai, bisakah saya menang?) Dan kemudian mencari nilai target sebelum menuai. Namun, itu bimbang, jadi setelah mencapai target, ia bertanya-tanya berapa lama ia bisa menunggu dan tidak segera menuai. Selain itu, itu gugup, sehingga mungkin tidak sengaja "menekan tombol" dan menuai di depan target.
Fakta menyenangkan: Ini pada dasarnya bagaimana saya bermain mesin penuai sebagai manusia.
sumber
Penembak jitu
Bot didorong oleh dendam. Melacak cooldown dan skor lawan. Berusaha agar orang lain tidak menang. Cukup banyak yang tidak pernah benar-benar menang, tetapi membuat permainan frustasi untuk bermain untuk orang lain.
EDIT:
Jika tidak ada yang> = 70% dari skor kemenangan:
Jika setidaknya setengah dari pengguna lain ada di cooldown mereka, cobalah untuk menuai.Ini membuatnya sulit untuk menargetkan lawan tertentu, dan begitu juga dihapus.Jika seseorang IS> = 70% dari skor kemenangan:
Bosan
Hanya untuk bersenang-senang, bot ini dibawa oleh seorang teman dan sebenarnya tidak ingin berada di sini. Mereka menggulirkan d16 hingga mendapatkan angka di 1-9, kemudian mereka berusaha menuai kapan saja angka berisi digit yang dipilih. (Pergi untuk mencari d10 akan mengganggu permainan, yang kasar, dan 0 terlalu mudah!)
sumber
self.obj.opponents[opponent]["time"] += 1
pada for-loop pertama danself.obj.lastReap
pada akhir for-loop kedua. Selain itu, ide bagus. Saya ingin tahu bagaimana ini akan berhasil melawan banyak bot lainnya. Ketika saya menggunakan banyak bot serakah dan acak itu hanya akan menuai segera karena sebagian besar waktu dari bot tidak dapat menuai. Tetapi tentu saja itu bukan pesaing yang realistis.Mendongkrak
Ini adalah bot sederhana dengan 4 aturan:
Saya telah mengoptimalkan 3 ticks dibandingkan bot yang ada saat ini (Sniper, grim_reaper, Every50, mess, BetterRandom, Averager, dan lainnya).
Saya telah mencoba untuk tetap dengan solusi lama saya (5 ticks) tetapi juga menuai jika Anda belum menuai lebih lama dari X ticks, dan kemudian menuai setelah lebih sedikit ticks berlalu selama non-reaping (yaitu 5, jika menunggu lebih lama dari diri sendiri .waittime + 5, juga menuai jika tidak menuai 4 ticks). Tapi ini tidak membaik hanya selalu menuai setelah 4 ticks bukannya 5.
sumber
Setiap 50
Bot ini akan menuai setiap kali
Reap
jumlahnya di atas 50.Mengapa 50?
Jika saya membuat asumsi akan ada 25 bot dalam permainan, itu berarti
multiplier = 1.6-(1.2/(1+sqrt(25))) = 1.4
danwaittime = floor(1.5*25) = 37
. SejakReap
dimulai1
, itu akan naik seperti ini:Seperti yang Anda lihat, itu mencapai di atas 50 setelah 13 kutu. Karena
Reap
akan reset ke 1 setiap kali bot menuai, danwaittime
untuk bot yang menuai adalah 37, kemungkinan bot menuai lebih cepat daripada nanti cukup tinggi, terutama dengan bot mirip dengan contohGreedyBot
, yang akan menuai secepat merekawaittime
yaitu tersedia lagi. Awalnya saya ingin melakukan 200 yang merupakan kutu ke-17, agak di tengah-tengah dari 37 kutu waktu tunggu, tetapi dengan asumsi ada 25 bot dalam bermain ada kemungkinan cukup tinggi orang lain menyambarReap
sebelum saya. Jadi saya menurunkannya menjadi 50. Itu masih angka bulat yang bagus, tetapi terutama karena ini adalah tick ke-13 (dengan 25 bot), dan 13 dan menuai juga cocok dengan genre 'jahat' yang sama.Kode:
Kode ini sepele menggelikan ..
Catatan:
Bot ini sangat buruk dengan jumlah bot yang rendah. Untuk saat ini saya akan meninggalkannya, dan saya mungkin membuat bot yang lebih baik sebenarnya menghitung waktu terbaik untuk itu
Reap
. Dengan jumlah bot yang sangat rendah dalam permainanwaittime
, tentu saja ini jauh lebih rendah, jadi bahkanGreedyBot
mungkin menang dengan mudah dari bot ini jika botnyawaittime
cukup rendah.Semoga lebih banyak orang akan menambahkan lebih banyak bot. ; p
sumber
def Every49(self, Reap, prevReap): return Reap > 49
Langkahmu.int
mengatasi ketidaksetaraan, karena 1 adalah perintah sebenarnyaTrue
eksplisit1
. KupikirTrue == 1
cek masih akan kembaliTrue
untuk bot saya menambahkannya ke daftarReapers
dinext
fungsi Anda , tapi saya tetap menambahkan pemeran ke int seperti yang Anda sarankan.Averager
Bot ini mencoba menuai kapan saja nilai Menuai saat ini di atas nilai Menuai rata-rata.
sumber
Malaikat maut
Bot ini menyimpan rata-rata berjalan dari semua nilai menuai sebelumnya serta waktu setiap bot telah menunggu. Menuai ketika telah menunggu lebih dari 3/4 dari bot lain dan menuai setidaknya 3/4 ukuran rata-rata menuai sejauh ini. Tujuannya adalah untuk mengambil banyak menuai risiko yang cukup masuk akal dan rendah.
Sunting: Memperbaiki beberapa kesalahan sintaksis yang memalukan.
Cobalah secara Online
sumber
self.obj.reaps
bukannyaself.reaps
danself.obj
bukannyaself.object
danprevReap
bukannyaprevLeap
dan tambahkan () setelahself.obj.players.values
dua kali. Dan saya pikirself.obj.reaps = []
tidak akan berhasil kecualiself.obj
objek. Saya tidak sepenuhnya yakin apakah semuanya masih berfungsi sebagaimana mestinya dan jika semua yang saya katakan adalah benar, tetapi setelah perubahan ini dan menggunakan Objek tiruanself.obj
ketika belum ada, kode Anda mengkompilasi untuk saya.class Object(object):
[baris baru]pass
di atas dan digunakanself.obj = Object()
dalamif not hasattr(..)
(jika saya ingat dengan benar).BetterRandom
Bot didasarkan pada asumsi bahwa peluang untuk menuai harus proporsional dengan ukuran menuai karena suatu titik adalah sebuah titik, tidak peduli kapan itu didapat. Selalu ada peluang yang sangat kecil untuk menuai, ini membuat perilaku dapat dieksploitasi. Pertama saya pikir itu akan langsung proporsional dan diasumsikan konstan proporsional berada di sekitar
1/mult^waittime
(menuai maksimum dengan asumsi setidaknya satu bot bermain serakah) setelah menjalankan beberapa simulasi saya menemukan bahwa ini memang konstanta optimal. Tetapi bot itu masih mengungguli oleh Random jadi saya menyimpulkan hubungan itu tidak secara langsung proporsional dan menambahkan konstanta untuk menghitung apa hubungan itu. Setelah beberapa simulasi saya menemukan itu terhadap set tes bot saya-1.5
adalah optimal. Ini sebenarnya sesuai dengan hubungan proporsional terbalik antara peluang menuai danreap*sqrt(reap)
yang mengejutkan. Jadi saya menduga ini sangat tergantung pada bot tertentu sehingga versi bot ini yang menghitung k saat bermain akan lebih baik. (Tapi saya tidak tahu apakah Anda diizinkan untuk menggunakan data dari putaran sebelumnya).EDIT: Saya membuat program untuk menemukan jenis proporsionalitas secara otomatis. Pada set tes
["myBot("+str(k)+")","Randombot","Greedybot","Every50","Jack","grim_reaper","Averager","mess"]
saya menemukan nilai baru.sumber
(reap/self.mult**self.waittime)**-0.810192835
selalu di atas 1, yaitu self.getRandom () tidak pernah lebih tinggi.self.obj
. Untuk melihat beberapa contoh cara menggunakannya, lihat beberapa bot lain yang menggunakannya.Target
Peluang saya untuk menang dengan kekacauan hampir tidak ada sekarang, jadi waktu untuk mengacaukan semua bot lainnya dalam banyak cara! :)
Bot ini fungsinya mirip dengan sniper. Setiap kali seseorang menuai, ia mengambil target acak dari siapa pun yang menuai. Kemudian, ia hanya menunggu sampai target itu hampir dapat menuai lagi dan menembaknya. Namun, itu tidak mengubah fokus - setelah Anda dipilih dan dikunci, Anda tidak dapat melarikan diri :)
sumber
Semua orang
Saya kira sudah waktunya untuk bot kedua saya tepat sebelum batas waktu.
Bot ini akan:
n
putaran, di manan
dihitung dengann = 3 + ceil(self.waittime / self.lenBots)
Kode:
Saya tidak terlalu sering memprogram dalam Python, jadi jika Anda melihat kesalahan, beri tahu saya.
sumber
subsequentRoundsWithoutReaps
menjadiroundsWithoutReaps
; huruf kecil bekas dengan garis bawah untuk nama metode; dan menghapus tanda kurung di if-statement. Terima kasih.prevReap
danlenBots
dan itu dan diasumsikan adalah camelCase seperti di Jawa. ;) Ah well, apa pun kasus yang kita gunakan, itu harus tetap bekerja. Ruang 2 bukannya 4 indentasi mungkin akan menyebabkan beberapa masalah, jadi terima kasih.Sedang berjalan: Proyek saya untuk memperluas T4T ke setiap KOTH terbuka.
Gayung bersambut
Tit untuk n Tats
Kevin
Hanya untuk membuat Anda tetap waspada.
sumber
self.last
bukan hal, tetapi Anda dapat membuatself.obj.last
sesuatu !. Bagaimanapun, saya akan menambahkan ketiga bot Anda untuk meme +1Joe rata-rata
Saya terinspirasi oleh Averager dan membuat bot yang menghitung rata-rata berapa banyak putaran yang diperlukan sebelum seseorang menuai dan mencoba memetik satu putaran sebelum itu.
sumber
HardCode
Ya itu.
Alih-alih rata-rata pada masa lalu menuai, gunakan rata-rata yang sudah dihitung sebelumnya pada menjalankan khas. Lagipula itu tidak akan membaik seiring waktu.
sumber