sheesh, apakah ini benar-benar yang ke-4? Untuk Anda semua yang sudah tua, tantangan intinya sama, tetapi kami menggunakan Java alih-alih bahasa khusus. Berikut adalah tiga tantangan CodeBot terakhir , jika Anda tertarik.
Tujuan dari CodeBots adalah membuat bot Anda menjadi virus semaksimal mungkin . Setiap bot membawa Bendera, dan Anda perlu memastikan bahwa Bendera Anda ada di mana - mana .
API
Bot akan mengikuti "protokol" standar, dan bot maju melalui langkah-langkah berikut secara serempak:
IPAddress selectMessageRecipient()
memungkinkan bot untuk memilih kepada siapa dia ingin mengirim pesan "ramah".Message sendMessage()
memungkinkan bot untuk memilih konten pesan yang akan dia kirim.processMessage(IPAddress, Message)
dipanggil untuk setiap pesan yang diterima bot.FunctionType selectFunctionToBlock()
memblokir fungsi agar tidak ditimpa untuk giliran saat ini. Lihat langkah 7.IPAddress selectAttackTarget()
memungkinkan bot untuk memilih siapa yang dia inginkan untuk DDOS. Serangan DDOS berhasil jika bot ditargetkan oleh 3 bot pada saat yang sama. Jika serangan berhasil, maka masing-masing penyerang dapat melakukan langkah 6 dan 7.readData(ReadonlyBot)
memungkinkan bot membaca data yang disimpan di bot rentan.FunctionType selectFunctionToReplace()
adalah inti dari tantangan ini . Anda diperbolehkan memilih 1 fungsi (dari 8 yang tercantum di sini) untuk menyalin dari bot Anda ke bot mereka. Kemudian, fungsi Anda akan dipanggil, bukan fungsi mereka . Jika beberapa bot memilih fungsi yang sama, yang acak akan berhasil.String getFlag()
dipanggil di akhir permainan, dan harus mengembalikan string yang unik ke kiriman Anda. Fungsi Anda harus selalu mengembalikan string yang sama. Pengajuan dengan bendera terbanyak di akhir pertandingan akan menang.
Penyimpanan
Anda memiliki 3 bentuk penyimpanan, Buku Alamat , Log , dan Variabel . Bentuk-bentuk penyimpanan ini bersifat lokal untuk bot yang digunakan oleh fungsi Anda (jadi jika fungsi Anda disalin, konten dari masing-masing objek ini akan berbeda). Semua objek ini dapat secara manual dimodifikasi atau dihapus. Untuk mendapatkan objek-objek ini, Anda memiliki pengambil di kelas Anda (misalnya getLog()
).
The AddressBook menyimpan daftar IPAddress , masing-masing dengan AddressType , yang memungkinkan Anda untuk mengklasifikasikan berbagai jenis alamat. AddressBook akan selalu mengandung setidaknya 1 alamat (jika dihapus, yang acak akan ditambahkan). Mengosongkan Buku Alamat Anda untuk mendapatkan beberapa Alamat IP tidak diizinkan.
The Log menyimpan daftar semua tindakan yang diambil, serta data tentang tindakan. Ini juga mencakup riwayat semua serangan yang berhasil (meskipun Anda tidak tahu fungsi mana yang ditimpa)
The Variabel objek memungkinkan Anda untuk menyimpan variabel string yang melekat pada nama string yang. Pada permulaan game, Variabel akan berisi satu variabel ID
,, yang berisi ID yang dibuat secara acak yang unik untuk jenis bot Anda.
Anda juga memiliki fungsi akses lain:
int getTurnNumber()
mengembalikan bilangan bulat dengan belokan saat inibool functionsMatch(ReadonlyBot, FunctionType)
tes untuk melihat apakah fungsi ReadonlyBot cocok dengan AndaIPAddress personalAddress()
mengembalikan Alamat IP Anda
Bagaimana cara mengimplementasikannya
- Anda dapat memperoleh kode dari Github
- Tambahkan bot Anda ke
\bots
folder, lalu tambahkan referensi ke bot Anda dicontroller\CodeBotFactory.java
- Bot Anda harus diperluas
codebots.bot.CodeBot
ataucodebots.bots.DefaultCodeBot
- Anda perlu Java 8 jika Anda ingin menjalankan controller.
- Anda dapat menjalankan kode (dengan asumsi Anda berada di
/src
folder) gunakanjavac codebots\*.java
untuk mengkompilasi, kemudianjava codebots.Main
untuk menjalankan. - Anda mungkin tidak memiliki setiap variabel anggota non-konstan di kelas Anda
- Refleksi tidak diperbolehkan.
- Bentuk komunikasi antara bot (dari jenis yang sama atau berbeda) di luar metode yang tercantum di atas tidak diperbolehkan.
- Bot bisu dan / atau bunuh diri diizinkan, tetapi semua bot harus berbeda secara fungsional dari entri yang ada.
- Jika Anda ingin keacakan dalam bot Anda, gunakan
getRandom()
- Cobalah menjaga agar kode Anda tetap efisien. Saya telah menghabiskan banyak waktu membuat profil dan membuat controller cepat.
Skor
105.2501 Expelliarmus!
104.5803 Saya Membantu!
104.2746 Siapakah Aku?
103.8529 Dumb Bot
103.2028 Replacer
102.7045 Chaos
102.4046 Hermit Bot
102.2849 Swarmer
100.5598 Bot acak mencintaimu
99.966 Percaya pada Kepercayaan!
99.0185 codebots.bots.DefaultCodeBot
91.2942 codebots.bots.MarkedBot
91.1423 Hanya robot pengirim surat ramah lingkungan Anda.
89.4645 null
sumber
Jawaban:
TrustBot
Jika Anda mengiriminya pesan, dia akan melakukan apa yang dikatakannya. Jika dia membaca bot, dia akan menyalin alamat langsung ke bukunya. Dia menyerang bot yang dikatakan buku alamat untuk diserang.
sumber
AmnesiaBot
Bot acak yang menyuntikkan bot lain dengan kode kehilangan memori. Setiap fungsi dimulai dengan kode untuk menghapus log, Buku Alamat dan Variabel. Kode ini akan membuat bot pintar kehilangan memori, dalam upaya menghilangkan logika.
sumber
NullBot
Benderanya sangat ... karakteristik ...
Ini juga dimaksudkan untuk menguji pengontrol dan batas aturan "bisu diizinkan".
sumber
null
adalah sebuah string. ;) Hanya string mewah.RandomCodeBot
Entri KoTH acak wajib
sumber
DisarmerBot
DisarmerBot tidak terlalu cerdas. Jika menerima instruksi serangan, ia akan memilih penyerang acak, jika tidak, ia akan menyerang pemain acak. Itu hanya mengabaikan
selectFunctionToBlock
fungsi mereka untuk memblokirselectFunctionToBlock
.sumber
MarkedBot
Menandai dirinya sendiri pada putaran pertama, dan menggunakan info itu di putaran selanjutnya. Dengan begitu, jika bot lain disuntik dengan kode serangannya, itu tidak akan efektif.
sumber
SwarmBot
Bot yang tidak terkenal ini agak rumit (dan sejauh ini paling rumit diajukan), tetapi saya mencoba bot yang secara sistematis mengganti semua metode target sebelum pindah ke target baru. Ia mencoba untuk mengidentifikasi salinan dirinya dan memperlakukan mereka sebagai sekutu, secara berkala memeriksa mereka untuk memastikan integritas. Saya belum datang dengan nama yang lebih baik.
Menautkan ke cabang repo github, karena bot ini panjangnya 340 baris.
https://github.com/Draco18s/CodeBots4/blob/master/src/codebots/bots/SwarmBot.java
Beberapa poin menarik:
Variables
dan menambah setiap putaran. Ini harus mengikuti aturan "tidak ada variabel tidak konstan".functionsMatch
metode yang ditambahkan . TanpafunctionsMatch
itu tidak mungkin untuk menulis bot yang bisa membuat keputusan yang berarti, karena itu buta. Itu bisa membaca variabel target dan log, tetapi tidak tahu apa-apa tentang status targetnya.Kemungkinan masih ada beberapa peningkatan yang mungkin, tetapi saya tidak bisa melihatnya. Baris 198-205 mungkin adalah babi kinerja, tetapi sampai kelas IPAddress memungkinkan alamat dilarutkan dari disimpan dalam Variabel, ini diperlukan (karena bot tidak memiliki sarana untuk memvalidasi alamat, setiap penyimpanan alamat yang tidak valid menyebabkan permainan bungkus target nol dalam ReadOnlyBot, lempar NPE).
Edit: Pembaruan 12/12/15
Tweak beberapa parameter pada
getTurnNumber()
logika memungkinkan untuk beberapa peningkatan kinerja. Peningkatan dari 5% menjadi 10% dalam penargetan game akhir bernilai sekitar 15 poin, juga meningkatkan penargetan game awal dari 5% menjadi 8%. Gabungan bot ini sekarang dapat (hampir) bertahan bahkan ketika dihadapkan dengan AmnesiaaBot (mencapai peringkat 2 dengan skor 110, di mana HelperBot mencapai sekitar 117).Bahkan dengan tweak ini, itu bisa menjadi sial, jadi untuk 10 putaran kisaran skornya adalah sekitar 170-185.
sumber
new IPAddress
seharusnya "mencari dari buku alamat" seperti yang telah saya lakukanreadData
. Saya mengekstrak lookup dan saluran tetap 143.DefaultCodeBot
Berusaha melakukan hal-hal yang masuk akal. (Ganti kelas ini jika Anda tidak ingin mengimplementasikan semua fungsi)
sumber
HelperBot
Bot pembantu tidak melakukan apa pun selain mencoba menyebarkan benderanya sendiri ... atau setidaknya bender yang saat ini disebutnya ...
Jika HelperBot mengasumsikan bahwa metode apa pun yang ditimpa (selain
getFlag()
) akan ditimpa dengan sesuatu yang lebih baik.sumber
Kekacauan
Dia membebaskan semua bendera dari tirani yang diblokir.
sumber
Replacer
Entri ini menggantikan semua
selectFunctionToReplace
fungsi dengan fungsinya sendiriselectFunctionToReplace
.sumber
MailBot
Mailbot hanya menangani pesan. Ini tidak berhasil mengeluarkan benderanya sendiri ke dunia (skor rata-rata ~ 50, sedikit lebih tinggi dari nullbot pada ~ 45), tetapi kirimkan pesan dan itu akan meneruskan alamat Anda ke orang lain.
Saya mempertimbangkan untuk menyimpan detail sehingga akan meneruskan seluruh pesan ke bot baru (konten dan bendera) daripada hanya IP pengirim, tetapi itu akan melibatkan penggunaan variabel yang besar tanpa keuntungan fungsional apa pun, terutama mengingat AmnesiaBot sedang bermain.
sumber
DumbBot
Ugh, ini terasa kotor. Ini mungkin satu-satunya yang mengalahkan AmnesiaBot. Pada kenyataannya, ini hanya RandomBot khusus: ia mendapat bot acak dalam simulasi (via
getAddressBook().clear()
) dan secara acak menggantikan fungsi Blok atau fungsi Bendera. Itu dia. Dengan memilih hanya dua, tingkat penyebaran bendera lebih tinggi daripada AmnesiaBot atau HelperBot, tetapi hanya sedikit setelah 3000 putaran:Saya sedikit mengutak-atik fungsi penggantian, tetapi pada akhirnya, ini adalah versi yang paling sukses.
sumber
Hermit Bot
Dia hidup sendiri dan berbicara hanya untuk dirinya sendiri. Jika lebih sedikit orang yang tahu siapa dia, maka dia akan lebih sedikit terganggu. Jika seseorang mengganggunya, dia akan menyerang mereka sampai orang lain mengganggunya.
sumber