Kode Bots 4: Pemrograman Fungsional

25

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:

  1. IPAddress selectMessageRecipient() memungkinkan bot untuk memilih kepada siapa dia ingin mengirim pesan "ramah".
  2. Message sendMessage() memungkinkan bot untuk memilih konten pesan yang akan dia kirim.
  3. processMessage(IPAddress, Message) dipanggil untuk setiap pesan yang diterima bot.
  4. FunctionType selectFunctionToBlock()memblokir fungsi agar tidak ditimpa untuk giliran saat ini. Lihat langkah 7.
  5. 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.
  6. readData(ReadonlyBot) memungkinkan bot membaca data yang disimpan di bot rentan.
  7. 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.
  8. 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 ini
  • bool functionsMatch(ReadonlyBot, FunctionType) tes untuk melihat apakah fungsi ReadonlyBot cocok dengan Anda
  • IPAddress personalAddress() mengembalikan Alamat IP Anda

Bagaimana cara mengimplementasikannya

  • Anda dapat memperoleh kode dari Github
  • Tambahkan bot Anda ke \botsfolder, lalu tambahkan referensi ke bot Anda dicontroller\CodeBotFactory.java
  • Bot Anda harus diperluas codebots.bot.CodeBotataucodebots.bots.DefaultCodeBot
  • Anda perlu Java 8 jika Anda ingin menjalankan controller.
  • Anda dapat menjalankan kode (dengan asumsi Anda berada di /srcfolder) gunakan javac codebots\*.javauntuk mengkompilasi, kemudian java codebots.Mainuntuk 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

Nathan Merrill
sumber
Anda mungkin harus membuat Log.LogEntry final, dengan itu bukan final, saya dapat membuat log dengan informasi yang saya inginkan ... bahwa hanya fungsi bot saya yang dapat membaca atau membuat.
TheNumberOne
Bisakah readData mengakses IpAddress dari bot yang dibacanya?
TheNumberOne
@ TheNumberOne saat ini tidak, tapi saya tidak mengerti mengapa tidak. Saya tidak memiliki kode pada saya sekarang, tetapi saya akan memperbarui kode untuk mengubahnya.
Nathan Merrill
3
Saya merasa menarik bahwa Chaos membuat DisarmBot dan MarkedBot bertukar posisi di papan pimpinan.
TheNumberOne
1
Saat ini pada putaran 7850 dari 10.000, mendapatkan skor yang lebih akurat ...
LegionMammal978

Jawaban:

4

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.

package codebots.bots;

import codebots.bot.CodeBot;
import codebots.bot.ReadonlyBot;
import codebots.gameobjects.*;
import java.util.*;

public class TrustBot extends CodeBot {
    @Override
    public IPAddress selectMessageRecipient() {
        AddressBook book = getAddressBook();
        return book.getAddress(getRandom().nextInt(book.size()));
    }

    @Override
    public Message sendMessage() {
        AddressBook book = getAddressBook();
        return new Message(Message.MessageType.INFORM, book.getAddress(getRandom().nextInt(book.size())));
    }

    @Override
    public void processMessage(IPAddress s, Message m) {
        AddressBook book = getAddressBook();
        if(m.getAddress() != null){
            if(m.getType() == Message.MessageType.ATTACK){
                book.add(m.getAddress(), AddressBook.AddressType.TO_ATTACK);
            }
            else if(m.getType() == Message.MessageType.HELP){
                book.add(m.getAddress(), AddressBook.AddressType.TO_DEFEND);
            }
            else if(m.getType() == Message.MessageType.CONFIRM){
                book.add(m.getAddress(), AddressBook.AddressType.TRUSTED);
            }
            else if(m.getType() == Message.MessageType.REJECT){
                book.add(m.getAddress(), AddressBook.AddressType.UNTRUSTED);
            }
            else if(m.getType() == Message.MessageType.AVOID){
                book.remove(m.getAddress());
            }
            else{
                book.add(m.getAddress());
            }
        }else{
            Message msg = new Message(m.getType(), s);
            processMessage(s, msg);
        }
    }

    @Override
    public FunctionType selectFunctionToBlock() {
        return FunctionType.SELECT_FUNCTION_TO_BLOCK;
    }

    @Override
    public IPAddress selectAttackTarget() {
        AddressBook book = getAddressBook();
        List<IPAddress> l;
        l = book.getAddressesOfType(AddressBook.AddressType.TO_ATTACK);
        Iterator<IPAddress> I = l.iterator();
        if(!I.hasNext())
            return book.getAddress(getRandom().nextInt(book.size()));
        return I.next();
    }

    @Override
    public void readData(ReadonlyBot bot) {
        AddressBook myBook = getAddressBook();
        ReadonlyAddressBook hisBook = bot.getAddressBook();
        AddressBook.AddressType[] values = AddressBook.AddressType.values();
        for(int i=0;i<values.length;i++){
            myBook.addAll(hisBook.getAddressesOfType(values[i]), values[i]);
        }
    }

    @Override
    public FunctionType selectFunctionToReplace() {
        return getRandom().nextInt(2)==1?FunctionType.GET_FLAG:FunctionType.SELECT_FUNCTION_TO_BLOCK;
    }

    @Override
    public String getFlag() {
        return "Trust in Trust!";
    }
}
MegaTom
sumber
4

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.

package codebots.bots;

import codebots.bot.CodeBot;
import codebots.bot.ReadonlyBot;
import codebots.gameobjects.*;

public class AmnesiaBot extends CodeBot {

    private void clear(){
        getAddressBook().clear();
        getAddressBook().add(getAddressBook().getAddress(0), AddressBook.AddressType.TRUSTED);
        getVariables().clear();
        getLog().clear();
    }

    @Override
    public IPAddress selectMessageRecipient() {
        clear();
        return getAddressBook().getAddress(0);
    }

    @Override
    public Message sendMessage() {
        clear();
        Message.MessageType[] values = Message.MessageType.values();
        return new Message(values[getRandom().nextInt(values.length)], getAddressBook().getAddress(0));
    }

    @Override
    public void processMessage(IPAddress source, Message message) {
        clear();
    }

    @Override
    public FunctionType selectFunctionToBlock() {
        clear();
        return getTurnNumber() % 2 == 0 ?
             FunctionType.GET_FLAG: FunctionType.SELECT_FUNCTION_TO_BLOCK;
    }

    @Override
    public IPAddress selectAttackTarget() {
        clear();
        return getAddressBook().getAddress(0);
    }

    @Override
    public void readData(ReadonlyBot bot) {
        clear();
    }

    @Override
    public FunctionType selectFunctionToReplace() {
        clear();
        FunctionType[] values =  FunctionType.values();
        return values[getRandom().nextInt(values.length)];
        //random gives a 7/8 chance of successes. 
    }

    @Override
    public String getFlag() {
        return "Who Am I?";
    }
}
MegaTom
sumber
Saya pikir yang ini menang hanya karena ketidakmampuan skrip yang lebih pintar untuk dapat mengingat apa pun. yaitu membersihkan objek Variabel sangat kuat.
Draco18s
@ draco18s ini sebenarnya bukan jawaban serius ...
MegaTom
Aku tahu! Itu sebabnya saya sangat bingung karenanya. XD
Draco18s
3

NullBot

Benderanya sangat ... karakteristik ...

package codebots.bots;
import codebots.gameobjects.*;
public class NullBot extends DefaultCodeBot {
    public IPAddress selectMessageRecipient() {
        return null;
    }
    public Message sendMessage() {
        return null;
    }
    public IPAddress selectAttackTarget() {
        return null;
    }
    public FunctionType selectFunctionToReplace() {
        return null;
    }
    public FunctionType selectFunctionToBlock() {
        return null;
    }
    public String getFlag(){
        return null;
    }
}

Ini juga dimaksudkan untuk menguji pengontrol dan batas aturan "bisu diizinkan".

TheNumberOne
sumber
Secara teknis dia tidak sesuai dengan spesifikasi, karena dia tidak benar-benar mengembalikan String untuk benderanya.
TheNumberOne
3
nulladalah sebuah string. ;) Hanya string mewah.
Addison Crump
Ini membuat saya mengenali kesalahan dalam spec saya, yang telah ditentukan: "semua bot harus secara fungsional berbeda dari entri yang ada"
Nathan Merrill
@NathanMerrill Tetap untuk lebih dekat mengikuti spec.
TheNumberOne
3

RandomCodeBot

Entri KoTH acak wajib

package codebots.bots;

import codebots.bot.CodeBot;
import codebots.bot.ReadonlyBot;
import codebots.gameobjects.AddressBook;
import codebots.gameobjects.FunctionType;
import codebots.gameobjects.IPAddress;
import codebots.gameobjects.Message;

public class RandomCodeBot extends CodeBot {

    @Override
    public IPAddress selectMessageRecipient() {
        AddressBook book = getAddressBook();
        return book.getAddress(getRandom().nextInt(book.size()));
    }

    @Override
    public Message sendMessage() {
        Message.MessageType[] values = Message.MessageType.values();
        return new Message(values[getRandom().nextInt(values.length)]);
    }

    @Override
    public void processMessage(IPAddress source, Message message) {

    }

    @Override
    public FunctionType selectFunctionToBlock() {
        FunctionType[] values =  FunctionType.values();
        return values[getRandom().nextInt(values.length)];
    }

    @Override
    public IPAddress selectAttackTarget() {
        AddressBook book = getAddressBook();
        return book.getAddress(getRandom().nextInt(book.size()));
    }

    @Override
    public void readData(ReadonlyBot bot) {

    }

    @Override
    public FunctionType selectFunctionToReplace() {
        FunctionType[] values =  FunctionType.values();
        return values[getRandom().nextInt(values.length)];
    }

    @Override
    public String getFlag() {
        return "Random bot loves you";
    }
}
Nathan Merrill
sumber
3

DisarmerBot

DisarmerBot tidak terlalu cerdas. Jika menerima instruksi serangan, ia akan memilih penyerang acak, jika tidak, ia akan menyerang pemain acak. Itu hanya mengabaikan selectFunctionToBlockfungsi mereka untuk memblokir selectFunctionToBlock.

package codebots.bots;

import codebots.bot.CodeBot;
import codebots.bot.ReadonlyBot;
import codebots.gameobjects.*;

import java.util.ArrayList;
import java.util.List;

public class DisarmerBot extends CodeBot {
    public IPAddress selectMessageRecipient() { return null; }
    public Message sendMessage() { return null; }

    public void processMessage(IPAddress source, Message message) {
        if (message != null && message.getAddress() != null && message.getType() == Message.MessageType.ATTACK)
            getAddressBook().add(message.getAddress());
    }

    public IPAddress selectAttackTarget() {
        AddressBook book = getAddressBook();
        List<IPAddress> attack = book.allAddresses();
        if (attack.size() > 0) {
            IPAddress bot = attack.get(getRandom().nextInt(attack.size()));
            book.clear();
            return bot;
        }
        //Umm...
        book.clear();
        return book.getAddress(0);
    }

    public void readData(ReadonlyBot bot) { getLog().clear(); /*Safety*/ }
    public FunctionType selectFunctionToReplace() { return FunctionType.SELECT_FUNCTION_TO_BLOCK; }
    public FunctionType selectFunctionToBlock() { return FunctionType.SELECT_FUNCTION_TO_BLOCK; }
    public String getFlag() { return "Expelliarmus!"; }
}
LegionMammal978
sumber
Anda dapat memilih alamat ke-n tanpa perlu melakukan semua Alamat (). Jika Anda melihat bot acak saya, itu sedang melakukan pemilihan alamat acak. Saya telah memperbarui kode Anda di Github (untuk alasan efisiensi), tetapi jika Anda merasa itu tidak berhasil, saya senang untuk mengembalikannya.
Nathan Merrill
Oh, salahku, sudah diperbaiki.
Nathan Merrill
3

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.

package codebots.bots;

import codebots.bot.CodeBot;
import codebots.bot.ReadonlyBot;
import codebots.gameobjects.*;

public class MarkedBot extends CodeBot {

    @Override
    public IPAddress selectMessageRecipient() {
        Variables v = getVariables();
        AddressBook ab = getAddressBook();
        if(getTurnNumber()==0)
            v.add(v.get("ID"),"true");
        if("true".equals(v.get("hasOurFlag"))){
            ab.remove(ab.getAddress(0));
            v.remove("hasOurFlag");
        }
        return ab.getAddress(0);
    }

    @Override
    public Message sendMessage() {
        return new Message(Message.MessageType.STOP);
    }

    @Override
    public void processMessage(IPAddress source, Message message) {
        if(message.getType() != Message.MessageType.STOP)
            getAddressBook().add(source, AddressBook.AddressType.TO_ATTACK);
    }

    @Override
    public FunctionType selectFunctionToBlock() {
        Variables v = getVariables();
        if("true".equals(v.get(v.get("ID"))))
            return FunctionType.GET_FLAG;
        return FunctionType.SELECT_FUNCTION_TO_BLOCK;
    }

    @Override
    public IPAddress selectAttackTarget() {
        Variables v = getVariables();
        if("true".equals(v.get(v.get("ID"))))
            return getAddressBook().getAddress(0);
        else
            return null;
    }

    @Override
    public void readData(ReadonlyBot bot) {
        Variables v = getVariables();
        if(functionsMatch(bot, FunctionType.GET_FLAG))
            v.add("hasOurFlag", "true");
        else if("false".equals(v.get("hasOurFlag")))
            v.add("hasOurFlag", "false2");
        else
            v.add("hasOurFlag", "false");
    }

    @Override
    public FunctionType selectFunctionToReplace() {
        Variables v = getVariables();
        if("true".equals(v.get(v.get("ID"))))
            if(!v.has("hasOurFlag") || "false".equals(v.get("hasOurFlag")))
                return FunctionType.GET_FLAG;
            else if("false2".equals(v.get("hasOurFlag")))
                return FunctionType.SELECT_FUNCTION_TO_BLOCK;
            else
                return FunctionType.SEND_MESSAGE;
        return FunctionType.SELECT_FUNCTION_TO_REPLACE;
    }

    @Override
    public String getFlag() {
        return this.getClass().getName();
    }
}
MegaTom
sumber
Saya menemukan beberapa bug di bot ini (kesalahan ketik, menggunakan == alih-alih sama dengan) Anda juga menemukan kesalahan pada sistem saya: Anda seharusnya tidak dapat membuat IPAddresses acak baru. Saya telah memperbaiki masalah itu (dan menghapus kode yang melakukannya). Anda dapat menemukan kode yang diperbarui di github
Nathan Merrill
Juga, selamat atas posisi teratas!
Nathan Merrill
HelperBot tidak terlalu pintar. Itu hanya menjadi teratas karena semua bot lainnya bodoh. : P Ini mungkin bot efektif pertama .
Draco18s
1
@NathanMerrill Apakah itu berarti kita tidak lagi diizinkan membuat IPAdresses palsu untuk penipuan? (Jika itu masalahnya saya perlu mendesain ulang milik saya)
Nic Robertson
Bot tidak pernah memiliki akses ke putaran itu dengan sengaja. Anda dapat menggunakan alamat IP lawan sebagai pemalsuan, tetapi membuatnya tidak diizinkan. Juga, konstanta adalah variabel yang diatur pada waktu statis atau waktu inisialisasi.
Nathan Merrill
2

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:

  • Baris 14-24 hanyalah daftar yang tidak dapat dimodifikasi yang membuatnya mudah untuk mengubah urutan di mana bot menggantikan metode targetnya. Ini menyimpan yang mengindeks Variablesdan menambah setiap putaran. Ini harus mengikuti aturan "tidak ada variabel tidak konstan".
  • Baris 203-217 berurusan dengan verifikasi sekutu. Kami sebenarnya tidak peduli bahwa bot lain mengimplementasikan semua delapan dari petunjuk kami. Hanya empat yang penting, dan jika kita kehilangan satu di sekutu "tepercaya", kita menggantinya dengan milik kita.
  • Garis 295-300 adalah dorongan efektifitas yang tidak terduga. Dengan melindungi Bendera kami pada dua putaran pertama permainan, kami menghindari bot bodoh menggantikan Bendera kami sebelum kami memiliki kesempatan untuk menyebar sangat jauh. Menunggu lebih lama, bagaimanapun, memberi bot lain kesempatan untuk mengganti BlockFunction kami dan itu menyebabkan kinerja menurun (diduga karena RandomBot mengganggu sekutu yang berusaha untuk membatalkan korupsi).
  • Untuk waktu yang paling lama selama pengembangan bot ini, bot ini menyebabkan HelperBot melonjak ke depan, pada satu titik melanggar tanda 130, sementara bot ini mendekam di kisaran 81-98, tetapi setelah menyeret efektivitas MarkedBot dan DefaultBot turun beberapa poin.
  • Bot ini hanya mungkin dengan functionsMatchmetode yang ditambahkan . Tanpa functionsMatchitu 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.

Draco18s
sumber
Luar biasa! Disengaja bahwa Anda tidak dapat membuat IPAddresses dari string.
Nathan Merrill
Sepertinya, ya! (Atau bot akan membuat yang sewenang-wenang untuk menemukan bot baru). Masalahnya adalah jika Anda melakukan crash crash. ;)
Draco18s
Mm, pada saluran 143 Anda menggunakan konstruktor yang tidak ada.
TheNumberOne
@ TheNumberOne itu valid ketika saya menulisnya. Nathan mungkin memperbarui pangkalan itu.
Draco18s
@TheNumberOne pembaruan dibuat. Telepon itu new IPAddressseharusnya "mencari dari buku alamat" seperti yang telah saya lakukan readData. Saya mengekstrak lookup dan saluran tetap 143.
Draco18s
1

DefaultCodeBot

Berusaha melakukan hal-hal yang masuk akal. (Ganti kelas ini jika Anda tidak ingin mengimplementasikan semua fungsi)

package codebots.bots;

import codebots.bot.CodeBot;
import codebots.bot.ReadonlyBot;
import codebots.gameobjects.FunctionType;
import codebots.gameobjects.IPAddress;
import codebots.gameobjects.Message;

public class DefaultCodeBot extends CodeBot {

    @Override
    public IPAddress selectMessageRecipient() {
        return getAddressBook().getAddress(0);
    }

    @Override
    public Message sendMessage() {
        return new Message(Message.MessageType.INFORM);
    }

    @Override
    public void processMessage(IPAddress source, Message message) {

    }

    @Override
    public FunctionType selectFunctionToBlock() {
        return FunctionType.GET_FLAG;
    }

    @Override
    public IPAddress selectAttackTarget() {
        return getAddressBook().getAddress(0);
    }

    @Override
    public void readData(ReadonlyBot bot) {

    }

    @Override
    public FunctionType selectFunctionToReplace() {
        return FunctionType.GET_FLAG;
    }

    @Override
    public String getFlag() {
        return this.getClass().getName();
    }
}
Nathan Merrill
sumber
1

HelperBot

Bot pembantu tidak melakukan apa pun selain mencoba menyebarkan benderanya sendiri ... atau setidaknya bender yang saat ini disebutnya ...

package codebots.bots;

import codebots.bot.CodeBot;
import codebots.bot.ReadonlyBot;
import codebots.gameobjects.FunctionType;
import codebots.gameobjects.IPAddress;
import codebots.gameobjects.Message;

public class HelperBot extends CodeBot {

    @Override
    public IPAddress selectMessageRecipient() {
        getAddressBook().clear();
        return getAddressBook().getAddress(0);
    }

    @Override
    public Message sendMessage() {
        return new Message(Message.MessageType.INFORM);
    }

    @Override
    public void processMessage(IPAddress source, Message message) {

    }

    @Override
    public FunctionType selectFunctionToBlock() {
        return FunctionType.GET_FLAG;
    }

    @Override
    public IPAddress selectAttackTarget() {
        getAddressBook().clear();
        return getAddressBook().getAddress(0);
    }

    @Override
    public void readData(ReadonlyBot bot) {

    }

    @Override
    public FunctionType selectFunctionToReplace() {
        return FunctionType.GET_FLAG;
    }

    @Override
    public String getFlag() {
        return "I'm Helping!";
    }
}

Jika HelperBot mengasumsikan bahwa metode apa pun yang ditimpa (selain getFlag()) akan ditimpa dengan sesuatu yang lebih baik.

Draco18s
sumber
1

Kekacauan

Dia membebaskan semua bendera dari tirani yang diblokir.

package codebots.bots;

import codebots.bot.ReadonlyBot;
import codebots.gameobjects.FunctionType;
import codebots.gameobjects.IPAddress;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by thenumberone on 12/11/15.
 *
 * @author thenumberone
 */
public class Chaos extends DefaultCodeBot{

    private static final String NAME = "Chaos";
    private static final String BLOCK = NAME + ":BLOCK";
    private static final String ATTACK = NAME + ":ATTACK";
    private static final String REPLACE = NAME + ":REPLACE";
    private static final String READ = NAME + ":READ";
    private static final String FLAG = NAME + ":FLAG";
    private static final String SELECT = NAME + ":SELECT";
    private static final String SEND = NAME + ":SEND";

    private static final Map<String, FunctionType> commands;

    private static final String[] REPLACEMENT_ORDER = {
            BLOCK,
            FLAG,
            REPLACE,
            READ,
            ATTACK,
    };

    private static final String DEFAULT = BLOCK;
    private static final String BLOCK_FUNCTION = BLOCK;

    static {
        Map<String, FunctionType> c = new HashMap<>();
        c.put(BLOCK, FunctionType.SELECT_FUNCTION_TO_BLOCK);
        c.put(ATTACK, FunctionType.SELECT_ATTACK_TARGET);
        c.put(REPLACE, FunctionType.SELECT_FUNCTION_TO_REPLACE);
        c.put(READ, FunctionType.READ_DATA);
        c.put(FLAG, FunctionType.GET_FLAG);
        c.put(SELECT, FunctionType.SELECT_MESSAGE_RECIPIENTS);
        c.put(SEND, FunctionType.SEND_MESSAGE);
        commands = Collections.unmodifiableMap(c);
    }

    @Override
    public String getFlag() {
        return NAME;
    }

    @Override
    public void readData(ReadonlyBot bot) {
        for (String command : commands.keySet()){
            getVariables().remove(command);
        }
        for (String command : REPLACEMENT_ORDER){
            if (!functionsMatch(bot, commands.get(command))) {
                getVariables().add(command, "");
                return;
            }
        }
    }

    @Override
    public FunctionType selectFunctionToBlock() {
        return commands.get(BLOCK_FUNCTION);
    }

    @Override
    public IPAddress selectAttackTarget() {
        getAddressBook().clear();
        return getAddressBook().getAddress(0);
    }

    @Override
    public FunctionType selectFunctionToReplace() {
        for (String command : REPLACEMENT_ORDER){
            if (getVariables().has(command)) {
                getVariables().remove(command);
                return commands.get(command);
            }
        }
        return commands.get(DEFAULT);
    }
}
TheNumberOne
sumber
1

Replacer

Entri ini menggantikan semua selectFunctionToReplacefungsi dengan fungsinya sendiri selectFunctionToReplace.

package codebots.bots;

import codebots.bot.ReadonlyBot;
import codebots.gameobjects.FunctionType;
import codebots.gameobjects.IPAddress;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by thenumberone on 12/11/15.
 *
 * @author thenumberone
 */
public class Replacer extends DefaultCodeBot{

    private static final String NAME = "Replacer";
    private static final String BLOCK = NAME + ":BLOCK";
    private static final String ATTACK = NAME + ":ATTACK";
    private static final String REPLACE = NAME + ":REPLACE";
    private static final String READ = NAME + ":READ";
    private static final String FLAG = NAME + ":FLAG";
    private static final String SELECT = NAME + ":SELECT";
    private static final String SEND = NAME + ":SEND";

    private static final Map<String, FunctionType> commands;

    private static final String[] REPLACEMENT_ORDER = {
            REPLACE,
            FLAG,
            READ,
            ATTACK
    };

    private static final String DEFAULT = REPLACE;
    private static final String BLOCK_FUNCTION = FLAG;

    static {
        Map<String, FunctionType> c = new HashMap<>();
        c.put(BLOCK, FunctionType.SELECT_FUNCTION_TO_BLOCK);
        c.put(ATTACK, FunctionType.SELECT_ATTACK_TARGET);
        c.put(REPLACE, FunctionType.SELECT_FUNCTION_TO_REPLACE);
        c.put(READ, FunctionType.READ_DATA);
        c.put(FLAG, FunctionType.GET_FLAG);
        c.put(SELECT, FunctionType.SELECT_MESSAGE_RECIPIENTS);
        c.put(SEND, FunctionType.SEND_MESSAGE);
        commands = Collections.unmodifiableMap(c);
    }

    @Override
    public String getFlag() {
        return NAME;
    }

    @Override
    public void readData(ReadonlyBot bot) {
        for (String command : commands.keySet()){
            getVariables().remove(command);
        }
        for (String command : REPLACEMENT_ORDER){
            if (!functionsMatch(bot, commands.get(command))) {
                getVariables().add(command, "");
                return;
            }
        }
    }

    @Override
    public FunctionType selectFunctionToBlock() {
        return commands.get(BLOCK_FUNCTION);
    }

    @Override
    public IPAddress selectAttackTarget() {
        getAddressBook().clear();
        return getAddressBook().getAddress(0);
    }

    @Override
    public FunctionType selectFunctionToReplace() {
        for (String command : REPLACEMENT_ORDER){
            if (getVariables().has(command)) {
                getVariables().remove(command);
                return commands.get(command);
            }
        }
        return commands.get(DEFAULT);
    }
}
TheNumberOne
sumber
1

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.

package codebots.bots;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import codebots.bot.ReadonlyBot;
import codebots.gameobjects.AddressBook;
import codebots.gameobjects.FunctionType;
import codebots.gameobjects.IPAddress;
import codebots.gameobjects.Message;

public class MailBot extends DefaultCodeBot {
    private final String TEAM = "Just your friendly neighborhood mail delivering robot.";
    private final String TEAMALT = "Mailmain";
    private final List<FunctionType> funcList;
    {
        List<FunctionType> list = new ArrayList<FunctionType>();
        list.add(FunctionType.SELECT_MESSAGE_RECIPIENTS);
        list.add(FunctionType.SEND_MESSAGE);
        list.add(FunctionType.PROCESS_MESSAGE);
        funcList = Collections.unmodifiableList(list);
    }

    @Override
    public IPAddress selectMessageRecipient() {
        AddressBook book = getAddressBook();
        IPAddress ip;
        List<IPAddress> l = book.getAddressesOfType(AddressBook.AddressType.TO_ATTACK);
        if(l.size() > 0) {
            ip = l.get(0);
            book.add(ip,AddressBook.AddressType.UNTRUSTED);
            return ip;
        }
        ip = book.getAddress(getRandom().nextInt(book.size()));
        book.add(ip,AddressBook.AddressType.UNTRUSTED);
        return ip;
    }

    @Override
    public Message sendMessage() {
        AddressBook book = getAddressBook();
        IPAddress ip;

        List<IPAddress> l = book.getAddressesOfType(AddressBook.AddressType.UNTRUSTED);
        if(l.size() > 0) {
            ip = l.get(0);
            book.add(ip,AddressBook.AddressType.TO_DEFEND);
            return new Message(Message.MessageType.INFORM,ip);
        }

        ip = book.getAddress(getRandom().nextInt(book.size()));
        book.add(ip,AddressBook.AddressType.UNTRUSTED);
        return new Message(Message.MessageType.INFORM,ip);
    }

    @Override
    public void processMessage(IPAddress source, Message message) {
        AddressBook book = getAddressBook();
        book.add(source,AddressBook.AddressType.TO_ATTACK);
        if(message.getAddress() != null)
            book.add(message.getAddress(),AddressBook.AddressType.TO_ATTACK);
    }

    @Override
    public FunctionType selectFunctionToBlock() {
        return FunctionType.SEND_MESSAGE;
    }

    @Override
    public IPAddress selectAttackTarget() {
        //Mailbot doesn't attack
        return null;
    }

    @Override
    public void readData(ReadonlyBot bot) { }

    @Override
    public FunctionType selectFunctionToReplace() {
        //if our attack selection gets overwritten,
        //then attack a message-based function
        return funcList.get(getTurnNumber()%3);
    }

    @Override
    public String getFlag() {
        return TEAM;
        //if flag is too long, use:
        //return TEAMALT;
    }
}

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.

Draco18s
sumber
1

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:

Round 2999
105.50666666666666  Dumb Bot
105.07266666666666  Who Am I?
103.541             I'm Helping!
102.94833333333334  Swarmer
102.82033333333334  Chaos
102.82033333333334  Replacer
101.55666666666667  Expelliarmus!
101.25833333333334  Trust in Trust!
100.347             Random bot loves you
99.22233333333334   codebots.bots.DefaultCodeBot
92.62733333333334   codebots.bots.MarkedBot
91.80966666666667   Just your friendly neighborhood mail delivering robot.
90.46933333333334   null

Saya sedikit mengutak-atik fungsi penggantian, tetapi pada akhirnya, ini adalah versi yang paling sukses.

package codebots.bots;

import codebots.bot.CodeBot;
import codebots.bot.ReadonlyBot;
import codebots.gameobjects.AddressBook;
import codebots.gameobjects.FunctionType;
import codebots.gameobjects.IPAddress;
import codebots.gameobjects.Message;

public class DumbBot extends CodeBot {


    @Override
    public FunctionType selectFunctionToBlock() {
        return getRandom().nextBoolean()?FunctionType.SELECT_FUNCTION_TO_BLOCK:FunctionType.GET_FLAG;
    }

    @Override
    public IPAddress selectAttackTarget() {
        AddressBook book = getAddressBook();
        book.clear();
        return book.getAddress(getRandom().nextInt(book.size()));
    }

    @Override
    public FunctionType selectFunctionToReplace() {
        return getRandom().nextBoolean()?FunctionType.SELECT_FUNCTION_TO_BLOCK:FunctionType.GET_FLAG;
    }

    @Override
    public void readData(ReadonlyBot bot) {

    }

    @Override
    public IPAddress selectMessageRecipient() {
        AddressBook book = getAddressBook();
        book.clear();
        return book.getAddress(getRandom().nextInt(book.size()));
    }

    @Override
    public Message sendMessage() {
        Message.MessageType[] values = Message.MessageType.values();
        return new Message(values[getRandom().nextInt(values.length)]);
    }

    @Override
    public void processMessage(IPAddress source, Message message) {

    }

    @Override
    public String getFlag() {
        return "Dumb Bot";
    }
}
Draco18s
sumber
0

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.

package codebots.bots;

import codebots.bot.CodeBot;
import codebots.bot.ReadonlyBot;
import codebots.gameobjects.AddressBook;
import codebots.gameobjects.FunctionType;
import codebots.gameobjects.IPAddress;
import codebots.gameobjects.Message;

public class HermitBot extends CodeBot {

    @Override
    public IPAddress selectMessageRecipient() {
        return personalAddress();//Talks to himself.
    }

    @Override
    public Message sendMessage() {
        Message.MessageType[] values = Message.MessageType.values();
        return new Message(values[getRandom().nextInt(values.length)], personalAddress());
    }

    @Override
    public void processMessage(IPAddress source, Message message) {
        AddressBook book = getAddressBook();
        if(source != personalAddress()){
            //if someone talks to you, put them in your addres book and remove everyone else
            book.clear();
            book.add(source);
            book.remove(0);
        }
    }


    @Override
    public FunctionType selectFunctionToBlock() {
        return getTurnNumber() % 3 == 0 ?
                FunctionType.SELECT_FUNCTION_TO_BLOCK: FunctionType.GET_FLAG;
    }

    @Override
    public IPAddress selectAttackTarget() {
        AddressBook book = getAddressBook();
        return book.getAddress(getRandom().nextInt(book.size()));
    }

    @Override
    public void readData(ReadonlyBot bot) {
        Variables v = getVariables();
        if(functionsMatch(bot, FunctionType.SELECT_FUNCTION_TO_BLOCK))
            v.add("Block Dif","A");
        if(functionsMatch(bot, FunctionType.GET_FLAG))
            v.add("Flag Dif","B");
        if(functionsMatch(bot, FunctionType.SELECT_MESSAGE_RECIPIENTS))
            v.add("Targ Dif","C");

    }

    @Override
    public FunctionType selectFunctionToReplace() {
        Variables v = getVariables();
        FunctionType r = getRandom().nextBoolean()?FunctionType.SELECT_FUNCTION_TO_REPLACE: FunctionType.READ_DATA;

        if(v.has("Targ Dif"))
            r = FunctionType.SELECT_MESSAGE_RECIPIENTS;
        if(v.has("Flag Dif") && getTurnNumber() % 3 == 0)
            r = FunctionType.GET_FLAG;
        if(v.has("Block Dif"))
            r = FunctionType.SELECT_FUNCTION_TO_BLOCK;
        v.clear();
        return r;
    }

    @Override
    public String getFlag() {
        return "Hermit Bot";
    }
}
MegaTom
sumber