कोड बॉट 4: कार्यात्मक प्रोग्रामिंग


25

शीश, यह वास्तव में 4 है? आप सभी पुराने लोगों के लिए, मुख्य चुनौती समान है, लेकिन हम कस्टम भाषा के बजाय जावा का उपयोग कर रहे हैं। यदि आप रुचि रखते हैं तो यहां पिछली तीन कोडबॉट चुनौतियां हैं।

कोडबॉट्स का लक्ष्य आपके बॉट को यथासंभव वायरल करना है । प्रत्येक बॉट एक ध्वज ले जाता है, और आपको यह सुनिश्चित करने की आवश्यकता है कि आपका ध्वज हर जगह है

एपीआई

बॉट्स एक मानकीकृत "प्रोटोकॉल" का पालन करेंगे, और बॉट्स निम्नलिखित चरणों के माध्यम से तुल्यकालिक रूप से प्रगति करते हैं:

  1. IPAddress selectMessageRecipient() एक बॉट को यह चुनने की अनुमति देता है कि वह किसे "मैत्रीपूर्ण" संदेश भेजना चाहता है।
  2. Message sendMessage() किसी बॉट को संदेश भेजने की सामग्री चुनने की अनुमति देता है।
  3. processMessage(IPAddress, Message) प्रत्येक संदेश के लिए एक बॉट प्राप्त होता है।
  4. FunctionType selectFunctionToBlock()एक फ़ंक्शन को वर्तमान मोड़ के लिए अधिलेखित होने से रोकता है। चरण 7 देखें।
  5. IPAddress selectAttackTarget()एक बॉट को चुनने की अनुमति देता है कि वह किसे डीडीओएस करना चाहता है। यदि एक ही समय में 3 बॉट द्वारा लक्षित किया जाता है तो डीडीओएस हमला सफल होता है। यदि कोई हमला सफल होता है, तो प्रत्येक हमलावर चरण 6 और 7 का प्रदर्शन कर सकता है।
  6. readData(ReadonlyBot) एक बॉट को कमजोर बॉट पर संग्रहीत डेटा को पढ़ने की अनुमति देता है।
  7. FunctionType selectFunctionToReplace()इस चुनौती की जड़ है । आपको अपने बॉट से उनके बॉट पर कॉपी करने के लिए 1 फ़ंक्शन (यहां सूचीबद्ध 8 में से) का चयन करने की अनुमति है। फिर, उनके बजाय अपने फ़ंक्शन को बुलाया जाएगा । यदि कई बॉट एक ही फ़ंक्शन का चयन करते हैं, तो एक यादृच्छिक सफल होगा।
  8. String getFlag()खेल के अंत में कहा जाता है, और आपके जमा करने के लिए एक स्ट्रिंग को वापस करना चाहिए। आपके फ़ंक्शन को हमेशा एक ही स्ट्रिंग वापस करना चाहिए। खेल के अंत में सबसे अधिक झंडे के साथ प्रस्तुतिकरण जीतता है।

भंडारण

आपके पास भंडारण के 3 रूप हैं, एक एड्रेसबुक , एक लॉग और एक चरभंडारण के ये रूप स्थानीय हैं बॉट में आपका फ़ंक्शन चल रहा है (इसलिए यदि आपका फ़ंक्शन कॉपी हो जाता है, तो इनमें से प्रत्येक ऑब्जेक्ट की सामग्री अलग होगी)। इन सभी वस्तुओं को मैन्युअल रूप से संशोधित या साफ़ किया जा सकता है। इन वस्तुओं को प्राप्त करने के लिए, आपके पास अपनी कक्षा (जैसे getLog()) में एक गेट्टर है ।

AddressBook की एक सूची संग्रहीत करता IPAddress एक साथ, प्रत्येक AddressType , जो आप पतों के विभिन्न प्रकार वर्गीकृत करने के लिए अनुमति देता है। एड्रेसबुक में हमेशा कम से कम 1 पता होगा (यदि इसे मंजूरी दे दी गई है, तो एक यादृच्छिक जोड़ दिया जाएगा)। कई IPAddresses प्राप्त करने के लिए अपने एड्रेसबुक को साफ़ करना की अनुमति नहीं है।

लॉग कार्रवाई के बारे में लिए गए सभी कार्यों के साथ-साथ डेटा की एक सूची संग्रहीत करता है। इसमें सभी सफल हमलों का इतिहास भी शामिल है (हालांकि आपको नहीं पता कि वे कौन से कार्य करते हैं)

चर वस्तु आप स्ट्रिंग एक स्ट्रिंग नाम से जुड़ी चर स्टोर करने के लिए अनुमति देता है। गेम शुरू होने पर, चर में एक एकल चर होगा, IDजिसमें एक बेतरतीब ढंग से उत्पन्न आईडी होती है जो आपके बॉट प्रकार के लिए अद्वितीय होती है।

आपके पास अन्य पहुंच कार्य भी हैं:

  • int getTurnNumber() वर्तमान मोड़ के साथ पूर्णांक देता है
  • bool functionsMatch(ReadonlyBot, FunctionType) यह देखने के लिए कि क्या ReadonlyBot का फ़ंक्शन आपके साथ मेल खाता है या नहीं
  • IPAddress personalAddress() आपका IPAddress देता है

कैसे लागू करें?

  • आप Github से कोड प्राप्त कर सकते हैं
  • अपने बॉट को \botsफ़ोल्डर में जोड़ें, और फिर अपने बॉट में एक संदर्भ जोड़ेंcontroller\CodeBotFactory.java
  • आपका बॉट विस्तार करना चाहिए codebots.bot.CodeBotयाcodebots.bots.DefaultCodeBot
  • यदि आप नियंत्रक चलाना चाहते हैं तो आपको जावा 8 की आवश्यकता है।
  • आप संकलित /srcका उपयोग करके कोड (मान लें कि आप फ़ोल्डर में हैं) चला सकते हैं javac codebots\*.java, फिर java codebots.Mainचलाने के लिए।
  • आपके पास कोई गैर-स्थिर सदस्य चर नहीं हो सकता है आपकी कक्षा में
  • परावर्तन की अनुमति नहीं है।
  • ऊपर सूचीबद्ध विधियों के बाहर बॉट्स (एक ही या विभिन्न प्रकार के) के बीच संचार की अनुमति नहीं है।
  • गूंगा और / या आत्मघाती बॉट की अनुमति है, लेकिन सभी बॉट मौजूदा प्रविष्टियों की तुलना में कार्यात्मक रूप से भिन्न होना चाहिए।
  • यदि आप अपने बॉट में यादृच्छिकता चाहते हैं, तो उपयोग करें getRandom()
  • कृपया अपने कोड को प्रभावी बनाए रखने का प्रयास करें। मैंने समय की रूपरेखा तैयार करने और नियंत्रक को तेज बनाने में अच्छा खर्च किया है।

स्कोर

१०५.२५०१ एक्सपेलेर्मस!
104.5803 मैं मदद कर रहा हूँ!
104.2746 मैं कौन हूं?
103.8529 गूंगा बॉट
103.2028 रिपल्सर
102.7045 कैओस
102.4046 हर्मिट बॉट
102.2849 स्वार
100.5598 रैंडम बॉट आपको
99.966 ट्रस्ट पर भरोसा है!
99.0185 codebots.bots.DefaultCodeBot
91.2942 codebots.bots.MarkedBot
91.1423 बस अपने अनुकूल पड़ोस मेल पहुंचाने वाले रोबोट को भेजें।
89.4645 अशक्त


आपको संभवत: Log.LogEntry को अंतिम रूप देना चाहिए, इसके साथ अंतिम नहीं मैं किसी भी जानकारी के साथ लॉग बना सकता हूं जो मैं चाहता हूं ... कि केवल मेरे बॉट फ़ंक्शन को पढ़ने या बनाने में सक्षम होगा।
TheNumberOne

ReadData बॉट के IpAddress तक पहुंच सकता है जो इसे पढ़ रहा है?
TheNumberOne

@NumberOne वर्तमान में नहीं है, लेकिन मैं नहीं देखता कि क्यों नहीं। मेरे पास अभी कोड नहीं है, लेकिन मैं कोड को बदल दूंगा।
नाथन मेरिल

3
मुझे यह दिलचस्प लगता है कि कैओस लीड बोर्ड में डिसआर्मबॉट और मार्कडबॉट व्यापार स्थल बनाता है।
TheNumberOne

1
वर्तमान में 10000 में से 7850 राउंड, अधिक सटीक स्कोर प्राप्त करने के लिए ...
LegionMammal978

जवाबों:


4

TrustBot

यदि आप उसे एक संदेश भेजते हैं, तो वह वही करेगा जो वह कहता है। यदि वह एक बॉट पढ़ता है, तो वह सीधे अपनी पुस्तक में पतों को कॉपी करेगा। वह बॉट्स पर हमला करता है कि पता पुस्तिका हमला करने के लिए कहती है।

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!";
    }
}

4

AmnesiaBot

एक यादृच्छिक बॉट जो स्मृति हानि कोड के साथ अन्य बॉट्स को इंजेक्ट करता है। प्रत्येक फ़ंक्शन लॉग, एड्रेस बुक और वेरिएबल्स को साफ़ करने के लिए कोड से शुरू होता है। यह कोड स्मार्ट बॉट्स को तर्क से दूर करने के प्रयास में, मेमोरी खो देता है।

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?";
    }
}

मुझे लगता है कि यह एक होशियार स्क्रिप्ट की अक्षमता के कारण ही जीतता है, जो कुछ भी याद रखने में सक्षम है। यानी चर चर वस्तु को साफ़ करना वास्तव में बहुत शक्तिशाली है।
ड्रेको

@ draco18s यह वास्तव में एक गंभीर जवाब होने के लिए मानसिक रूप से नहीं था ...
मेगाटॉम

मुझे पता है! इसलिए मैं इससे बहुत भ्रमित हूं। XD
ड्रेको

3

NullBot

उसका झंडा बहुत है ... विशेषता ...

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;
    }
}

यह नियंत्रक का परीक्षण करने के लिए भी है और "गूंगा बॉट की अनुमति है" नियम।


तकनीकी रूप से वह विनिर्देशन फिट नहीं करता है, क्योंकि वह अपने झंडे के लिए वास्तव में स्ट्रिंग वापस नहीं करता है।
TheNumberOne

3
nullएक तार है। ;) बस एक फैंसी स्ट्रिंग।
Addison Crump

इसने मुझे मेरी कल्पना में एक दोष को पहचान लिया, जिसे निर्दिष्ट किया गया है: "सभी बॉट्स मौजूदा प्रविष्टियों की तुलना में कार्यात्मक रूप से भिन्न होना चाहिए"
नाथन मेरिल

@NathanMerrill युक्ति का अधिक बारीकी से अनुसरण करने के लिए निश्चित किया गया।
TheNumberOne

3

RandomCodeBot

अप्रचलित यादृच्छिक KoTH प्रविष्टि

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";
    }
}

3

DisarmerBot

DisarmerBot बहुत बुद्धिमान नहीं है। यदि यह हमले के निर्देश प्राप्त करता है, तो यह एक यादृच्छिक हमलावर का चयन करेगा, अन्यथा, यह एक यादृच्छिक खिलाड़ी पर हमला करेगा। यह सिर्फ selectFunctionToBlockब्लॉक करने के लिए उनके कार्य को ओवरराइड करता है 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!"; }
}

आप allAddresses () करने की आवश्यकता के बिना nth पते का चयन कर सकते हैं। यदि आप मेरे यादृच्छिक बॉट को देखते हैं, तो यह यादृच्छिक पता चयन कर रहा है। मैंने आपके कोड को गितुब (दक्षता कारणों से) पर अपडेट किया है, लेकिन अगर आपको लगता है कि यह काम नहीं करता है, तो मैं इसे वापस करने के लिए खुश हूं।
नाथन मेरिल

ओह, मेरी बुरी, नियत।
नाथन मेरिल

3

MarkedBot

पहले दौर में खुद को चिह्नित करता है, और बाद के दौर में उस जानकारी का उपयोग करता है। इस तरह, यदि किसी अन्य बॉट को उसके हमले कोड के साथ इंजेक्शन लगाया जाता है, तो यह अप्रभावी होगा।

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();
    }
}

मुझे इस बॉट में कई बग मिले (टाइपो के बजाय == का उपयोग करते हुए) आपने मेरे सिस्टम में एक दोष भी पाया: आपको नए यादृच्छिक IPAddresses बनाने में सक्षम नहीं होना चाहिए। मैंने वह मुद्दा ठीक कर दिया है (और इसे करने वाले कोड को हटा दिया है)। आप github
नाथन मेरिल

इसके अलावा, शीर्ष स्थान पर बधाई!
नाथन मेरिल

HelperBot बहुत स्मार्ट नहीं है। यह केवल शीर्ष पर रहा क्योंकि अन्य सभी बॉट गूंगे थे। : P यह शायद पहला प्रभावी बॉट है।
ड्रेको 18 के दशक

1
@NathanMerrill क्या इसका मतलब है कि अब हमें धोखे के लिए जाली IPAdresses बनाने की अनुमति नहीं है? (अगर यह मामला मुझे ठीक करने की जरूरत है)
निक रॉबर्टसन

एक बॉट में जानबूझकर राउंड तक पहुंच नहीं है। हो सकता है कि आप विरोधियों के आईपी पतों का उपयोग forgeries के रूप में कर सकते हैं, लेकिन एक बनाने की अनुमति नहीं है। इसके अलावा, एक स्थैतिक स्थिर समय या आरंभीकरण समय पर एक चर सेट है।
नाथन मेरिल

2

SwarmBot

यह नॉट-वेल-नामित बॉट जटिल है (और इस तरह अब तक प्रस्तुत सबसे जटिल), लेकिन मैंने एक बॉट पर एक प्रयास किया जो एक नए लक्ष्य पर जाने से पहले किसी लक्ष्य के सभी तरीकों को व्यवस्थित रूप से बदल देता है। यह स्वयं की प्रतियों की पहचान करने और उन्हें सहयोगी मानने का प्रयास करता है, समय-समय पर अखंडता का बीमा करने के लिए उन पर जाँच करता है। मैं एक बेहतर नाम के साथ नहीं आया हूं।

जीथब रेपो शाखा से जुड़ा हुआ है, क्योंकि यह वनस्पति 340 रेखाओं वाली है।

https://github.com/Draco18s/CodeBots4/blob/master/src/codebots/bots/SwarmBot.java

कुछ दिलचस्प बिंदु:

  • लाइन्स 14-24 बस एक unmodifiable सूची है जिसने बॉट को अपने लक्ष्य के तरीकों को बदलने के क्रम को आसान बनाने के लिए बनाया है। यह स्टोर करता है जो अपने में इंडेक्स करता हैVariables प्रत्येक राउंड बढ़ाता है। यह "कोई गैर-स्थिर चर" नियम का पालन करना चाहिए।
  • सहयोगी सत्यापन के साथ लाइन्स 203-217 डील। हम वास्तव में इस बात की परवाह नहीं करते हैं कि एक और बॉट हमारे सभी निर्देशों को लागू करता है । केवल चार आवश्यक हैं, और यदि हम एक "विश्वसनीय" सहयोगी पर याद कर रहे हैं, तो हम इसे अपने स्वयं के साथ बदल देते हैं।
  • प्रभावशीलता में लाइनें 295-300 अप्रत्याशित वृद्धि थीं। खेल के पहले दो मोड़ पर अपने झंडे की रक्षा करके हम अपने झंडे की जगह गूंगे बॉट से बचते हैं इससे पहले कि हमारे पास बहुत दूर तक फैलने का मौका हो। हालांकि, लंबे समय तक प्रतीक्षा करने से हमारे ब्लॉकफ़ंक्शन को बदलने के लिए अन्य बॉट्स को मौका मिलता है और इससे प्रदर्शन में गिरावट आती है (रैंडम डॉट इन के कारण भ्रष्टाचार को रोकने का प्रयास करने वाले सहयोगियों के साथ हस्तक्षेप)।
  • इस बॉट के विकास के दौरान सबसे लंबे समय तक, इस बॉट ने हेल्परबॉट को 130 अंक का उल्लंघन करते हुए, एक बिंदु पर आगे बढ़ने के लिए प्रेरित किया, जबकि इस बॉट ने 81-98 रेंज पर बंद कर दिया, लेकिन मार्क्डबॉट और डिफॉल्टबॉट की प्रभावशीलता को कई बिंदुओं तक खींच लिया।
  • यह बॉट केवल जोड़े गए functionsMatchविधि से संभव था । इसके बिना functionsMatchएक बॉट लिखना असंभव था जो कि सार्थक निर्णय ले सकता था, क्योंकि यह अंधा था। यह अपने लक्ष्य चर और लॉग पढ़ सकता है, लेकिन इसके लक्ष्य की स्थिति के बारे में कुछ भी नहीं जानता।

अभी भी कुछ सुधार संभव होने की संभावना है, लेकिन मैं उन्हें नहीं देख सकता। लाइनें 198-205 संभवतः एक प्रदर्शन हॉग हैं, लेकिन जब तक IPAddress वर्ग पतों को वेरिएबल्स में संग्रहीत होने से पुनर्गठित करने की अनुमति देता है, तब तक यह आवश्यक है (चूंकि बॉट्स के पास पते को सत्यापित करने का कोई साधन नहीं है, किसी अमान्य पते का कोई भी खेल खेल का कारण बनता है। एक ReadOnlyBot, NPE फेंक) में एक अशक्त लक्ष्य लपेटें।

संपादित करें: अपडेट 12/12/15

getTurnNumber()प्रदर्शन में कुछ वृद्धि के लिए अनुमति दी गई तर्क पर कुछ मापदंडों को तोड़ मरोड़ कर । एंड-गेम टारगेट में 5% से 10% तक की वृद्धि लगभग 15 अंकों के लायक थी, इसी तरह शुरुआती गेम के लक्ष्य को 5% से बढ़ाकर 8% कर दिया गया। संयुक्त बॉट अब (लगभग) तब भी जीवित रह सकता है जब आमनेशियाबॉट के साथ सामना किया जाता है (110 के स्कोर के साथ दूसरे स्थान पर पहुंच जाता है, जहां हेल्परबोट लगभग 117 हो जाता है)।

इन ट्वीक के साथ भी, यह अशुभ हो सकता है, इसलिए 10 राउंड के लिए यह स्कोर सीमा लगभग 170-185 है।


बहुत बढ़िया! यह जानबूझकर है कि आप स्ट्रिंग से IPAddresses नहीं बना सकते।
नाथन मेरिल

ठीक है, ओस्टेंसिकली, हाँ! (या बॉट्स नए बॉट्स खोजने के लिए मनमानी करेंगे)। समस्या यह है कि अगर आप सिमुलेशन क्रैश करते हैं। ;)
ड्रेको

उर्म, लाइन 143 पर आप एक गैर-मौजूदा कंस्ट्रक्टर का उपयोग करते हैं।
नूम्बरन

@ जब मैंने इसे लिखा था, तो यह मान्य नहीं था। नाथन ने शायद आधार को अपडेट कर दिया है।
ड्रेको

@ TheNumberOne अपडेट किया गया। new IPAddressकॉल किया जाना चाहिए था एक "पता पुस्तिका से ऊपर देखो" के रूप में मैं में किया था readData। मैंने वह लुकअप और फिक्स्ड लाइन 143 निकाली।
ड्रेको

1

DefaultCodeBot

वाजिब काम करने की कोशिश करता है। (यदि आप सभी कार्यों को लागू नहीं करना चाहते हैं तो इस वर्ग को ओवरराइड करें)

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();
    }
}

1

HelperBot

हेल्पर बॉट कुछ नहीं करता है लेकिन अपने स्वयं के ध्वज को फैलाने की कोशिश करता है ... या कम से कम इस ध्वज को वर्तमान में carying है ...

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!";
    }
}

यदि HelperBot मानता है कि उसकी अपनी कोई भी विधि जो अधिलेखित है (के अलावा getFlag()) कुछ बेहतर के साथ ओवरराइट की जाएगी।


1

अराजकता

वह सभी झंडे को अवरुद्ध होने के अत्याचार से मुक्त करता है।

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);
    }
}

1

Replacer

यह प्रविष्टि सभी selectFunctionToReplaceफ़ंक्शन को अपने स्वयं के 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);
    }
}

1

mailbot

मेलबोट केवल संदेशों को संभालता है। यह दुनिया में अपना स्वयं का झंडा प्राप्त करने में सफल नहीं है (औसत स्कोर ~ 50, ~ 45 से nullbot से थोड़ा अधिक), लेकिन इसे एक संदेश भेजें और यह आपके पते को किसी और को भेज देगा।

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;
    }
}

मैंने बचत विवरणों पर विचार किया, इसलिए यह केवल प्रेषक के आईपी के बजाय एक नए बॉट (सामग्री और ध्वज) पर संपूर्ण गड़बड़ी को आगे बढ़ाएगा , लेकिन इसमें किसी भी कार्यात्मक लाभ के बिना वैरिएबल्स का भारी उपयोग शामिल होगा, विशेष रूप से अम्नेसियाबॉट को खेल में देखते हुए।


1

DumbBot

ऊ, यह गंदा लगता है। यह केवल एक ही चीज़ है जो AmnesiaBot को हराती है। वास्तव में, इसका सिर्फ एक विशेष रैंडमबॉट: इसे सिमुलेशन में (के माध्यम से) एक यादृच्छिक बॉट मिलता हैgetAddressBook().clear() ) प्राप्त करता है और बेतरतीब ढंग से ब्लॉक फ़ंक्शन या फ्लैग फ़ंक्शन को बदलता है। बस। केवल उन दोनों को चुनने से, इसका ध्वज-प्रसार दर AmnesiaBot या HelperBot से अधिक है, लेकिन केवल 3000 सेकंड के बाद:

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

मैंने प्रतिस्थापन फ़ंक्शन के साथ थोड़ा सा चक्कर लगाया, लेकिन अंत में, यह वह संस्करण है जो सबसे सफल था।

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";
    }
}

0

हर्मिट बॉट

वह अकेला रहता है और केवल खुद से बात करता है। अगर कम लोग जानते हैं कि वह कौन है, तो वह कम परेशान होगा। अगर कोई उसे परेशान करता है, तो वह उन पर तब तक हमला करेगा जब तक कोई और उसे परेशान नहीं करता।

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";
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.