क्या मुझे नहीं मारता ...


106

अवलोकन

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

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

बॉट

प्रत्येक बॉट 1000 जीवन और 10 शक्ति से शुरू होता है।

जब हमला हुआ:

  • आपके हमलावर की शक्ति आपके जीवन से घटा दी जाती है
  • आपकी शक्ति 1 से बढ़ जाती है।

तो, अगर पहली बारी पर, आप दो बॉट्स द्वारा हमला करते हैं, तो आपके पास 980 जीवन और 12 शक्ति होगी।

यदि आप बचाव करना चुनते हैं:

  • आपकी शक्ति 1 से कम हो जाएगी
  • आपके खिलाफ सभी हमले इस मोड़ को आधे से कम कर देंगे
  • यदि आप पर हमला किया जाता है, तो आप 1 के बजाय प्रत्येक हमलावर के लिए 2 शक्ति प्राप्त करेंगे

इसलिए, यदि आप पहली बारी का बचाव करते हैं और दो बॉट्स द्वारा हमला किया जाता है, तो आपके पास 990 जीवन और 13 शक्ति होगी। यदि आप बचाव करते हैं और हमला नहीं किया जाता है, तो आपके पास 1000 जीवन होंगे, लेकिन 9 शक्ति।

यदि एक मोड़ के अंत में आपकी शक्ति एक से नीचे है, तो इसे एक पर सेट किया जाएगा। यदि आपका जीवन 1 से कम है, तो आप मर जाते हैं।

इनपुट आउटपुट

बॉट्स को प्रति बार एक बार बुलाया जाता है। प्रत्येक मोड़ के लिए एक सेकंड की समय सीमा है।

प्रारंभिक

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

प्रत्येक मोड़

प्रत्येक मोड़ पर, आपके बॉट को गेम के सभी बॉट्स के बारे में कमांड लाइन के तर्क के रूप में जानकारी दी जाती है। इन तर्कों का एक उदाहरण है:

1 0,1000,10,1 1,995,11,D

पहला तर्क आपके बॉट की यूनिक आईडी है। फिर, बॉट्स की एक अलग-अलग सूची दिखाई देती है। प्रत्येक बॉट को स्वरूपित किया गया है:

id,life,power,lastAction

lastActionएक पूर्णांक हो सकता है कि वे किस बॉट पर हमला करते हैं, Dअगर उन्होंने बचाव किया है, और Xअगर यह पहली बारी है। अन्य सभी पूर्णांक हैं।

तो ऊपर दिए गए उदाहरण में, आप 1अपने अंतिम मोड़ पर बॉट और बचाव कर रहे हैं। बॉट 0ने आप पर हमला किया और अभी भी स्वास्थ्य / शक्ति शुरू करने में है।

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

टूर्नामेंट संरचना

प्रत्येक खेल में 1000 स्वास्थ्य और 10 शक्ति से शुरू होने वाले सभी बॉट शामिल हैं। सभी बॉट द्वारा कार्रवाई एक साथ की जाती है। एक गेम के लिए मोड़ों की अधिकतम संख्या 1000 है।

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

एक टूर्नामेंट में 15 खेल होते हैं। अंत जीत में सबसे अधिक अंक जो कोई भी हो! प्रत्येक जीते हुए खेल में शेष जीवन के योग से संबंध टूट जाते हैं।

राज्य

बॉट्स केवल एक ही फाइल को पढ़ सकते हैं या उसके नाम से लिख सकते हैं, एक सीधे सबफ़ोल्डर में जिसका नाम state("हीरो" लिख सकता है state/hero.whatever)। इस फ़ाइल में 1024 अधिक नहीं होनी चाहिए 2 आकार में बाइट्स। ध्यान रखें कि समय सीमा का पालन करें। आपके कार्यक्रम को गिनने के लिए एक सेकंड के भीतर समाप्त होना चाहिए , न कि केवल एक प्रतिक्रिया दें।

इन फ़ाइलों को प्रत्येक टूर्नामेंट से पहले मिटा दिया जाएगा, लेकिन गेम के लिए गेम जारी रहेगा। idगेम्स के बीच सभी बॉट आइडेंटिफ़ायर ( ) भी समान रहेंगे।

नियंत्रक

नीचे टूर्नामेंट नियंत्रक ( Stronger.java) है। डिफ़ॉल्ट रूप से , यह केवल अंतिम परिणाम (खिलाड़ियों की छंटनी सूची, शीर्ष पर विजेता) को आउटपुट करता है, जिसमें काफी समय लग सकता है। यह जमी नहीं है, बस चुप है। यदि आप अधिक विस्तृत टर्न-बाय टर्न आउटपुट चाहते हैं, -logतो दौड़ते समय तर्क जोड़ें ।

बॉट्स जोड़ने के लिए, आपके पास दो विकल्प हैं:

  • कमांड को तर्क के रूप में जोड़ें ( java Stronger -log "python bot.py")

  • defaultPlayers[]स्रोत में कमांड जोड़ें ( "python bot.py")

बॉट्स हीरो , बुली और कायर को इस उत्तर में पाया जा सकता है , और इसका उपयोग स्कोरिंग उद्देश्यों के लिए किया जाएगा।

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

public class Stronger {

    static final String[] defaultPlayers = {
                                "java Hero",
                                "java Bully",
                                "java Coward"
                                };
    final int timeout = 1000;
    final int startLife = 1000;
    final int startPower = 10;
    final int numRounds = 15;

    boolean log = false;
    List<Player> players;

    public static void main(String[] args){
        new Stronger().run(args);
    }

    void run(String[] args){
        init(args);
        for(int i=0;i<numRounds;i++){
            Collections.shuffle(players);
            runGame();
        }
        Collections.sort(players);
        for(Player player : players)
            System.out.println(player.toString());
    }

    void runGame(){
        log("Player Count: " + players.size());
        for(Player player : players)
            player.reset();
        int turn = 0;
        while(turn++ < startLife){
            if(aliveCount() < 2)
                break;
            log("Turn " + turn);
            List<Player> clones = new ArrayList<Player>();
            for(Player player : players)
                clones.add(player.copy());
            for(Player player : players){
                if(player.life < 1 || player.timedOut)
                    continue;               
                String[] args = new String[players.size()+1];
                args[0] = "" + player.id;
                for(int i=1;i<args.length;i++)
                    args[i] = players.get(i-1).toArgument();
                String reply = getReply(player, args);
                Player clone = player.findCopyOrMe(clones);
                if(reply.equals("T")){
                    clone.timedOut = true;
                    clone.life = 0;
                }
                clone.lastAction = reply.trim();
            }

            for(Player player : players){
                if(player.life < 1 || player.timedOut)
                    continue;               
                Player clone = player.findCopyOrMe(clones);
                if(clone.lastAction.equals("D")){
                    clone.power--;
                }else{
                    try{
                        int target = Integer.parseInt(clone.lastAction);
                        for(Player t : players)
                            if(t.id == target && t.life < 1)
                                throw new Exception();
                        for(Player tclone : clones){
                            if(tclone.id == target){
                                int atk = player.power; 
                                if(tclone.lastAction.equals("D")){
                                    atk -= player.power / 2;
                                    tclone.power++;
                                }
                                tclone.life -= atk;
                                tclone.power++;
                            }
                        }
                    } catch (Exception e){
                        log(player.cmd + " returned an invalid command: (" + clone.lastAction + ")");
                        clone.power--;
                    }
                }
            }
            players = clones;
            for(Player player : players){
                if(player.power < 1)
                    player.power = 1;
                log(player.life + "\t\t" + player.power + "\t\t(" + player.id + ")\t" + player.cmd);
            }
            log("\n");
        }

        if(aliveCount() == 1)
            for(Player player : players)
                if(player.life > 0){
                    player.scoreRounds++;
                    player.scoreLife += player.life;
                }
    }

    void log(String msg){if(log)System.out.println(msg);}

    String getReply(Player player, String[] args){
        try{
            List<String> cmd = new ArrayList<String>();
            String[] tokens = player.cmd.split(" ");
            for(String token : tokens)
                cmd.add(token);
            for(String arg : args)
                cmd.add(arg);
            ProcessBuilder builder = new ProcessBuilder(cmd);
            builder.redirectErrorStream();
            long start = System.currentTimeMillis();
            Process process = builder.start();
            Scanner scanner = new Scanner(process.getInputStream());
            process.waitFor();          
            String reply = scanner.nextLine();
            scanner.close();
            process.destroy();
            if(System.currentTimeMillis() - start > timeout)
                return "T";
            return reply;
        }catch(Exception e){
            e.printStackTrace();
            return "Exception: " + e.getMessage();
        }
    }

    void init(String[] args){
        players = new ArrayList<Player>();
        for(String arg : args){
            if(arg.toLowerCase().startsWith("-log")){
                log = true;
            }else{
                Player player = createPlayer(arg);
                if(player != null)
                    players.add(player);
            }
        }
        for(String cmd : defaultPlayers){
            Player player = createPlayer(cmd);
            if(player != null)
                players.add(player);
        }
    }

    Player createPlayer(String cmd){
        Player player = new Player(cmd);
        String reply = getReply(player, new String[]{});
        log(player.cmd + " " + reply);
        if(reply != null && reply.equals("ok"))
            return player;
        return null;
    }

    int aliveCount(){
        int alive = 0;;
        for(Player player : players)
            if(player.life > 0)
                alive++;
        return alive;
    }

    static int nextId = 0;  
    class Player implements Comparable<Player>{
        int id, life, power, scoreRounds, scoreLife;
        boolean timedOut;
        String cmd, lastAction;

        Player(String cmd){
            this.cmd = cmd;
            id = nextId++;
            scoreRounds = 0;
            scoreLife = 0;
            reset();
        }

        public Player copy(){
            Player copy = new Player(cmd);
            copy.id = id;
            copy.life = life;
            copy.power = power;
            copy.scoreRounds = scoreRounds;
            copy.scoreLife = scoreLife;
            copy.lastAction = lastAction;
            return copy;
        }

        void reset(){
            life = startLife;
            power = startPower;
            lastAction = "X";
            timedOut = false;
        }

        Player findCopyOrMe(List<Player> copies){
            for(Player copy : copies)
                if(copy.id == id)
                    return copy;
            return this;
        }

        public int compareTo(Player other){
            if(scoreRounds == other.scoreRounds)
                return other.scoreLife - scoreLife;
            return other.scoreRounds - scoreRounds;
        }

        public String toArgument(){
            return id + "," + life + "," + power + "," + lastAction;  
        }

        public String toString(){
            String out = "" + scoreRounds + "\t" + scoreLife;
            while(out.length() < 20)
                out += " ";
            return out + "(" + id + ")\t" + cmd;
        }
    }
}

नियम

  • आप दो बॉट में प्रवेश कर सकते हैं । यदि आप तीसरे में प्रवेश करने के लिए किसी एक को हटाना चाहते हैं, तो कृपया इसकी पोस्ट हटा दें।

  • आप मेटा-विश्लेषण द्वारा किसी बॉट को लक्षित या अन्यथा एकल नहीं कर सकते। अपने बॉट को दी गई जानकारी का ही उपयोग करें। इसमें आपके अपने बॉट्स शामिल हैं, इसलिए आप दो बॉट्स को नहीं जोड़ सकते हैं जो आपस में टकराते हैं।

  • किसी भी तरह से नियंत्रक या अन्य बॉट के चलने में हस्तक्षेप करने का प्रयास न करें।

  • आपका बॉट तुरंत या अन्यथा नियंत्रक या अन्य बॉट नहीं चला सकता है।

परिणाम

(2015-05-22 00: 00: 00Z के अनुसार प्रस्तुत बॉट्स)

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

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

Wins    Life(tiebreaker)  Name

3       561               perl Santayana.pl
2       850               java PhantomMenace
2       692               perl Tactician.pl
2       524               java Wiisniper
1       227               java Tank
1       184               java Velociraptor
1       7                 java Coward
1       3                 java IKnowYou

Sorta स्केची समानांतर नियंत्रक ( दूसरों के द्वारा ):

import java.lang.ProcessBuilder.Redirect;
import java.nio.file.FileSystems;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.atomic.AtomicInteger;

public class Stronger {

    static final String[] defaultPlayers = {
                                "java Hero",
                                "java Bully",
                                "java Coward",
                                "java Psycho",
                                "./monte.out",
                                "java Analyst",
                                "java Guardian",
                                "java Revenger",
                                "python precog.py",
                                //"python snappingTurtle.py",
                                "python beserker.py",
                                "./suprise.out",
                                //"python boxer.py",
                                "python defense.py",
                                "java Tank",
                                "java IKnowYou",
                                //"java BroBot",
                                "java Equaliser",
                                "java Velociraptor",
                                //"java AboveAverage",
                                "java PhantomMenace",
                                "java Wiisniper",
                                //"python semiRandom.py",
                                "/usr/bin/perl tactition.pl",
                                "/usr/bin/perl santayana.pl",
                                //"java GlitchUser"
                                "/usr/local/bin/Rscript opportunity.R",
                                "/usr/local/bin/scala Bandwagoner",
                                };
    final int timeout = 5000;
    final int startLife = 1000;
    final int startPower = 10;
    final int numRounds = 20;

    boolean log = true;
    List<Player> players;

    public static void main(String[] args){
        new Stronger().run(args);
    }

    void run(String[] args){
        init(args);
        for(int i=1;i<=numRounds;i++){
            if(log) System.out.println("Begining round "+ i);
            Collections.shuffle(players);
            runGame();
        }
        Collections.sort(players);
        for(Player player : players)
            System.out.println(player.toString());
    }

    void runGame(){
        log("Player Count: " + players.size());
        for(Player player : players)
            player.reset();
        int turn = 0;
        while(turn++ < startLife){
            if(aliveCount() < 2)
                break;
            log("Turn " + turn);
            List<Player> clones = new ArrayList<Player>();
            for(Player player : players)
                clones.add(player.copy());
            AtomicInteger count=new AtomicInteger(players.size());
            for(Player player : players){
                new Thread(() -> {
                    if(player.life >= 1 && !player.timedOut){
                        String[] args = new String[players.size()+1];
                        args[0] = "" + player.id;
                        for(int i=1;i<args.length;i++)
                            args[i] = players.get(i-1).toArgument();
                        String reply = getReply(player, args);
                        Player clone = player.findCopyOrMe(clones);
                        if(reply.equals("T")){
                            clone.timedOut = true;
                            clone.life = 0;
                        }
                        clone.lastAction = reply.trim();
                    }
                    synchronized(count){
                        count.decrementAndGet();
                        count.notify();
                    }
                }).start();
            }
            synchronized(count){
                while(count.get() > 0){
                    //System.out.println(count);
                    try{
                        count.wait();
                    }catch(InterruptedException e){
                    }
                }
            }

            for(Player player : players){
                if(player.life < 1 || player.timedOut)
                    continue;               
                Player clone = player.findCopyOrMe(clones);
                if(clone.lastAction.equals("D")){
                    clone.power--;
                }else{
                    try{
                        int target = Integer.parseInt(clone.lastAction);
                        for(Player t : players)
                            if(t.id == target && t.life < 1)
                                throw new Exception();
                        for(Player tclone : clones){
                            if(tclone.id == target){
                                int atk = player.power; 
                                if(tclone.lastAction.equals("D")){
                                    atk -= player.power / 2;
                                    tclone.power++;
                                }
                                tclone.life -= atk;
                                tclone.power++;
                            }
                        }
                    } catch (Exception e){
                        log(player.cmd + " returned an invalid command: (" + clone.lastAction + ")");
                        clone.power--;
                    }
                }
            }
            players = clones;
            for(Player player : players){
                if(player.power < 1)
                    player.power = 1;
                log(player.life + "\t\t" + player.power + "\t\t" + player.lastAction + "\t\t(" + player.id + ")\t" + player.cmd);
            }
            log("\n");
        }

        if(aliveCount() == 1)
            for(Player player : players)
                if(player.life > 0){
                    player.scoreRounds++;
                    player.scoreLife += player.life;
                }
    }

    void log(String msg){if(log)System.out.println(msg);}

    String getReply(Player player, String[] args){
        try{
            List<String> cmd = new ArrayList<String>();
            String[] tokens = player.cmd.split(" ");
            for(String token : tokens)
                cmd.add(token);
            for(String arg : args)
                cmd.add(arg);
            ProcessBuilder builder = new ProcessBuilder(cmd);
            builder.directory(FileSystems.getDefault().getPath(".", "bin").toFile());
            //builder.redirectError(Redirect.PIPE);
            long start = System.currentTimeMillis();
            Process process = builder.start();
            Scanner scanner = new Scanner(process.getInputStream());
            process.waitFor();          
            String reply = scanner.nextLine();
            scanner.close();
            process.destroy();
            if(System.currentTimeMillis() - start > timeout)
                return "T";
            return reply;
        }catch(Exception e){
            //e.printStackTrace();
            return "Exception: " + e.getMessage();
        }
    }

    void init(String[] args){
        players = new ArrayList<Player>();
        for(String arg : args){
            if(arg.toLowerCase().startsWith("-log")){
                log = true;
            }else{
                Player player = createPlayer(arg);
                if(player != null)
                    players.add(player);
            }
        }
        for(String cmd : defaultPlayers){
            Player player = createPlayer(cmd);
            if(player != null)
                players.add(player);
        }
    }

    Player createPlayer(String cmd){
        Player player = new Player(cmd);
        String reply = getReply(player, new String[]{});
        log(player.cmd + " " + reply);
        if(reply != null && reply.equals("ok"))
            return player;
        return null;
    }

    int aliveCount(){
        int alive = 0;;
        for(Player player : players)
            if(player.life > 0)
                alive++;
        return alive;
    }

    static int nextId = 0;  
    class Player implements Comparable<Player>{
        int id, life, power, scoreRounds, scoreLife;
        boolean timedOut;
        String cmd, lastAction;

        Player(String cmd){
            this.cmd = cmd;
            id = nextId++;
            scoreRounds = 0;
            scoreLife = 0;
            reset();
        }

        public Player copy(){
            Player copy = new Player(cmd);
            copy.id = id;
            copy.life = life;
            copy.power = power;
            copy.scoreRounds = scoreRounds;
            copy.scoreLife = scoreLife;
            copy.lastAction = lastAction;
            return copy;
        }

        void reset(){
            life = startLife;
            power = startPower;
            lastAction = "X";
            timedOut = false;
        }

        Player findCopyOrMe(List<Player> copies){
            for(Player copy : copies)
                if(copy.id == id)
                    return copy;
            return this;
        }

        public int compareTo(Player other){
            if(scoreRounds == other.scoreRounds)
                return other.scoreLife - scoreLife;
            return other.scoreRounds - scoreRounds;
        }

        public String toArgument(){
            return id + "," + life + "," + power + "," + lastAction;  
        }

        public String toString(){
            String out = "" + scoreRounds + "\t" + scoreLife;
            while(out.length() < 20)
                out += " ";
            return out + "(" + id + ")\t" + cmd;
        }
    }
}

2
@ टिम बॉट सूची अंतरिक्ष अलग है। प्रत्येक बॉट के आँकड़े अल्पविराम से अलग होते हैं।
जियोबिट्स

3
@ मर्क वर्तमान बॉट्स लगभग रक्षात्मक रूप से उन्मुख और आधा हमला कर रहे हैं। किसी भी डिफेंसिव बॉट की एक भी जीत नहीं है। मैं मानता हूं कि यह कुछ रक्षा को प्रोत्साहित करता है , लेकिन आक्रामकता का लाभ यह है कि शुद्ध रक्षा किसी भी बिंदु को नहीं जीत सकती है । यदि आप एकमात्र उत्तरजीवी हैं तो आप केवल अंक जीतते हैं ।
जियोबिट्स

8
अगर किसी को उत्सुक है कि बॉट्स अब कैसे ढेर हो गए हैं कि अधिक प्रस्तुतियाँ हैं, तो यहां मेरे "अनौपचारिक" टेस्ट रन का परिणाम है: 3-809-हीरो; 2-593-वेलोसिरैप्टर; 1-471-SurpriseBot; 1-433-कायर; 1-371-Santayana; 1-364-Wiisniper; 1-262-विश्लेषक; 1-230-बुली; 1-132-तुल्यकारक; 1-71-IKnowYou; 0-0 - प्रोगॉग, बेर्सर्कर, ब्रोबोट, सेमीग्रैंडैम, मोंटेबोट, टैक्टिशियन, स्नपिंग टर्टल, साइको, रिवेन्जर, ऑपर्चुनिटी, फैंटममेनस, टैंक, बॉक्सर, गार्जियन, अबवेरेज, डिफेंसिटिव। अपॉर्च्युनिटी, अबवग, ब्रोबोट, बॉक्सर, और सेमीग्रैंडमी से बहुत सारी अवैध कमांड।
OJFord

3
मेरे पास नियंत्रक का एक समानांतर संस्करण है जो मूल नियंत्रक की तुलना में तेजी से गेम चलाता है, अगर किसी को दिलचस्पी है तो मैं इसे पोस्ट कर सकता हूं ...
अन्य

3
@ मनु जब तक प्रत्येक बॉट को एक साथ निष्पादित नहीं किया जा रहा है, तब तक कोई फर्क नहीं पड़ता। मुझे लगता है कि समानांतर संस्करण में अभी भी सभी बॉट्स अगले पर जाने से पहले एक मोड़ खत्म कर चुके हैं। जैसा मैंने कहा, यदि पोस्ट किया गया है, तो मैं इसे उपयोग करने से पहले सत्यापित करने जा रहा हूं।
ज्योबिट्स

जवाबों:


25

सी ++ - मोंटेबोट

बड़ी संख्या में यादृच्छिक गेम का अनुकरण करता है और वह कदम चुनता है जो न मरने का सबसे बड़ा मौका होता है।

एक रणनीति के बारे में क्यों सोचें जब आप कंप्यूटर को आपके लिए एक बना सकते हैं?

नोट: इष्टतम प्रदर्शन के लिए -O3 ध्वज के साथ इसे संकलित करें।

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>

//Monte Carlo method constants
const unsigned int total_iters=100000; //total number of simulations
double time_limit=0.7; //approximate CPU time the program is allowed to run before outputting the current best solution
const unsigned int check_interval=4096-1;

unsigned int num_players,my_bot;
const int DEFEND=-1,FIRST=-2,DEAD=-3;
struct Bot{
    short int life,power,lastAttack;
    inline bool is_alive(void){
        return life>0;
    }
    inline void damage(short int dmg){
        life-=dmg;
        if(life<0)life=0;
    }
    inline void charge(short int p){
        power+=p;
        if(power<1)power=1;
    }
    inline bool is_attacking(void){
        return lastAttack>=0;
    }
};
int main(int argc,char*argv[]){
    clock_t start=clock();
    if(argc==1){
        printf("ok");
        return 0;
    }

    srand(time(NULL));

    num_players=argc-2;
    sscanf(argv[1],"%u",&my_bot);

    Bot bots[num_players];
    for(unsigned int i=0;i<num_players;++i){
        char buf[16];
        unsigned int id;
        short int life,power;
        sscanf(argv[i+2],"%u,%hd,%hd,%s",&id,&life,&power,buf);
        Bot &cur_bot=bots[id];
        cur_bot.life=life;
        cur_bot.power=power;
        if(strcmp(buf,"D")==0)cur_bot.lastAttack=DEFEND;
        else if(strcmp(buf,"X")==0)cur_bot.lastAttack=FIRST;
        else sscanf(buf,"%hd",&cur_bot.lastAttack);
    }

    //let the other bots kill each other while we accumulate more power
    if(bots[my_bot].life>750){
        printf("D");
        return 0;
    }

    Bot cur_state[num_players];
    unsigned int won[num_players+1],visited[num_players+1];
    for(int i=0;i<num_players+1;++i){
        won[i]=0;
        visited[i]=0;
    }

    //unsigned long long int sim_length=0;
    for(unsigned int iter=0;iter<total_iters;++iter){
        //ensure that we do not exceed the time limit
        if(iter&check_interval==check_interval){
            clock_t cur_time=clock();
            if((double)(cur_time-start)/(double)CLOCKS_PER_SEC>=time_limit){
                break;
            }
        }
        int first_move=FIRST;
        memcpy(cur_state,bots,sizeof(Bot)*num_players);

        //simulate random moves in the game until
        //a. the player dies, or
        //b. the player is the only one alive
        while(true){
            //++sim_length;
            //check if our bot died
            if(!cur_state[my_bot].is_alive()){
                ++visited[first_move+1];
                break;
            }
            //check if our bot is the only bot left alive
            bool others_alive=false;
            for(unsigned int i=0;i<num_players;++i){
                if(i!=my_bot&&cur_state[i].is_alive()){
                    others_alive=true;
                    break;
                }
            }
            if(!others_alive){
                ++won[first_move+1];
                ++visited[first_move+1];
                break;
            }

            Bot new_bots[num_players];
            memcpy(new_bots,cur_state,sizeof(Bot)*num_players);

            //generate random moves for all players
            bool defend[num_players];
            int possible_moves[num_players+2];
            unsigned int num_moves;
            for(unsigned int i=0;i<num_players;++i){
                num_moves=0;
                if(cur_state[i].is_alive()){
                    possible_moves[num_moves++]=DEFEND;
                    for(unsigned int j=0;j<num_players;++j){
                        if(j!=i&&cur_state[j].is_alive()){
                            possible_moves[num_moves++]=j;
                        }
                    }
                    new_bots[i].lastAttack=possible_moves[rand()%num_moves];
                    defend[num_players]=(new_bots[i].lastAttack==DEFEND);
                }else new_bots[i].lastAttack=DEAD;
            }
            if(first_move==FIRST)first_move=new_bots[my_bot].lastAttack;

            //simulate outcome of moves
            for(unsigned int i=0;i<num_players;++i){
                if(cur_state[i].is_alive()&&new_bots[i].is_attacking()){
                    new_bots[i].charge(-1);
                    int victim=new_bots[i].lastAttack;
                    if(defend[victim]){ //if victim is defending
                        new_bots[victim].charge(2);
                        new_bots[victim].damage(cur_state[i].power/2);
                    }else{
                        new_bots[victim].charge(1);
                        new_bots[victim].damage(cur_state[i].power);
                    }
                }
            }
            memcpy(cur_state,new_bots,sizeof(Bot)*num_players);
        }
    }
    //printf("%f\n",(double)sim_length/(double)total_iters);
    double win_rate=-1;
    int best_move=DEFEND;
    for(int i=0;i<num_players+1;++i){
        if(i-1!=my_bot){
            double cur_rate=(double)won[i]/(double)visited[i];
            if(cur_rate>win_rate){
                win_rate=cur_rate;
                best_move=i-1;
            }
        }
    }
    if(best_move==DEFEND)printf("D");
    else printf("%d",best_move);

    //clock_t end=clock();
    //fprintf(stderr,"%f\n",(double)(end-start)/(double)CLOCKS_PER_SEC);

    return 0;
}

सी - मोंटेफ़ेस्टर

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

नीचे दिया गया कोड केवल जिज्ञासा के लिए है।

नोट: इष्टतम प्रदर्शन के लिए -O3 और -fopenmp झंडे के साथ इसे संकलित करें।

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX_PLAYERS 32

//Monte Carlo method constants
const unsigned int total_iters=60000; //total number of simulations

unsigned int num_players,my_bot;
const int DEFEND=-1,FIRST=-2,DEAD=-3;
struct Bot{
    short int life,power,lastAttack;
};
int main(int argc,char*argv[]){
    clock_t start=clock();
    if(argc==1){
        printf("ok");
        return 0;
    }

    srand(time(NULL));

    num_players=argc-2;
    sscanf(argv[1],"%u",&my_bot);

    struct Bot bots[MAX_PLAYERS];
    int A;
    for(A=0;A<num_players;++A){
        char buf[16];
        unsigned int id;
        short int life,power;
        sscanf(argv[A+2],"%u,%hd,%hd,%s",&id,&life,&power,buf);
        struct Bot *cur_bot=&bots[id];
        cur_bot->life=life;
        cur_bot->power=power;
        if(strcmp(buf,"D")==0)cur_bot->lastAttack=DEFEND;
        else if(strcmp(buf,"X")==0)cur_bot->lastAttack=FIRST;
        else sscanf(buf,"%hd",&cur_bot->lastAttack);
    }

    //let the other bots kill each other while we accumulate more power
    if(bots[my_bot].life>750){
        printf("D");
        return 0;
    }

    struct Bot cur_state[MAX_PLAYERS];
    unsigned int won[MAX_PLAYERS+1],visited[MAX_PLAYERS+1];
    for(A=0;A<num_players+1;++A){
        won[A]=0;
        visited[A]=0;
    }

    //unsigned long long int sim_length=0;
    int iter;
    #pragma omp parallel for //strangely, the code fails to compile if a variable length array is used in the loop
    for(iter=0;iter<total_iters;++iter){
        //note that we cannot break this loop when we use #pragma omp parallel
        //there is therefore no way to check if we're close to exceeding the time limit

        int first_move=FIRST;
        memcpy(cur_state,bots,sizeof(struct Bot)*num_players);

        //simulate random moves in the game until
        //a. the player dies, or
        //b. the player is the only one alive
        int sim_length=0;
        while(1){
            //++sim_length;
            //check if our bot died
            if(cur_state[my_bot].life<=0){
                ++visited[first_move+1];
                break;
            }
            //check if our bot is the only bot left alive
            int others_alive=0;
            int i;
            for(i=0;i<num_players;++i){
                if(i!=my_bot&&cur_state[i].life>0){
                    others_alive=1;
                    break;
                }
            }
            if(!others_alive){
                ++won[first_move+1];
                //won[first_move+1]+=cur_state[my_bot].life;
                ++visited[first_move+1];
                break;
            }

            struct Bot new_bots[MAX_PLAYERS];
            memcpy(new_bots,cur_state,sizeof(struct Bot)*num_players);

            //generate random moves for all players
            char defend[MAX_PLAYERS];
            //int possible_moves[num_players+2];
            int possible_moves[MAX_PLAYERS+2];
            for(i=0;i<num_players;++i){
                if(cur_state[i].life>0){
                    int j,num_moves=0;
                    possible_moves[num_moves++]=DEFEND;
                    for(j=0;j<num_players;++j){
                        if(j!=i&&cur_state[j].life>0){
                            possible_moves[num_moves++]=j;
                        }
                    }
                    new_bots[i].lastAttack=possible_moves[rand()%num_moves];
                    defend[i]=(new_bots[i].lastAttack==DEFEND);
                }else new_bots[i].lastAttack=DEAD;
            }
            if(first_move==FIRST)first_move=new_bots[my_bot].lastAttack;

            //simulate outcome of moves
            for(i=0;i<num_players;++i){
                if(cur_state[i].life>0&&new_bots[i].lastAttack>=0){
                    new_bots[i].power-=1;
                    if(new_bots[i].power<=0)new_bots[i].power=1;
                    int victim=new_bots[i].lastAttack;
                    if(defend[victim]){ //if victim is defending
                        new_bots[victim].power+=2;
                        new_bots[victim].life-=cur_state[i].power/2;
                    }else{
                        new_bots[victim].power+=1;
                        new_bots[victim].life-=cur_state[i].power;
                    }
                    if(new_bots[victim].life<0)new_bots[victim].life=0;
                }
            }
            memcpy(cur_state,new_bots,sizeof(struct Bot)*num_players);
        }
    }
    //printf("%f\n",(double)sim_length/(double)total_iters);
    double win_rate=-1;
    int best_move=DEFEND;
    for(A=0;A<num_players+1;++A){
        if(A-1!=my_bot){
            double cur_rate=(double)won[A]/(double)visited[A];
            if(cur_rate>win_rate){
                win_rate=cur_rate;
                best_move=A-1;
            }
        }
    }
    if(best_move==DEFEND)printf("D");
    else printf("%d",best_move);
    //fprintf(stderr,"%.3f%% chance (based on %d samples)\n",(double)won[best_move+1]/(double)visited[best_move+1]*100.,total_iters);

    //clock_t end=clock();
    //fprintf(stderr,"%f\n",(double)(end-start)/(double)CLOCKS_PER_SEC);

    return 0;
}

2
दिलचस्प रणनीति। मोटे तौर पर 20ish विरोधियों के साथ अनुकरण करने में कितना समय लगता है?
राल्फ मार्शल

2
@RalphMarshall यह कुछ विरोधियों के लिए जल्दी (0.03 सेकंड से 0.2 सेकंड तक) के बजाय 60 हजार सिमुलेशन कर सकता है, लेकिन जल्दी से 20 विरोधियों (औसतन 10 सेकंड के साथ) के लिए बेहद धीमा हो जाता है। उम्मीद है, समय से पहले एल्गोरिथ्म को समाप्त करने से अभी भी संभव समाधान मिलेंगे।
पोटाटोमेटो

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

23

जावा साइको

कोई भी नहीं बता रहा है कि यह पागल साइको क्या करेगा - किसी पर भी हमला कर सकता है: एक मृत बॉट, या यहां तक ​​कि खुद भी।

import java.util.Random;

public class Psycho {
    public static void main(String[] args) {
        if(args.length < 1){
            System.out.print("ok");
            System.exit(0);
        }

        Random rnd = new Random();
        rnd.setSeed( System.currentTimeMillis() );

        String[] tokens = args[ rnd.nextInt(args.length) ].split(",");
        String target = tokens[0];

        System.out.print(target);
    }
}


19

स्काला - बैंडबाजा

Bandwagoner सम्मान, या सिद्धांतों के बारे में परवाह नहीं करता है। सबसे कम या सबसे मजबूत होने से परहेज करता है, बैंडबाजा कम देता है। ध्यान आकर्षित करने से बचने के लिए, बैंडवागन भीड़ के साथ जाता है, आम सहमति लक्ष्य को लक्षित करता है।

import scala.util.Try

object Bandwagoner {
    case class PlayerStatus(life:Int, power:Int, lastAction:Option[Int])

    def main(args:Array[String]):Unit={
        if(args.length==0)
            println("ok")
        else{
            val myId=args(0).toInt
            val everyonesStatus=(for(action <- args.tail) yield{
                val id :: life :: power :: lastAction :: Nil = action.split(",").toList
                (id.toInt, new PlayerStatus(life.toInt, power.toInt, Try(lastAction.toInt).toOption))
            }).toMap
            println(bandwagon(myId, everyonesStatus(myId), everyonesStatus.filter(_._1 != myId)))
        }
    }

    def bandwagon(myId:Int, self:PlayerStatus, opponents:Map[Int, PlayerStatus]):String={
        val alive=opponents.filter(_._2.life > 0)
        //If their is only one opponent left
        if(alive.size==1){
            val (opponentId, opponent)=alive.head
            //Get win projection
            val willWin=opponent.life/(self.power*1.0) <= self.life/(opponent.power*1.0)
            //If I'm stronger attack, otherwise defend
            if(willWin) opponentId.toString() else "D"

        }
        //Otherwise
        else if(alive.size > 0){
            //If I'm the strongest or weakest
            if(alive.map(_._2.life).max < self.life || alive.map(_._2.life).min > self.life){
                //If I have a good opportunity in terms or power, or passivity
                if(alive.map(_._2.power).max * 1.5 < self.power || !alive.exists(_._2.lastAction.isDefined)){
                    //Attack
                    alive.maxBy(_._2.power)._1.toString()
                }
                //Otherwise
                else 
                    //Lay low
                    "D"
            }
            //Otherwise, BANDWAGON
            else{
                //Obviously we dont want to attack dead opponents, or ourself
                val validTargets=opponents.flatMap(_._2.lastAction).filter(alive.contains(_)).filter(_ != myId)
                if(validTargets.size == 0)
                    "D"
                else
                    //Select the most targeted opponent (Sorry)
                    validTargets.groupBy(i => i).mapValues(_.size).maxBy(_._2)._1.toString()
            }
        }
        //Just to be safe..
        else 
            "D"
    }
}

क्या आपके पास कोई विचार है कि मुझे मूर्खतापूर्ण त्रुटि क्यों मिलेगी "कोशिश पहली बार scala.util का सदस्य नहीं है"? Googling ने मुझे एक नुकसान में छोड़ दिया है। मेरे पास मानक मानक स्थापित है, 2.9.2 सीधे भंडार से।
जियोबिट्स

@Geobits एक पुराने scala संस्करण की तुलना में मेरा है, मैं 2.11 चला रहा हूँ। यदि अपग्रेड करना कोई विकल्प नहीं है, तो मुझे बताएं और मैं अपना कोड काम करने के लिए ठीक कर दूंगा।
अन्य

2
जा रहा है। मैं डॉक्स में "2.1.0 से" के बाद से "2.1.0" पढ़ रहा था और यह पता नहीं लगा सका कि यह 2.9.2 में क्यों नहीं होगा :(
जियोबिट्स

18

जावा बदला लेने वाला

बदला लेने वाले की निंदा करने में दिलचस्पी नहीं है। लेकिन अगर हमला हुआ तो बदला लिया जाएगा !

public class Revenger {
    public static void main(String[] args) {
        if(args.length < 1){
            System.out.print("ok");
            System.exit(0);
        }

        String me = args[0], target = "D";
        int last_attacker_power = -1;

        for(int i=1; i<args.length; ++i){
            String[] tokens = args[i].split(",");
            int power = Integer.parseInt(tokens[2]);
            int life  = Integer.parseInt(tokens[1]);

            if( tokens[3].equals(me)
             && power>last_attacker_power
             && life>0  ){
                target = tokens[0];
                last_attacker_power = power;
            }
        }

        System.out.print(target);
    }
}

4
FYI करें: यह लक्ष्य के मृत होने के बाद भी हमला करना बंद नहीं करता है।
जियोबिट्स

26
@Geobits ओह, लेकिन बदला एक डिश सबसे अच्छी सेवा है .. पहले से ही मर चुका है? : पी जानबूझकर नहीं था; अपडेट किया गया।
OJFord

17

जावा - हीरो, बुली और कायर

इन तीन बॉट उदाहरण के रूप में शामिल किए गए हैं, लेकिन वे जाएगा स्कोरिंग टूर्नामेंट में खेलेंगे। वे सभी सरल व्यवहार करते हैं।

नायक

हीरो बस उस पर हमला करता है जिसके पास हर मोड़ पर सबसे ज्यादा जीवन हो।

public class Hero {
    public static void main(String[] args) {
        if(args.length < 1){
            System.out.print("ok");
            System.exit(0);
        }
        String me = args[0], target="D";
        int best=0;
        for(int i=1;i<args.length;i++){
            String[] tokens = args[i].split(",");
            int life = Integer.valueOf(tokens[1]);
            if(life > 0 && life >= best && !tokens[0].equals(me)){
                best = life;
                target = tokens[0];
            }
        }
        System.out.print(target);
    }
}

धौंसिया

इस बीच, बुली ने हमला कर दिया, जिसने भी हर मोड़ पर कम से कम जीवन जिया

public class Bully {
    public static void main(String[] args) {
        if(args.length < 1){
            System.out.print("ok");
            System.exit(0);
        }
        String me = args[0], target="D";
        int best=Integer.MAX_VALUE;
        for(int i=1;i<args.length;i++){
            String[] tokens = args[i].split(",");
            int life = Integer.valueOf(tokens[1]);
            if(life > 0 && life <= best && !tokens[0].equals(me)){
                best = life;
                target = tokens[0];
            }
        }
        System.out.print(target);
    }
}

डरपोक

कायर कुछ भी नहीं करता है लेकिन तब तक बचाव करता है जब तक कि उसका जीवन 500 या उससे कम नहीं हो जाता। वह तब हमला करता है जिसके पास प्रत्येक मोड़ पर कम से कम शक्ति हो।

public class Coward {
    public static void main(String[] args) {
        if(args.length < 1){
            System.out.print("ok");
            System.exit(0);
        }
        String me = args[0], action="D";
        int best=Integer.MAX_VALUE;
        for(int i=1;i<args.length;i++){
            String[] tokens = args[i].split(",");
            if(tokens[0].equals(me)){
                if(Integer.valueOf(tokens[1]) > 500){
                    System.out.print("D");
                    System.exit(0);
                }
            }
        }       
        for(int i=1;i<args.length;i++){
            String[] tokens = args[i].split(",");
            int power = Integer.valueOf(tokens[2]);
            if(power <= best && !tokens[0].equals(me) && Integer.valueOf(tokens[1]) > 0){
                best = power;
                action = tokens[0];
            }
        }
        System.out.print(action);
    }
}

का आनंद लें!


7
दिलचस्प है कि हीरो की तकनीक प्रभावी है; और भी अधिक 'परिष्कृत' बॉट्स (जैसे मोंटेबोट, विश्लेषक) के खिलाफ। क्या यह सिर्फ एक सरल उदाहरण था, या आपने इसे कुछ अंतर्दृष्टि पर आधारित किया था?
OJFord

1
नहीं, मैंने सिर्फ पहली तीन चीजों को फेंक दिया था जो मैंने उदाहरण के रूप में सोचा था। मुझे नहीं लगता था कि यह बिल्कुल अच्छा होगा, ईमानदार होने के लिए।
जियोबिट्स

16

पर्ल - रणनीति

यह मेरे लेट फ़ाइट बॉट के संपादन के रूप में शुरू हुआ, लेकिन मैंने पर्याप्त बदलाव किए हैं जो मैंने इसे एक नई प्रविष्टि के रूप में दर्ज करने का निर्णय लिया है। नया तर्क इस प्रकार है

  • यदि पिछली बारी में किसी ने हमला नहीं किया है, तो प्रतिद्वंद्वी को उच्चतम जीवन मूल्य के साथ हमला करें। यह समाप्त होने से बचना चाहिए जहां कोई भी किसी और पर हमला नहीं करता है, कम से कम जब तक मैं अभी भी जीवित हूं।
  • अगर किसी ने आखिरी मोड़ पर मुझ पर हमला किया, तो सबसे शक्तिशाली ऐसे हमलावर को उठाओ और वापस मारो।
  • यदि हम दो बॉट्स के नीचे हैं, या मैं नीचे-औसत ताकत पर हूं, तो प्रतिद्वंद्वी पर उच्चतम जीवन के साथ हमला कर सकता हूं।
  • अगर मेरी खुद की पावर रेटिंग औसत से कम है, तो अपनी शक्ति को और अधिक उचित स्तर तक बढ़ाने के लिए हमला करें
  • नहीं तो मेरा समय बिताओ

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

#!/usr/bin/perl

use strict;
use warnings;

# First round
if (!@ARGV) {
    print "ok\n";
    exit;
}

my ($self, @rest) = @ARGV;

my ($myAction, $myPower, $myLife,
    $myMaxAttacker, $myMaxAttackerId, 
    $maxLife, $maxLifeId, 
    $maxPower, $maxPowerId,
    $totLife, $totPower, $living, $amWeak, $numAttackers) = ('D');

# First, get a situation report
for (@rest) {
    my ($id, $life, $power, $action) = split(',');

    # Let the dead rest in peace
    next unless $life>0;

    if ($id == $self) {
        # Keep track of my own power and life for later comparison
        $myPower = $power;
        $myLife = $life;
        next;
    }

    $living++;
    $numAttackers++ if ($action ne 'D');
    $totPower += $power;
    $totLife += $life;

    if ($action == $self) {
        # Bastard hit me!
        if ($power > $myMaxAttacker) {
            $myMaxAttacker = $power;
            $myMaxAttackerId = $id;
        }
    }

    # If you're going to pick a fight, go for the biggest
    # guy in the room.
    if ($life > $maxLife) {
        $maxLife = $life;
        $maxLifeId = $id;
    }

    # Or, go for the guy with the biggest gun
    if ($power > $maxPower) {
        $maxPower = $power;
        $maxPowerId = $id;
    }
}

# If I'm being hit any attacks are back at the strongest attacker,
# otherwise simply the healthiest opponent overall
my $preferredTarget = $myMaxAttackerId;
$preferredTarget = $maxLifeId unless defined $preferredTarget;

# Check to see if I have below-average life, in which case it's time to get moving
$amWeak = $myLife < $totLife/$living;

# Now figure out what to do
if (!$numAttackers) {
    # Everybody is standing around, so let's mix it up
    $myAction = $preferredTarget;
} elsif (defined $myMaxAttackerId) {
    # My momma told me never to stand there and be hit
    $myAction = $myMaxAttackerId;
} elsif ($amWeak || $living == 1) {
    # Either we're down to two bots, or I'm fairly weak. Atack!!!
    $myAction = $preferredTarget;
} elsif ($myPower < $totPower/$living) {
    # Just lash out at random so we do not lose all of
    # our power through permanent defense
    $myAction = $preferredTarget;
} else { 
    # Work up some courage/power by drinking beer
    # in the corner. Use the default defensive action in this case.
    # Else clause exists just for debugging.
}

print "$myAction\n";

पर्ल - संतायण

जिन्हें इतिहास याद नहीं है, वे जल्दी मरने के लिए बर्बाद हो जाते हैं, या कुछ ऐसे। यह बॉट हर दौर में प्रत्येक बॉट की कुल ताकत का इतिहास रखते हुए और हमेशा सबसे मजबूत पर हमला करके प्रतियोगिता के बहु-गोल प्रकृति का लाभ उठाने का प्रयास करता है। सिद्धांत रूप में, यह किसी भी बॉट को कुचलने वाले लीड तक जाने से रोकता है, लेकिन निश्चित रूप से मैं केवल जीवित रहते हुए आँकड़े एकत्र कर रहा हूं, इसलिए यदि यह बॉट समाप्त हो जाता है, तो कम जीवन के लिए आँकड़े बहुत अच्छे नहीं होंगे।

#!/usr/bin/perl

use strict;
use warnings;

# First round
if (!@ARGV) {
    print "ok\n";
    exit;
}

# Read in our multi-round/multi-game state information
my $state;
if (open STATE, "state/santayana.out") {
    $state = <STATE>;
    close STATE;
}

# Stuff the historical data into a hash keyed by opponent ID
my %state;
my @state = $state ? split(' ', $state) : ();
for (@state) {
    my ($id, $life, $power) = split ',';
    $state{$id} = [$life, $power];
}

my ($self, @rest) = @ARGV;

my ($maxLife, $maxLifeId, $living) = (0, undef, 0);

# First, get a situation report
for (@rest) {
    my ($id, $life, $power, $action) = split(',');

    # Let the dead rest in peace
    next unless $life > 0;

    $living++;

    # Update the historical hash with latest information
    my $aref = $state{$id};
    if ($aref) {
        $$aref[0] += $life * ($action eq 'D' ? 1 : 1.5);
        $$aref[1] += $power;
    } else {
        $state{$id} = [$life, $power];
    }

    next if ($id == $self);

    # Our target is based on the historically
    # strongest opponent, independent of current state,
    # unless they are actually dead
    if ($life > 0 && $state{$id}->[0] > $maxLife) {
        $maxLife = $state{$id}->[0];
        $maxLifeId = $id;
    }
}

# Write out the latest state for next time around
if (open STATE, ">state/santayana.out") {
    print STATE join(" ", map { join ",", $_, $state{$_}->[0], $state{$_}->[1] } sort { $state{$b}->[0] <=> $state{$a}->[0]} keys %state);
    close STATE;
}

# Now figure out what to do
if (defined $maxLifeId) {
    # Should always be defined, but who knows
    print "$maxLifeId\n";
} else {
    print "D\n";
}

ध्यान दें कि मुझे पूरा यकीन है कि मैंने अपनी दूसरी प्रविष्टि (लेबल लेट 'एम फाइट) को डिलीट कर दिया है, इसलिए मेरे पास केवल दो बॉट्स होने चाहिए, लेकिन यदि कृपया इसे अनदेखा न करें और केवल इन दोनों का उपयोग करें। धन्यवाद।
राल्फ मार्शल

6
नवीनतम स्कोरबोर्ड में पहला और तीसरा दोनों स्थान लेने के लिए बधाई :)
जियोबिट्स

सबसे श्रेष्ठ! यह एक बड़ी चुनौती रही है।
राल्फ मार्शल

14

जावा अभिभावक

गार्जियन कमजोर की रक्षा करता है। वह उस पर हमला करेगा जिसने अब तक के सबसे कमजोर जीवित बॉट (संभवत: स्वयं के अलावा) पर अपना अंतिम मोड़ उठाया। वह काफी चालाक है, हालांकि, हमला नहीं करने के लिए:

1) खुद (जब तक कि वह है धमकाने, तो उसे लगता है कि वह इसे योग्य है।)

2) बॉट्स जो खुद पर हमला करते हैं

3) मृत बॉट

4) दस से कम जीवन वाले बॉट (जिन्होंने उम्मीद से अपने सबक सीखे हैं!)

अभिभावक जरूरत पड़ने पर एक ही खिलाड़ी को बार-बार चुनेंगे। "सबसे कमजोर खिलाड़ी" के लिए संबंध और "जिसने उस पर उठाया" दोनों सूची में पहले एक पर जाते हैं (जो कहने के लिए है, यादृच्छिक)।

public class Guardian{
    public static void main (String[] args){
        if(args.length == 0){
            System.out.print("ok");
            System.exit(0);
        }

        String myId = args[0];
        int lowestLife = Integer.MAX_VALUE;
        int life = Integer.MIN_VALUE;
        String[] tokens = {};
        String opposingId = "";
        String weakestOpponent = "";
        String lastTarget = "";

        for(int i=1; i<args.length; i++){
            tokens = args[i].split(",");
            opposingId = tokens[0];
            life = Integer.parseInt(tokens[1]);
            lastTarget = tokens[3];
            if(life < lowestLife && life > 0 &&
                !opposingId.equals(myId) &&
                !opposingId.equals(lastTarget)){
                weakestOpponent = opposingId;
            }
        }

        for(int i=1; i<args.length; i++){
            tokens = args[i].split(",");
            opposingId = tokens[0];
            life = Integer.parseInt(tokens[1]);
            lastTarget = tokens[3];
            if (lastTarget.equals(weakestOpponent) &&
                life > 10){
                System.out.println(opposingId);
                System.exit(0);
            }
        }

        System.out.println("D");
    }
}

1
कृपया इसमें और आपके अन्य बॉट में कई टाइपो और गलतियों को ठीक करें । मैं उनमें से किसी को भी संकलित नहीं कर सकता जैसा कि यह है।
जियोबिट्स

मुझे लगता है कि अगर यह धमकाने की स्थिति में है तो उसे सोचना चाहिए कि यह क्या किया गया है, यानी डी एफ़ेंड।
user3819867

त्रुटियों को ठीक किया। @ user3819867, मैंने इसे जोड़ने के बारे में सोचा था, लेकिन एक अभिभावक हर कीमत पर कमजोरों की रक्षा करेगा, यहां तक ​​कि खुद के लिए भी।
Xynariz

13

जावा - विश्लेषक

यदि यह हमला किया और विश्लेषक द्वारा हमला किया तो 25 से अपनी शक्ति को 5 से गुणा करके प्रत्येक प्रतिद्वंद्वी के खतरे को निर्धारित करता है। एक टाई के मामले में, यह कम से कम जीवन के साथ खिलाड़ी पर हमला करता है।

अधिकांश कोड जियोबिट्स के उत्तर से उधार लिया गया था।

public class Analyst {
    public static void main(String[] args) {
        if (args.length < 1) {
            System.out.println("ok");
            System.exit(0);
        }
        String me = args[0], that = "D";
        int maxThreat = 200;
        for (int i = 1; i < args.length; i++) {
            String[] player = args[i].split(",");
            int threat = Integer.parseInt(player[2]) * 100
                         * (!player[3].equals("D") ? 5 : 1)
                         * (player[3].equals(me) ? 5 : 1)
                         - Integer.parseInt(player[1]);
            if (threat > maxThreat && Integer.parseInt(player[1]) > 0 && !player[0].equals(me)) {
                maxThreat = threat;
                that = player[0];
            }
        }
        System.out.println(that);
    }
}

12

अजगर 2, तड़क कछुआ

अपने खोल में छिपा देता है, यह पिछले मोड़ पर हमला करने की है (जब तक वे मर गए), तो अपने खोल में वापस चला जाता है फिर से पहले व्यक्ति को काटने का उभर रहे हैं
के साथ चलाने के लिएpython snapping_turtle.py <input>

import sys
class snapping_turtle:
    def bitey(self,command):


        if len(command) <=1:
            return 'ok'
        else:
            last_turn = list(command)
            bot_to_bite = -1
            me = last_turn[0]
            for k in xrange(0,len(last_turn)):
                #bot_action = last_turn.split(',')

                if len(last_turn[k]) ==1:
                    pass
                else:
                    bot_action = last_turn[k].split(',')
                    # If they hit me
                    if bot_action[3] == me:
                        # And if they're still alive, hit them
                        if int(bot_action[1]) > 0:
                            bot_to_bite = bot_action[0]
                            break
                        #Otherwise, stay in my shell
                        else:
                            pass

            if bot_to_bite > -1:
                return bot_to_bite
            else:
                return 'D'

print snapping_turtle().bitey(sys.argv[1:])

पायथन 2, बेर्सर्कर

Berserker तोड़! अपने आप को तब तक हिट करता है जब तक उसमें पर्याप्त शक्ति न हो, फिर निकटतम जीवित चीज़ पर हमला करना शुरू कर देता है। यह भी हिट अगर यह काम नहीं कर सकता है तो इसे किस कारण से मारना चाहिए।

संपादित करें: 50 से 25 तक बेस्डर्स के गुस्से की सीमा को बदल दिया, अन्यथा यह कुछ भी करने से पहले खुद को बाहर निकाल लेता ...

के साथ चलता है python Berserker.py <input>

import sys
class Berserker:
    def rage(self,command):


        if len(command) <=1:
            return 'ok'
        else:
            last_turn = list(command)
            bot_to_smash = -1
            me = last_turn[0]
            my_power = last_turn[int(me)].split(',')[2]
            for k in xrange(0,len(last_turn)):
                #bot_action = last_turn.split(',')

                if len(last_turn[k]) ==1:
                    pass
                else:
                    bot_action = last_turn[k].split(',')
                    if int(my_power) < 25:
                        #Too weak! Need make stronger for smashing!
                        bot_to_smash = me
                        break
                    else:
                        #Now strong! Smash! Not smash broken things!
                        if bot_action[0] != me and bot_action[1] > 0:
                            bot_to_smash = bot_action[0]

            if bot_to_smash > -1:
                return bot_to_smash
            else:
                #Confused! Don't like! MORE POWER!
                return me

print Berserker().rage(sys.argv[1:])

12

आर - अवसर

इस बॉट का उपयोग करके बुलाया जाना चाहिए Rscript Opportunity.R। यह याद रखता है कि किसने क्या किया और यह प्रतिद्वंद्वी को खुद का बचाव करने की कम संभावना पर हमला करता है (यानी जो Dअतीत में कम से कम इस्तेमाल करता है) जब तक उसे पता नहीं चलता है कि एक बॉट उस पर लगातार दो बार हमला कर रहा है जिस स्थिति में वह बचाव करना शुरू कर देता है स्वयं या हमला करने वाले बॉट पर हमला करता है अगर यह हमलावर की तुलना में इसे तेजी से मार सकता है।

args <- commandArgs(TRUE)
if(length(args)){
    myid <- as.integer(args[1])
    data <- as.data.frame(do.call(rbind,strsplit(args[-1],",")),stringsAsFactors=FALSE)
    colnames(data) <- c('id','health','power','last')
    data$id <- as.integer(data$id)
    data$health <- as.integer(data$health)
    data$power <- as.integer(data$power)
    data <- data[order(data$id),]
    if(all(data$last=="X")){
        cat(data$last,file="state/opportunity.txt",sep="\n")
        cat(sample(data$id[data$id!=myid],1))
        }else{
            past <- as.matrix(read.table("state/opportunity.txt",sep=" "))
            lastturn <- data$last
            lastturn[data$health<1] <- "X"
            lastturn[nchar(lastturn)>1] <- "E" #If a bot returned anything else than an integer
            past <- cbind(past,lastturn)
            cat(apply(past,1,paste,collapse=" "),sep="\n",file="state/opportunity.txt")
            who_bully_me <- sapply(apply(past,1,rle),function(x)ifelse(tail(x$v,1)==myid,tail(x$l,1),0))
            if(any(who_bully_me>1)){
                bullyid <- which.max(who_bully_me)-1
                if(data$health[data$id==bullyid]%/%data$power[data$id==myid]<=data$health[data$id==myid]%/%data$power[data$id==bullyid]){
                    cat(bullyid)
                    }else{cat("D")}
                }else{
                    defend <- rowSums(past=="D")
                    defend[past[,ncol(past)]=="X"] <- NA
                    defend[myid+1] <- NA
                    choice <- which(defend%in%min(defend,na.rm=TRUE)) -1
                    if(length(choice)>1) choice <- sample(choice,1)
                    cat(choice)
                }
        }
}else{
    cat("ok")
    }

अच्छा लगा। मैंने आर में एक समाधान शुरू किया था लेकिन यह बहुत बेहतर है।
एलेक्स ए

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

शायद मैं इसे जूलिया में गोली मार दूंगा। प्रोत्साहित करने के लिए धन्यवाद। :)
एलेक्स ए

10

अजगर 2 - बॉक्सर

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

import sys, re, random
if sys.argv[1:]:
    rows = [map(int, re.sub('[DX]', '-1', b).split(',')) for b in sys.argv[2:]]
    bots = dict((r.pop(0),r) for r in rows if r[1]>0 and r[0]!=int(sys.argv[1]))
    target = max(bots, key=lambda b: bots[b][0]-300*(bots[b][2]==-1))
    print target if random.randint(1,100) > 70 else 'D'
else:
    print 'ok'

अद्यतन: कुछ अवैध आउटपुट के कारण एक बग फिक्स्ड।


4
354 वर्ण? यह क्या है, कोड गोल्फ? ;)
केसी कुबाल

1
@Darthfett: सिर्फ इसलिए कि यहाँ आसपास कई जावा सबमिशन हैं, इसका मतलब यह नहीं है कि हर किसी को अपने कोड को बॉयलरप्लेट की समान मात्रा से सराबोर करने की ज़रूरत है ...
बंद हो गया

11
बॉक्सर दुबला है - वह आसानी से अपने लड़ वजन से मिलता है। वह समझ और लाम्बाद का स्वस्थ आहार प्राप्त करता है। आप उसे स्टैटिक टाइपिंग बर्गर खाते हुए नहीं पाएंगे, या ब्रेसिज़ फ्राइज़ पर कुतरेंगे।
लॉजिक नाइट

4
@CarpetPython टेरिसिटी के लिए टेरसिटी वर्बोसिटी की तरह ही खराब है।
क्रोल्टन

9

सी - सरप्राइज़बॉट

माना जाता है कि पहली बारी एक गड़बड़ होने वाली है और बचाव करती है। उसके बाद, किसी ऐसे व्यक्ति पर हमला करें, जिसने अंतिम मोड़ तक बचाव नहीं किया है - वे कभी भी इसे आते हुए नहीं देखेंगे!

यह उत्तर मूर्खतापूर्ण है, लेकिन मैं सी में उत्तर बनाने के लिए एक सामान्य मंच लिखना चाहता था, इसलिए यहां आप जाते हैं।

//What doesn't kill me...
//SurpriseBot

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

int myself;

typedef struct s_Bot {
    int id;
    int life;
    int power;
    /* -1 is defending */
    int lastAction;
} Bot;

int compare_bots(const void* a, const void* b) {
    Bot one = *(Bot*)a;
    Bot two = *(Bot*)b;

    /* Never, ever target myself */
    if (one.id == myself) {
        return 1;
    }
    else if (two.id == myself) {
        return -1;
    }

    /* Also, don't target any bot that is dead */
    if (one.life < 1) {
        return 1;
    }
    else if (two.life < 1) {
        return -1;
    }

    /* Prefer those who did not defend last turn */
    /* They'll never see it coming!              */
    if (one.lastAction >= 0 && two.lastAction < 0) {
        return -1;
    }
    else if (one.lastAction < 0 && two.lastAction >= 0) {
        return 1;
    }

    /* Try to target the lowest health */
    if (one.life < two.life) {
        return -1;
    }
    else if (one.life > two.life) {
        return 1;
    }

    /* Try to target the more powerful bot */
    if (one.power < two.power) {
        return 1;
    }
    else if (one.power > two.power) {
        return -1;
    }
    else return 0;
}

int main(int argc, char** argv) {
    if (argc == 1) {
        printf("ok");
    }

    else {
        int quit = 0;
        myself = atoi(argv[1]);

        /* Populate a list of all bots */
        int num = argc - 2;
        Bot bots[num];

        int i;
        for (i = 0; i < num; i++) {
            char buf[100];
            sscanf(argv[2 + i], "%d,%d,%d,%s", &bots[i].id, &bots[i].life, &bots[i].power, buf);
            switch (buf[0]) {
                case 'X':
                    /* Assume the first turn is a bloodbath and we don't want any part of it */
                    printf("D");
                    quit = 1;
                    break;
                case 'D':
                    bots[i].lastAction = -1;
                    break;
                default:
                    sscanf(buf, "%d", &bots[i].lastAction);
                    break;
            }
            if (quit) {
                goto done;
            }
        }

        qsort(bots, num, sizeof(Bot), compare_bots);

        printf("%d", bots[0].id);
    }

done:
    return 0;
}

9

पायथन 2 - प्रीकॉग

Precog पिछले एक्शन फ़्रीक्वेंसी के आधार पर हर किसी की चाल की भविष्यवाणी करने की कोशिश करता है, फिर कुछ सिमुलेशन की कोशिश करता है और एक को चुनता है जो उसके स्कोर को अधिकतम करता है। यह विशेष रूप से विश्वसनीय नहीं है, लेकिन फिर ... ईएसपी वास्तविक नहीं है। : डी

import json, sys
from random import choice

#'S'/'W' = attack high/low power (strong/weak)
#'H'/'F'  = attack high/low health (hale/frail)
#'A' = attack defender (armor)
#'R' = attack random (it doesn't know)
#'D' = defend

amin = lambda x: x.index(min(x))
amax = lambda x: x.index(max(x))

def pick(history, ids, action):
    if action == 'D':
        return 'D'
    if action == 'R' or len(history['all'][-1][action]) < 1:
        return choice(ids)
    return choice(history['all'][-1][action])

args = sys.argv
if len(args) == 1:
    print 'ok'
    sys.exit()
me = args[1]

def notme(l):
    tmp = list(l)
    try:
        tmp.remove(me)
    except ValueError:
        pass
    return tuple(tmp)

args = args[2:]
try:
    with open('precog.state') as f:
        history = json.load(f)
except (IOError, ValueError):
    history = {}
if len(history) == 0:
    history = {'all':[]}

args = [a.split(',') for a in args]
ids,hps,pows,acts = zip(*args)
hps,pows = map(int,hps), map(int,pows)

for i,h,p,a in args:
    if a == 'X': #most people will try not to attack armored
        history[i] = {'a':'SWHFRD','health':[],'power':[],'score':[]}
    elif acts == 'D':
        history[i]['a'] += 'D'
    else:
        for x in 'SWHFA':
            if a in history['all'][-1][x]:
                history[i]['a'] += x
                break
        else:
            history[i]['a'] += 'R'
    history[i]['health'] += int(h),
    history[i]['power'] += int(p),
    history[i]['score'] += int(h)*int(p),

history['all'] += {'S':[ids[amax(pows)]],
                   'W':[ids[amin(pows)]],
                   'H':[ids[amax(hps)]],
                   'F':[ids[amin(hps)]],
                   'A':[ids[i] for i in filter(lambda x:acts[x]=='D',range(len(acts)))]},

with open('precog.state','w') as f:
    json.dump(history,f)

scores = dict(zip('SWHFRAD',[0]*7))
for _ in range(50):
    for act in 'SWHFRAD':
        _score = {}
        p,h,a = dict(zip(ids,pows)),dict(zip(ids,hps)),{i:0 for i in ids}
        opp = {i:choice(history[i]['a']) for i in ids if i != me}
        opp[me] = act
        m = {o:[1,2][opp[o]=='D'] for o in opp}
        for o in opp:
            if opp[o] != 'D':
                if o == me:
                    target = pick(history, notme(ids), opp[o])
                else:
                    target = pick(history, ids, opp[o])
                h[target] -= p[o]/m[target]
                a[target] += 1
        for o in opp:
            p[o] += m[o] * a[o]
            _score[o] = p[o] * h[o]
        scores[act] += _score.pop(me) - sum(_score.values())

target = pick(history, notme(ids), scores.keys()[amax(scores.values())])
if target == me:
    target = choice(notme(ids))
print target

2
यह बॉट कभी-कभी अन्य बॉट्स पर हमला करता है जो पहले से ही मर चुके हैं। यह अन्यथा एक मजबूत बॉट है (क्योंकि यह मेरे बॉट को टेस्ट बॉट्स के खिलाफ हर समय केवल 50% उस समय जीतने से नीचे लाता है जब आपका बॉट मेरे परीक्षणों में शामिल था)।
पोटाटोमेटो

9

बैश - कॉपीकैट

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

बस इसके साथ निष्पादित करें /bin/bash copycat.sh

#!/bin/bash

if [[ "$1" == "" ]]; then echo "ok"; exit; fi

debug() {
    #echo "$(date): $*" >> copycat.log 
    return;
}

me=$1; shift
meAsTarget=0
myAction="D" #better than an invalid command
topBot=-1
topBotAwe=0
worstBot=-1
worstBotAwe=100
aliveBots=0

myMostWeakAttacker=-1
mmwaAwe=0

if [[ -e "./state/copycat.state" ]]; then
    . ./state/copycat.state
fi

for rawBot 
do
    if [[ "$rawBot" == "" ]]; then continue; fi
    if [[ $(echo $rawBot | grep -Fo ',' | wc -l) -ne 3 ]]; then continue; fi

    bot=(${rawBot//,/ })
    id=${bot[0]}; life=${bot[1]}; power=${bot[2]}; lastAction=${bot[3]}

    printf "%d\n" "$lastAction" > /dev/null 2>&1
    if [[ "$?" -ne 0 && "$lastAction" != "D" ]]; then continue; fi

    if [[ "$life" -le 0 ]]; then continue; fi
    ((aliveBots++))

    awesomeness=$(( 2 * (((life/10) * power) / (life/10 + power)) ))
    if [[ "$id" -eq "$me" ]]; then
        myLastAction="$lastAction"
        myAwe="$awesomeness"
    else
        lastBot=$id
    fi

    if [[ "$awesomeness" -gt "$topBotAwe"
        && "$lastAction" != "D"
        && "$lastAction" != "$me" ]]; then
            topBot=$id
            topBotAwe=$awesomeness
            topBotTarget=$lastAction
    fi

    if [[ "$awesomeness" -lt "$worstBotAwe" ]]; then
        worstBot=$id
        worstBotAwe=$awesomeness
    fi

    if [[ "$lastAction" -eq "$me" ]]; then
        ((meAsTarget++))
        if [[ "$awesomeness" -lt "$mmwaAwe" ]]; then
            myMostWeakAttacker=$id
            mmwaAwe=$awesomeness
        fi
    fi
done

backupStrategy() {
    if [[ "$myMostWeakAttacker" != "-1" && "$mmwaAwe" -lt "$myAwe" ]]; then
        debug "attacking my most weak attacker ($myMostWeakAttacker) who is weaker then me"
        myAction=$myMostWeakAttacker
    elif [[ "$worstBot" != "-1" && "$worstBot" != "$me" ]]; then
        debug "attacking the worst bot $worstBot"
        myAction=$worstBot
    elif [[ "$myMostWeakAttacker" != "-1" ]]; then
        debug "attacking my most weak attacker $myMostWeakAttacker"
        myAction=$myMostWeakAttacker
    else
        debug "no one is attacking me anymore; attacking the last ones"
        myAction=$lastBot
    fi
}

if [[ "$meAsTarget" -gt "$((aliveBots/2))" ]]; then
    #hit-and-run
    if [[ "$myLastAction" == "D" && "$myAwe" -gt "$worstBotAwe" ]]; then
        debug "I am still under fire, but not the worst one.."
        backupStrategy
    else
        debug "I was attacked to much; defending now (attack level: $meAsTarget)"
        myAction="D"
        meAsTarget=$((meAsTarget-aliveBots/2))
    fi
elif [[ "$topBotTarget" != "" ]]; then
    myAction=$topBotTarget

    for rawBot
    do
        if [[ "$rawBot" == "" ]]; then break; fi
        bot=(${rawBot//,/ })
        if [[ "${bot[0]}" -eq "$topBotTarget" ]]; then
            if [[ "${bot[1]}" -le 0 ]]; then
                backupStrategy
            else
                debug "copying strategy from bot $topBot attacking $myAction"
            fi
            break
        fi
    done
else
    backupStrategy
fi

if ! [[ -d "./state" ]]; then mkdir -p "./state"; fi
cat <<EOF_STATE > "./state/copycat.state"
topBotTarget="$topBotTarget"
meAsTarget="$meAsTarget"
EOF_STATE

echo "$myAction"
exit 0

उसकी कमजोरी: वह कभी भी बेहतर नहीं हो सकता है क्योंकि वह ऊपर दिखता है। :()


8

पायथन 3 डिफेंसिवबॉट

बॉट दुश्मन को उच्चतम शक्ति के साथ खोजने की कोशिश करता है जो अपनी वर्तमान शक्ति के साथ मार सकता है। अन्यथा, बचाव। साथ दौड़ोpython DefensiveBot.py id bot1 etc

import sys

def resolve(bots, power, life):
    highPowerCanKill = -1
    highPower = 0
    for i in bots:
        if int(i[1]) < int(power):
            if(int(i[2]) > int(highPower)) and (int(i[1]) > 0):
                highPower = i[2]
                highPowerCanKill = i[0]
    if highPowerCanKill != -1:
        return highPowerCanKill
    else:
        return "D"

args = sys.argv
if len(args) == 1:
    print("ok")
    sys.exit()
fileName = str(__file__).split('\\')
fileName = fileName[len(fileName)-1]
myId = args[1]

bots = []

for i in args:
    i = i.split(',')
    if len(i) == 1:
        continue
    if i[0] == myId:
        power = i[2]
        life = i[1]
        continue
    elif i[0] == fileName:
        continue

    bots.append(i)

kill = resolve(bots, power, life)
print(kill)

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


ठीक है, यह चलता है, लेकिन वहाँ चल रही मुद्रण मुद्रण है। मुझे मान्य प्रतिक्रियाएँ देने के लिए 28 और 32 की पंक्तियों पर टिप्पणी करनी होगी। नहीं तो बस मर जाता है।
जियोबिट्स

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

उच्छ्वास तय। मुझे लगता है कि यह अंतिम फिक्स नहीं है: पी
एलियास बेनेवेदेस

8

जावा टैंक

टैंक सोचता नहीं है, वह परवाह नहीं करता है, वह सिर्फ अपने द्वारा देखे जाने वाले पहले बॉट पर हमला करता है! हालांकि वह खुद पर या मृत लोगों पर हमला नहीं करने के लिए काफी स्मार्ट है।

public class Tank{
    public static void main (String[] args){
        if(args.length == 0){
            System.out.print("ok");
            System.exit(0);
        }

        String myId = args[0];
        int life = Integer.MIN_VALUE;
        String[] tokens = {};
        String opposingId = "";

        for(int i=1; i<args.length; i++){
            tokens = args[i].split(",");
            opposingId = tokens[0];
            life = Integer.parseInt(tokens[1]);
            if(life > 0 && !opposingId.equals(myId)){
                System.out.println(opposingId);
                System.exit(0);
            }
        }
        System.out.println("D");
    }
}

1
जैसा कि आपके अन्य बॉट पर उल्लेख किया गया है, यह संकलन नहीं है जैसा कि यह है।
जियोबिट्स

8

जावा - फैंटम मेंस

नमस्ते! यह मेरी पहली पोस्ट यहाँ कोड गोल्फ में है। मैं एक सी # लड़का हूं इसलिए मेरे फ्रेंच प्लीज को माफ कर दो। मैंने हीरो और कायर नमूना कोड के कुछ हिस्सों का उपयोग किया है।

मेरा बॉट एक साधारण आदमी है जिसमें काफी राजनीतिक रवैया है। ज्यादातर समय वह केवल लॉबी में खुद को कॉफी पीने और अपनी योजनाओं को तैयार करने के लिए छिपाता है। लेकिन जब मौका पैदा होता है और लाभ की संभावना काफी मजबूत होती है तो वह अपनी आरामदायक लॉबी आर्मचेयर से कूद जाता है, अखबार फेंक देता है और पैसे के लिए चला जाता है।

किसी भी तरह का नुकसान होने पर वह अपना बचाव करता है। अन्यथा वह एक सच्चे हीरो की तरह व्यवहार करता है (यह भी एक राजनीतिक निर्णय है क्योंकि यह काफी सुरक्षित है)। जब उसके पास केवल तीन प्रतियोगी हों तो वह जीत के लिए जाता है।

वह कुछ बुनियादी सिद्धांतों का पालन करता है। हर गंभीर राजनीतिज्ञ के पास कुछ अटूट सिद्धांत और स्पष्ट रूप से परिभाषित प्रोफ़ाइल होनी चाहिए ...

किसी की मदद न करें बल्कि खुद करें! (अहंकारी)

महिमा का अर्थ है मृत्यु! (स्केप्टिक)

आपके मरने के बाद कुछ भी नहीं है! (नास्तिक)

public class PhantomMenace {
    public static void main(String[] args) {
        if(args.length < 1)
        {
            System.out.print("ok");
            System.exit(0);
        }

           String me = args[0], target="D", secondTarget="D", worstTarget="D";
           int best=0;
           int attackerCount = 0;
           int numBots= 0;
           int secondBest=0;
           int worst=0;

        for(int i=1;i<args.length;i++)
        {
            String[] tokens = args[i].split(",");
            int life = Integer.valueOf(tokens[1]);
            if(life > 0 && life >= best)
            {
                secondBest = best;
                secondTarget = target;
                best = life;
                target = tokens[0];

            }
            else if(life > 0 && life >= secondBest)
            {
                secondBest= life;
                secondTarget = tokens[0];
            }

            if(life > 0 && life <= best)
            {
            worst = life;
            worstTarget = tokens[0];
            }
            // count incoming attacks
            if(tokens[3].equals(me))
            attackerCount++;
            // count living bots
            if(life>0)
            numBots++;
        }

        // activate offensive regime?!
        if(numBots<5)
        {
            if(target.equals(me))
              System.out.print(secondTarget);
            else
              System.out.print(target);
        }
        else
        {
          if(worstTarget.equals(me))
            System.out.print("D");
          if(target.equals(me))
            System.out.print("D");
          else if(attackerCount>0)
            System.out.print("D");
          else
            System.out.print(target);
        }

    }
}

1
बहुत अच्छा है, और वर्तमान में दूसरे स्थान पर है। साइट पर आपका स्वागत है :)
ज्योबिट्स

ओह धन्यवाद, हालांकि यह एक सुखद आश्चर्य है मुझे स्वीकार करना है कि मैंने अपने बॉट में विश्वास करना कभी नहीं रोका: पी।
स्ट्रॉमक्रॉस

7

आई नो यू - जावा

सभी दुश्मनों का विश्लेषण करता है और इस जानकारी का उपयोग खुद का बेहतर बचाव करने के लिए करता है। दुर्भाग्य से, यह बदला लेने के लिए प्रवण है।

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.LineNumberReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class IKnowYou {
    final static int LINES = 40;
    Bot me;
    final List<Bot> bots = new ArrayList<>();
    final List<Bot> livingEnemies = new ArrayList<>();
    final File file = new File("state/IKnowYou");
    final long lineCount;

    public static void main(String[] args) {
        if(args.length < 1){
            System.out.print("ok");
            System.exit(0);
        }
        new IKnowYou(args).run();
    }

    public IKnowYou(String[] args) {
        for (int i = 1; i < args.length; i++) {
            Bot bot = new Bot(args[i], args[0]);
            bots.add(bot);
            if (bot.isMe) {
                me = bot;
            } else if (bot.life > 0) {
                livingEnemies.add(bot);
            }
        }
        lineCount = lineCount();
    }

    void run() {
        if (me.lastAction.equals("X")) {
            createFile();
            updateFile();
            System.out.println(livingEnemies.get(0).id);
            System.exit(0);
        }
        if (lineCount % LINES != 0) {
            updateFile();
        }
        if (underAttack()) {
            System.out.println("D");            
        } else {
            for (Bot bot : livingEnemies) {
                if (bot.lastAction.equals(me.id)){
                    System.out.println(bot.id);
                    return;
                }
            }
            int maxP = 0;
            Bot maxPowerBot = null;
            for (Bot bot : livingEnemies) {
                if (bot.power > maxP){
                    maxP = bot.power;
                    maxPowerBot = bot;
                }
            }
            System.out.println(maxPowerBot.id);
        }
    }

    void createFile() {
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {}
        }
    }

    void updateFile() {
        List<Bot> oldBots = new ArrayList<>();
        if (me.lastAction.equals("X")) {
            for (Bot bot : bots) {
                Bot copyBot = bot.copy();
                bot.life = 1000;
                bot.power = 10;
                oldBots.add(copyBot);
            }
        } else {
            String oldState = "";
            try (BufferedReader input = new BufferedReader(new FileReader(file))) {
                String line;
                while ((line = input.readLine()) != null && !line.equals("\n")) {
                    oldState = line;
                }
            } catch (Exception e) {}
            String[] parts = oldState.split(" ");
            for (int i = 0; i < parts.length; i++) {
                oldBots.add(new Bot(parts[i]));
            }
        }
        List<List<String>> ids = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            ids.add(new ArrayList<String>());
        }
        int maxL = -1, minL = 1001, maxP = 0;
        for (Bot bot : oldBots) {
            if (bot.life > maxL) {
                ids.get(0).clear();
                maxL = bot.life;
                ids.get(0).add(bot.id);
            } else if (bot.life == maxL) {
                ids.get(0).add(bot.id);
            }
            if (bot.life < minL) {
                ids.get(1).clear();
                minL = bot.life;
                ids.get(1).add(bot.id);
            } else if (bot.life == minL) {
                ids.get(1).add(bot.id);
            }
            if (bot.power > maxP) {
                ids.get(2).clear();
                maxP = bot.power;
                ids.get(2).add(bot.id);
            } else if (bot.power == maxP) {
                ids.get(2).add(bot.id);
            }
        }
        StringBuilder[] output = new StringBuilder[3];
        for (int i = 0; i < 3; i++) {
            output[i] = new StringBuilder();
        }
        output[0].append("maxL");
        output[1].append("minL");
        output[2].append("maxP");
        for (Bot bot : bots) {
            if (bot.isMe) 
                continue;
            for (int i = 0; i < 3; i++) {
                if (ids.get(i).contains(bot.lastAction)) {
                    output[i].append(' ').append(bot.id);
                }
            }
        }
        try(FileWriter wr = new FileWriter(file, true)) {
            for (int i = 0; i < 3; i++) {
                output[i].append('\n');
                wr.append(output[i].toString());
            }
            StringBuilder sb = new StringBuilder();
            for (Bot bot : bots) {
                sb.append(bot.id).append(',').append(bot.life).append(',').append(bot.power).append(' ');
            }
            wr.append(sb.toString().trim() + "\n");
        } catch (IOException e) {}
    }

    boolean underAttack() {
        Bot attacker = null;
        for (Bot bot : bots) {
            if (bot.lastAction.equals(me.id)) {
                if (attacker != null) {
                    return true;
                } else {
                    attacker = bot;
                }
            }
        }

        int maxL = 0, minL = 1001, maxP = 0;
        for (Bot bot : bots) {
            if (bot.life > maxL)
                maxL = bot.life;
            if (bot.life < minL)
                minL = bot.life;
            if (bot.power > maxP)
                maxP = bot.power;
        }
        if ((me.life < maxL && me.life > minL && me.power < maxP) || livingEnemies.size() == 1) {
            return false;
        }
        List<Map<String, Integer>> stats = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            stats.add(new HashMap<String, Integer>());
        }
        for (Bot bot : bots) {
            for (int i = 0; i < 3; i++) {
                stats.get(i).put(bot.id, 0);
            }
        }
        try (BufferedReader input = new BufferedReader(new FileReader(file))) {
            String line;
            while ((line = input.readLine()) != null) {
                if (line.startsWith("m")) {
                    int map = line.startsWith("maxL") ? 0 : line.startsWith("minL") ? 1 : 2;
                    String[] parts = line.split(" ");
                    for (int i = 1; i < parts.length; i++) {
                        int count = stats.get(map).get(parts[i]);
                        stats.get(map).put(parts[i], count+1);
                    }
                }
            }
        } catch (Exception e) {}
        for (int i = 0; i < 3; i++) {
            if ((me.life == maxL && i == 0) || (me.life == minL && i == 1) || (me.power == maxP && i == 2)) {
                for (String id : stats.get(i).keySet()) {
                    int count = stats.get(i).get(id);
                    if (count / ((float)lineCount / 4) > 0.65) {
                        for (Bot bot : bots) {
                            if (bot.id.equals(id)) {
                                if (bot.life > 0) {
                                    return true;
                                } else {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
        return false;
    }

    long lineCount() {      
        try (LineNumberReader  lnr = new LineNumberReader(new FileReader(file))) {
            lnr.skip(Long.MAX_VALUE);
            return lnr.getLineNumber();
        } catch (IOException e) {
            return 0;
        }
    }

    class Bot {
        String id, lastAction;
        int life, power;
        boolean isMe;

        public Bot() {}

        public Bot(String bot, String myId) {
            String[] parts = bot.split(",");
            id = parts[0];
            life = Integer.valueOf(parts[1]);
            power = Integer.valueOf(parts[2]);
            lastAction = parts[3];
            isMe = id.equals(myId);
        }

        public Bot(String oldBot) {
            String[] parts = oldBot.split(",");
            id = parts[0];
            life = Integer.valueOf(parts[1]);
            power = Integer.valueOf(parts[2]);
        }

        Bot copy() {
            Bot bot = new Bot();
            bot.id = id;
            bot.lastAction = lastAction;
            bot.life = life;
            bot.power = power;
            bot.isMe = isMe;
            return bot;
        }
    }
}

7

जावा - वेलोसिरैप्टर

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

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Velociraptor {

    public static void main(String[] args) {
        if (args.length < 1) {
            System.out.print("ok");
            System.exit(0);
        }
        Velociraptor raptor = new Velociraptor(args);
        System.out.print(raptor.determineVictim());
    }

    private final String observationsFilePath = "state/velociraptor.txt";
    private final File observationsFile = new File(observationsFilePath);

    private int id, life, power, round;
    private List<Bot> preyList;
    private Map<Integer, Integer> preyDefendCounts;

    public Velociraptor(String[] preyStates) {
        loadObservations();
        observePrey(preyStates);
        saveObservations();
    }

    private void observePrey(String[] preyStates) {
        this.id = Integer.valueOf(preyStates[0]);
        preyList = new ArrayList<>();
        for (int i = 1; i < preyStates.length; i++) {
            String[] tokens = preyStates[i].split(",");
            int preyId = Integer.valueOf(tokens[0]);
            int preyLife = Integer.valueOf(tokens[1]);
            int preyPower = Integer.valueOf(tokens[2]);
            String lastAction = tokens[3];

            if (preyId == this.id) {
                this.life = preyLife;
                this.power = preyPower;
            } else if (preyLife > 0) {
                Bot prey = new Bot();
                prey.id = preyId;
                prey.life = preyLife;
                prey.power = preyPower;
                prey.lastAction = lastAction;
                preyList.add(prey);
                //Clever girl!
                if (prey.lastAction.equals("D")) {
                    int preyDefendCount = preyDefendCounts.getOrDefault(prey.id, 0);
                    preyDefendCount++;
                    preyDefendCounts.put(prey.id, preyDefendCount);
                }
            }
        }
    }

    public String determineVictim() {
        if (this.life == 1000) { //lay in wait until attacked
            return "D";
        }
        double fastestKill = 1000; //max game rounds
        Bot victim = null;
        for (Bot prey : preyList) {
            int preyDefendCount = preyDefendCounts.getOrDefault(prey.id, 0);
            double effectiveMultiplier = 1 - (.5 * preyDefendCount / round);
            double turnsToKill = prey.life / (this.power * effectiveMultiplier);
            //target whoever can be killed fastest
            //in case of tie, kill the prey with more power first
            if (turnsToKill < fastestKill || (victim != null && turnsToKill == fastestKill && prey.power > victim.power)) {
                fastestKill = turnsToKill;
                victim = prey;
            }
        }
        return String.valueOf(victim.id);
    }

    private void loadObservations() {
        preyDefendCounts = new HashMap<>();
        if (observationsFile.exists()) {
            try (Scanner scanner = new Scanner(observationsFile)) {
                round = Integer.valueOf(scanner.nextLine());
                while (scanner.hasNext()) {
                    String line = scanner.nextLine();
                    String[] tokens = line.split(",");
                    int preyId = Integer.valueOf(tokens[0]);
                    int preyDefendCount = Integer.valueOf(tokens[1]);
                    preyDefendCounts.put(preyId, preyDefendCount);
                }

            } catch (FileNotFoundException ex) {
                System.out.println(ex.getMessage());
            }
        }
        round++;
    }

    private void saveObservations() {
        if (!observationsFile.exists()) {
            try {
                observationsFile.createNewFile();
            } catch (IOException ex) {
                System.out.println(ex.getMessage());
            }
        }
        try (PrintWriter writer = new PrintWriter(observationsFile)) {
            writer.println(round);
            if (preyDefendCounts != null) {
                preyDefendCounts.entrySet().stream().forEach(entry -> writer.println(entry.getKey() + "," + entry.getValue()));
            }
        } catch (FileNotFoundException ex) {
            System.out.println(ex.getMessage());
        }
    }

    private class Bot {

        public int id, life, power;
        public String lastAction;
    }
}

7

अजगर 3 - अर्धचालक

हमलों और बचाव के बाद पिछले मजबूती-परिवर्तनों द्वारा भारित यादृच्छिकता के आधार पर हमले और बचाव के बीच चयन करता है। अगर हमला होता है तो यह सबसे मजबूत खिलाड़ी पर हमला करता है। मजबूती को इस प्रकार परिभाषित किया गया है life * power

3 उदाहरण बॉट के खिलाफ यह शायद ही कभी जीतता है। शायद जंगली में ...

import sys, random

def get_goodness(r,d):
    if len(d)==0:
        return 0
    return sum(v/(r-k+5) for k,v in d.items())/sum(1/(r-k+5) for k,v in d.items())

def get_att_chance(r,ad,dd,b):
    ag=get_goodness(r,ad)+500+p/2/len(b)
    dg=get_goodness(r,dd)+500    
    return ag/(ag+dg)

args=sys.argv
if len(args)==1:
    print("ok")
    with open('state/semirandom.txt','w') as f:
        f.write('-1\n1000\n10\n{}\n{}\n"S"\n')
    sys.exit()
me=int(args[1])
b=[]
for ae in args[2:]:
    if ae[-1] in 'DX':    
        ae=ae[:-1]+'-1'
    ae=ae.split(',')
    if int(ae[0])!=me:
        b+=[[int(ae[i]) for i in range(4)]]
    else:
        l,p=int(ae[1]),int(ae[2])
with open('state/semirandom.txt','r') as f:
    data=f.read()
co,lo,po,ad,dd,h=map(eval,data.split('\n')[:-1])
r=len(ad)+len(dd)
vc=l*p-lo*po
if co==0:
    ad[r]=vc
if co==1:
    dd[r]=vc   
ll=sum([be[1] for be in b])
em=ll/p/len(b)/(1000-r)*2
target_id=max(b,key=lambda be:be[1]*be[2])[0]
if random.random()<em:
    action=0
else:
    if random.random()<get_att_chance(r,ad,dd,b):
        action=0
    else:
        action=1        
if action==0:
    act=str(target_id)
else:
    act='D'
with open('state/semirandom.txt','w') as f:
    f.write('{}\n{}\n{}\n{}\n{}\n"{}"\n'.format(action,l,p,ad,dd,h+act))        
print(act)

7

जावा- रोमन कछुआ

रोमन कछुआ अपने पास आने वाले किसी भी व्यक्ति पर हमला करेगा, लेकिन बेतरतीब ढंग से अन्य बॉट्स पर हमला करने का फैसला करेगा क्योंकि यह कायर नहीं है। यह कभी-कभार (50 में से 1) माफी दिखाता है।

import java.util.NoSuchElementException;
import java.util.Random;

public class RomanTortoise {

    public static void main(String[] args) {
        Random r = new Random();
        if(args.length < 1){
            System.out.print("ok");
            System.exit(0);
        }
        try{
            String me = args[0];
            try{
            if(args[1].split(",")[3].equals("X"))
            {
                 System.out.print("D");
                 System.exit(0);
            }
            }
            catch(NoSuchElementException nse)
            {

            }
            for(int i = 1; i<args.length; i++)
            {
                try{
                    String[] tokens = args[i].split(",");
                    if(tokens.length>3)
                    {
                        String lastAction = tokens[3];

                        if(lastAction.equals(me) && (Integer.parseInt(tokens[1])>0))
                        {
                            //probably attack that bot
                            if(r.nextInt()%50 != 0)
                            {
                                System.out.print(tokens[0]);
                                System.exit(0);
                            }
                        }
                    }
                }
                catch(NoSuchElementException nse)
                {

                }
            }
            if(r.nextInt()%2 == 0)
            {
                for(int i = 0; i<100; i++)
                {
                    try{
                        int j = (r.nextInt() % (args.length-1)) + 1;
                        String[] tokens = args[j].split(",");
                        if(tokens.length>3)
                        {
                            if(Integer.valueOf(tokens[1])>0)
                            {
                                System.out.print(tokens[0]);
                                System.exit(0);
                            }
                        }
                    }
                    catch(NoSuchElementException nse)
                    {

                    }
                }
            }
        }
        catch(Exception e){}
        System.out.print("D");
        System.exit(0);
    }

}

क्या कोई विशेष कारण है कि NoSuchElementExceptionजब आप tryब्लॉक में फेंके गए प्रतीत नहीं होते हैं, तो आपको पकड़ने का प्रयास करते हैं ? या क्या मैं कुछ न कुछ भूल रहा हूं?
टीएनटी

@TNT कोई और नहीं। एक सरणी के तत्वों में से एक का उपयोग करते समय मुझे कभी-कभी वह अपवाद मिल रहा था। मेरी बग को ठीक किया लेकिन सिर्फ कोशिश में पकड़ छोड़ दिया - सॉरी से बेहतर सुरक्षित :)
euanjt

7

जावा - ब्रोबोट

BroBot सबसे शक्तिशाली प्रतिद्वंद्वी पर हमला करेगा जब तक कि कुछ उत्तरोत्तर छोटे मूल्य से अधिक हमले वाले दुश्मन BroBot पर हमला करने का निर्णय नहीं लेता है, उस स्थिति में वह उस मोड़ का बचाव करेगा।

public class BroBot {
    public static void main(String[] args) {
        if (args.length == 0) {
            System.out.println("ok");
            return;
        }

        int health = 0, id = Integer.parseInt(args[0]);
        for (int k = 1; k < args.length; k++) {
            if (Integer.parseInt(args[k].split(",")[0]) == id) {
                health = Integer.parseInt(args[k].split(",")[1]);
                break;
            }
        }

        String action = "";
        for (String s : args) {
            if (!s.contains(",")) continue;
            String[] botInfo = s.split(",");
            int botId = Integer.parseInt(botInfo[0]);
            if (botId == id) continue;
            if (!botInfo[3].equals("D")) {
                try {
                    if (Integer.parseInt(botInfo[3]) == id && Integer.parseInt(botInfo[2]) >= health / 4) {
                        action = "D";
                        break;
                    }
                } catch (NumberFormatException ex) {
                    continue;
                }
            }
        }

        if (action.isEmpty()) {
            int max = 0;
            for (String s : args) {
                if (!s.contains(",")) continue;
                String[] botInfo = s.split(",");
                if (Integer.parseInt(botInfo[0]) == id ||
                    Integer.parseInt(botInfo[1]) <= 0) continue;
                int attack = Integer.parseInt(botInfo[2]);
                if (attack > max) {
                    attack = max;
                    action = botInfo[0];
                }
            }
        }
        System.out.println(action);
    }
}

जावा - सिसबोट

बिना बहन के क्या भाई? बहुत सी बातें ... लेकिन यह बात बिल्कुल बगल में है। होशियार बॉट होने के नाते, सिसबोट प्रत्येक बॉट की अंतिम क्रियाओं को बचाता है, उनकी वर्तमान और अंतिम क्रियाओं का विश्लेषण करता है और उसकी चाल बनाता है - वह बॉट पर एक दूसरे विचार के बिना उच्चतम शक्ति के साथ हमला करेगी, बशर्ते कि उसका स्वास्थ्य और शक्ति पर्याप्त रूप से पर्याप्त हो और एक निश्चित मूल्य से ऊपर पावर स्टेट वाली कोई अन्य बॉट उस पर हमला करने का फैसला नहीं करती है; उस स्थिति में वह हमलावर और बचाव के बीच बदल जाएगा, या हमलावर की शक्ति वास्तव में अधिक होने पर सीधे बचाव करेगा।

import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class SisBot {
    private static final Path directoryPath = Paths.get("state");
    private static final Path filePath = Paths.get("state" + java.io.File.separator + "SisBot.txt");
    private List<Bot> botList;
    private List<String> fileContents;
    private int id, health, power, turn;

    public SisBot(String[] args) throws IOException {
        if (args.length == 0) {
            createSaveFile();
            System.out.println("ok");
            System.exit(0);
        }
        fileContents = Files.readAllLines(filePath, Charset.defaultCharset());
        for (int k = 1; k < args.length; k++) {
            if (args[k].split(",")[3].equals("X")) {
                Files.write(filePath, "".getBytes());
                fileContents.clear();
                break;
            }
        }
        getBots(args);
        makeMove();
        writeBots();
    }

    private void createSaveFile() throws IOException {
        if (!Files.exists(filePath)) {
            if (!Files.exists(directoryPath))
                Files.createDirectory(directoryPath);
            Files.createFile(filePath);
        }
        else
            Files.write(filePath, "".getBytes());
    }

    private void getBots(String[] args) {
        id = Integer.parseInt(args[0]);
        botList = new ArrayList<Bot>();
        for (int k = 1; k < args.length; k++) {
            String[] botInfo = args[k].split(",");
            if (Integer.parseInt(botInfo[0]) != id && Integer.parseInt(botInfo[1]) > 0)
                botList.add(new Bot(args[k]));
            else if (Integer.parseInt(botInfo[0]) == id) {
                health = Integer.parseInt(botInfo[1]);
                power = Integer.parseInt(botInfo[2]);
            }
        }
    }

    private void makeMove() throws IOException {
        if (fileContents.isEmpty()) {
            System.out.println(botList.get((int)(Math.random()*botList.size())).getId());
            return;
        }
        getLastAction();
        String action = "";
        int maxHealth = 0, maxPower = 0;
        for (Bot b : botList) {
            if (power >= 40 && health >= 250) {
                if (b.getPower() > maxPower && (!b.getAction().equals("D") || botList.size() == 1)) {
                    maxPower = b.getPower();
                    action = String.valueOf(b.getId());
                }
            }
            else if (b.getAction().equals(String.valueOf(id)) && b.getLastAction() != null && b.getLastAction().equals(String.valueOf(id))) {
                System.out.println(health % 2 == 0 ? b.getId() : "D");
                return;
            }
            else if (b.getAction().equals(String.valueOf(id)) && b.getPower() > 50) {
                System.out.println("D");
                return;
            }
            else {
                if (b.getHealth() > maxHealth) {
                    maxHealth = b.getHealth();
                    action = String.valueOf(b.getId());
                }
            }
        }
        System.out.println(action);
    }

    private void getLastAction() {
        boolean endNext = false;
        for (String s : fileContents) {
            if (s.startsWith("Turn")) {
                turn = Integer.parseInt(s.split(" ")[1]);
                if (endNext)
                    break;
                else {
                    endNext = true;
                    continue;
                }
            }
            if (s.isEmpty()) break;
            String[] botInfo = s.split(",");
            for (Bot b : botList) {
                if (b.getId() == Integer.parseInt(botInfo[0]))
                    b.setLastAction(botInfo[4]);
            }
        }
    }

    private void writeBots() throws IOException {
        StringBuilder sb = new StringBuilder();
        String s = System.lineSeparator();
        sb.append("Turn " + ++turn + s);
        for (Bot b : botList) {
            b.setLastAction(b.getAction());
            sb.append(b.toString() + s);
        }
        sb.append(s);
        for (String str : fileContents)
            sb.append(str + s);
        Files.write(filePath, sb.toString().getBytes());
    }

    public static void main(String[] args) throws IOException {
        new SisBot(args);
    }

    private class Bot {
        private int id, health, power;
        private String action, lastAction;

        public Bot(String info) {
            String[] botInfo = info.split(",");
            id = Integer.parseInt(botInfo[0]);
            health = Integer.parseInt(botInfo[1]);
            power = Integer.parseInt(botInfo[2]);
            action = botInfo[3];
        }

        public int getId() {
            return id;
        }

        public int getHealth() {
            return health;
        }

        public int getPower() {
            return power;
        }

        public String getAction() {
            return action;
        }

        public void setLastAction(String lastAction) {
            this.lastAction = lastAction;
        }

        public String getLastAction() {
            return lastAction;
        }

        @Override
        public String toString() {
            return new StringBuilder()
                    .append(id).append(",")
                    .append(health).append(",")
                    .append(power).append(",")
                    .append(action).append(",")
                    .append(lastAction).toString();
        }
    }
}

मुझे वास्तव में एक अलग भाषा सीखने को मिली है ...: पी


ऐसा प्रतीत होता है कि आपको चयनित लक्ष्य के लिए पहले से ही मृत होने वाले चेक की आवश्यकता है।
राल्फ मार्शल

मुझे लगा कि मेरे पास पहले से ही है ... लेकिन फिर मैंने यहां पोस्ट करने से पहले एक अलग रणनीति बनाई। उस पकड़ने के लिए धन्यवाद।
टीएनटी

6

जावा तुल्यकारक

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

public class Equaliser {
    public static void main (String[] args) {
        if (args.length == 0) {
            System.out.print("ok");
            System.exit(0);
        }

        String myId = args[0];
        String[] tokens;
        int life, power;
        int lowestPower = Integer.MAX_VALUE;
        String lowest = "";
        int lowestLife = 1000;
        int myLife = 0;

        for (int i=1; i<args.length; i++) {
            tokens = args[i].split(",");
            life = Integer.parseInt(tokens[1]);
            power = Integer.parseInt(tokens[2]);
            if (!tokens[0].equals(myId)) {
                if (life > 0 && power < lowestPower && !tokens[3].equals("D")) {
                    lowest = tokens[0];
                    lowestPower = power;
                }
                lowestLife = Math.min(life, lowestLife);
            } else {
                myLife = life;
            }
        }

        if (myLife < lowestLife*5/4) {
            // IT'S TIME TO DEFEND!
            System.out.println("D");
        } else if (lowestPower != Integer.MAX_VALUE) {
            System.out.println(lowest);
        } else {
            // Them buffed up perma-defenders don't need no power
            System.out.println("D");
            // And if you can't beat 'em, join 'em
        }
    }
}

6

जावा - वाईसनिपर - रिफ्लेक्स एजेंट

एक साधारण रिफ्लेक्स एजेंट, जो एक साधारण हेयुरिस्टिक का उपयोग करके सबसे खतरनाक बॉट की पहचान करता है और फिर उस पर हमला करता है।

public class Wiisniper {
    public static void main(String[] args) {
        if(args.length < 1){
            System.out.print("ok");
            System.exit(0);
        }
        String me = args[0], target="D";
        double bestRatio = Integer.MIN_VALUE;

        String[] tokens = args[Integer.valueOf(me)].split(",");
        double myLife = Integer.valueOf(tokens[1]);
        double myPower = Integer.valueOf(tokens[2]);

        for(int i=1;i<args.length;i++){
            tokens = args[i].split(",");
            double life = Integer.valueOf(tokens[1]);
            double power = Integer.valueOf(tokens[2]);
            double ratio = myLife/power - life/myPower;
            if(tokens[3].equals(me)) //attacks my bot
                ratio = ratio * 5;
            if(life > 0 && power > 0 && !tokens[0].equals(me) && myPower > 0 && ratio > bestRatio){
                bestRatio = ratio;
                target = tokens[0];
            }
        }
        System.out.print(target);
    }
}

6

जावा - औसत से ऊपर

ऊपरी चौकड़ी पर अपने आँकड़े बनाए रखने की कोशिश करता है। दुश्मन क्या करेगा, यह भविष्यवाणी करने के लिए तकनीक की भविष्यवाणी का उपयोग करता है।

import java.io.*;
import java.util.*;
import java.util.stream.Collectors;

public class AboveAverage {

    private static final String FILE_NAME = "state" + File.separator + "AboveAverage";

    private File file = new File(FILE_NAME);
    private List<Bot> bots = new ArrayList<>();
    private Bot me;
    private List<List<Bot>> history = new ArrayList<>();
    private String[] args;

    public AboveAverage(String[] args) {
        this.args = args;
        this.bots = readBotArray(args);
        bots.stream().filter(bot -> bot.isMe).forEach(bot -> me = bot); //Intellij told me to do this...
        if (!file.exists()){
            try {
                file.getParentFile().mkdirs();
                file.createNewFile();
            } catch (IOException ignored) {}
        }
        readHistory();
        updateFile();
    }

    private List<Bot> readBotArray(String[] args){ //First parameter is my id.
        List<Bot> bots = new ArrayList<>();
        String myId = args[0];
        for (String arg : args) {
            if (arg.equals(myId)) {    // `==` not `.equals()`
                continue;
            }
            Bot bot = new Bot(arg, myId);
            bots.add(bot);
        }
        bots.sort(Comparator.comparingDouble((Bot a) -> a.life).reversed());
        return bots;
    }

    private void updateFile() {
        PrintStream out;
        try {
            out = new PrintStream(new FileOutputStream(file, true), true);
            for (String s : args){
                if (!s.matches("\\d+|\\d+,-?\\d+,\\d+,(\\d+|D)")){
                    s.replaceAll("(\\d+,-?\\d+,\\d+,).*", "$1Invalid");
                }
                out.print(s + " ");
            }
            out.println();
        } catch (FileNotFoundException ignored) {}
    }

    private void readHistory() {
        try {
            Scanner scanner = new Scanner(file);
            while (scanner.hasNextLine()){
                String line = scanner.nextLine().trim();
                if (line.length() > 0) {
                    history.add(readBotArray(line.split("\\s+")));
                }
            }
        } catch (FileNotFoundException ignored) {}
    }

    public static void main(String[] args) throws FileNotFoundException {
        if(args.length < 1){
            System.out.print("ok");
            System.exit(0);
        }
        try {
            System.out.print(new AboveAverage(args).normalize());
        } catch (Exception e){
            Writer writer = new StringWriter();
            PrintWriter printWriter = new PrintWriter(writer);
            e.printStackTrace(printWriter);
            String s = writer.toString();
            System.out.print("error: " + s.replace("\n", " | "));
        }
    }

    String normalize() {
        if (history.size() == 0 || me.lastAction.equals("X")){
            return "D";
        }

        if (bots.stream().mapToInt(bot -> (bot.life + me.power - 1)/me.power).sum() < me.life/bots.stream().mapToInt(bot -> bot.power).sum()){
            return bots.stream().max(Comparator.comparingInt(a->a.power)).get().id;
        }

        List<Bot> bestHistory = history.stream().max((a,b) -> {
            int differenceA = 0;
            int differenceB = 0;
            for (int i = 0; i < a.size(); i++){
                if (!a.get(i).equals(bots.get(i))){
                    differenceA++;
                }
                if (!b.get(i).equals(bots.get(i))){
                    differenceB++;
                }
            }
            if (differenceA != differenceB){
                return differenceA - differenceB;
            }
            for (int i = 0; i < a.size(); i++){
                differenceA += Math.abs(bots.get(i).life - a.get(i).life) + Math.abs(bots.get(i).power - a.get(i).power) * 10;
                differenceB += Math.abs(bots.get(i).life - b.get(i).life) + Math.abs(bots.get(i).power - b.get(i).power) * 10;
            }
            return differenceA - differenceB;
        }).get();


        int i = history.indexOf(bestHistory) + 1;
        List<Bot> after = i == history.size() ? bots : history.get(i);

        Map<Bot, String> actions = new HashMap<>();
        for (Bot bot : bots){
            if (bot.equals(me)){
                continue;
            }
            after.stream().filter(future -> future.equals(bot)).forEach(future -> actions.put(bot, future.lastAction));
        }

        List<String> myActions = new ArrayList<>();
        myActions.add("D");
        myActions.add("InvalidChoice");
        myActions.addAll(bots.stream().map(bot -> bot.id).collect(Collectors.toList()));

        Map<String,List<Bot>> scenarios = new HashMap<>();
        for (String action : myActions){
            List<Bot> simulatedBots = bots.stream().map(Bot::copy).collect(Collectors.toList());  //IntelliJ told me to (kind of) golf these lines.
            actions.put(me, action);
            simulatedBots.stream().filter(bot -> actions.get(bot).equals("D")).forEach(Bot::defend);
            simulatedBots.stream().filter(bot -> !actions.get(bot).equals("D")).forEach(bot -> bot.attack(actions.get(bot), simulatedBots));
            scenarios.put(action, simulatedBots);
        }

        return scenarios.keySet().stream().min(Comparator.comparingInt((String action) -> {
            List<Bot> scenario = scenarios.get(action);
            Bot me = scenario.stream().filter(a->a.isMe).findAny().get();
            scenario.removeIf(a->a.life<1||a.equals(me));
            scenario.sort(Comparator.comparingInt(a->a.life));
            int bestLife = scenario.get(scenario.size() * 3 / 4).life;
            scenario.sort(Comparator.comparingInt(a->a.power));
            int bestPower = scenario.get(scenario.size() * 3 / 4).power;
            scenario.add(me);
            return Math.abs(me.power - bestPower)*20 + Math.abs(me.life - bestLife);
        })).get();
    }

    class Bot {
        String id, lastAction;
        int life, power;
        boolean isMe;
        boolean isDefending = false;

        public Bot() {}

        public Bot(String bot, String myId) {
            String[] parts = bot.split(",");
            id = parts[0];
            life = Integer.valueOf(parts[1]);
            power = Integer.valueOf(parts[2]);
            lastAction = parts[3];
            isMe = id.equals(myId);
        }

        Bot copy() {
            Bot bot = new Bot();
            bot.id = id;
            bot.lastAction = lastAction;
            bot.life = life;
            bot.power = power;
            bot.isMe = isMe;
            return bot;
        }

        void defend(){
            this.isDefending = true;
            this.power--;
        }

        void attack(int power){
            if (isDefending) {
                this.power += 2;
                this.life -= power / 2;
            } else {
                this.power++;
                this.life -= power;
            }
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;

            Bot bot = (Bot) o;

            return id.equals(bot.id);

        }

        @Override
        public int hashCode() {
            return id.hashCode();
        }

        void attack(String attackId, List<Bot> bots) {
            if (life < 1){
                return;
            }
            Bot attacked = bots.stream().filter((Bot a) -> a.id.equals(attackId)).findFirst().orElse(null);
            if (attacked == null){
                power--;
                return;
            }
            if (attacked.life < 1){
                power--;
                return;
            }
            attacked.attack(power);
        }
    }
}

उपयोग state/whateverनहीं करने के लिए माना जाता है statusIndexOutOfBoundsपहली बारी को छोड़कर भी लगता है ।
OJFord

5

जावा - शांत करनेवाला

पहले कभी प्रस्तुत! \ o / इस प्रतियोगिता के लिए एक बॉट पर काम कर रहा था जो विशाल डेटा-बचत का उपयोग करता है और पैटर्न खोजने की कोशिश करता है, और इस एक के बारे में सोचा। मूल रूप से, अगर उसे लगता है कि कुछ भी उपयोगी करने के लिए उसके नुकसान बहुत कम हैं, तो वह खुद की रक्षा करेगा। अन्यथा, वह अधिक धमकी देने वाले प्रतिद्वंद्वी पर हमला करेगा, जो उसे मारने के लिए आवश्यक हिट की संख्या से निर्धारित होता है, और यह आउटपुट को नुकसान पहुंचाता है। यह कोशिश नहीं कर सका, लेकिन मुझे लगता है कि वह कुछ अच्छा काम कर सकता है!

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Pacifier
{
    private static final File DATA_FILE = new File("state"+File.separator+"Pacifier.whatever");
    public static void main(String[] args)
    {

        if(args.length==0)
        {

            if(DATA_FILE.exists())
            {
                try {
                    DATA_FILE.delete();
                } catch (Exception e) {System.out.println("D");System.exit(0);}
            }
            try{
                DATA_FILE.createNewFile();
            }catch (IOException e) {}
            System.out.println("ok");
            System.exit(0);
        }

        int ownId=0,ownHp=1,ownAt=1;
        String known = null;
        BufferedReader bf = null;

        try{
            bf=new BufferedReader(new FileReader(DATA_FILE));
            known=bf.readLine();
        }catch(Exception e){System.out.println("D");System.exit(0);}

        boolean firstTurn = known==null;
        String[] mk = null,iniData=null;
        if(!firstTurn)
        {       
            mk = known.split(" ");
            iniData = mk[0].split(",");
            iniData[1] = String.valueOf(Integer.parseInt(iniData[1])+1);

        }

        String[] datas = new String[args.length-1]; 
        boolean hasReseted = true;
        for(String s : args)
        {
            if(!s.contains(","))
                ownId=Integer.parseInt(s);

            else
            {
                String[] tmp = s.split(",");
                hasReseted=(Integer.parseInt(tmp[1])==1000)?hasReseted:false;
                if(Integer.parseInt(tmp[0])==ownId)
                {
                    ownHp=Integer.parseInt(tmp[1]);
                    ownAt=Integer.parseInt(tmp[2]);
                }
                int id=Integer.parseInt(tmp[0]);
                datas[id]=s;

                if(!firstTurn)
                {
                    if(tmp[3]!="D"){
                        int to =Integer.parseInt(mk[id+1].split(",")[4]);
                        int pa = Integer.parseInt(mk[id+1].split(",")[2]);
                        datas[id]+=","+(to+pa);
                    }
                    else
                        datas[id]+=","+Integer.parseInt(mk[id+1].split(",")[4]);
                }
                else
                    datas[id]+=",0";
            }
        }

        if(firstTurn||hasReseted)
        {
            iniData = new String[2];
            iniData[0]=ownId+"";
            iniData[1]="0";
        }

        int target=(ownId==0)?1:0;
        float best=-100.f;
        if(Integer.parseInt(iniData[1])<40
                &&Integer.parseInt(iniData[1])%3==0)
            target=-1;
        else
            for(String s:datas)
            {
                if(s!=null&&s.contains(","))
                {
                    String[] tmp = s.split(",");
                    int id = Integer.parseInt(tmp[0]);
                    float hp =Float.parseFloat(tmp[1]);
                    float at = Float.parseFloat(tmp[2]);

                    float curr=((hp/(float)ownAt)*at)*(0.1f*at);
                    float dangerOverall= Float.parseFloat(tmp[4])/(100*hp);
                    target=(curr*dangerOverall>=best
                            &&id!=ownId
                            &&hp>0)?Integer.parseInt(tmp[0]):target;
                    best=(curr*dangerOverall>=best
                            &&id!=ownId
                            &&hp>0)?curr:best;
                }
            }
        store(iniData,datas);
        System.out.println((target>=0)?target:"D");
    }

    private static void store(String[] iniData,String[] datas)
    {
        StringBuffer sb = new StringBuffer();
        sb.append(iniData[0]+","+iniData[1]);
        for(String s:datas)
        {
            if(s==null)
                break;
            sb.append(" "+s);
        }
        FileWriter fw = null;
        try{
            fw=new FileWriter(DATA_FILE);
            fw.write(sb.toString());
            fw.flush();
            fw.close();
        }catch(Exception e){e.printStackTrace();}
    }
}

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

संपादित करें:

पहली बारी पर ठीक भेजा, बस इसे नमूनों के खिलाफ परीक्षण किया, उसे कुछ कठिन समय मिल रहा है, पहले उस पर थोड़ा काम करें।

2 संपादित करें:

अब वह कुछ डेटा याद करता है, और बहुत बेहतर करता है, कभी जीता नहीं, लेकिन वास्तव में हर बार हारकर <50 hp ... हो, और एक रन जो मैंने नमूनों के खिलाफ किया, उसने मुझे यह दिया:

14 3170 जावा बुली
0 0 जावा पेसिफायर
0 0 जावा नायक
0 0 जावा कावार्ड

यह अब नहीं हो रहा है (वह वास्तव में कुछ अंक जीता :)), लेकिन मजाकिया था: डी।

संपादित करें 3:

सही फ़ाइलनाम का उपयोग, और कुछ सुधार। बहुत अच्छी तरह से काम करते हैं, और बहुत बेहतर है जब बहुत सारे बॉट यहां हैं :)।


3

जावा - मेटा फाइटर

नोट: कृपया मुझे बताएं कि क्या यह काम नहीं करता है

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

(बीटीडब्ल्यू, माई सेकंड एंट्री एवर टू कोडगॉल्फ)

package folder;

public class MetaFighter {
    public static void main(String[] args) {
        if(args.length < 1){
            System.out.print("ok");
            System.exit(0);
        }
        String me = args[0], target = "D";
    int weakestAmount = 2000, weakest = 0, totalLife = 0, totalPower = 0, threat = 0, enemies = 0;
    int life = 0,power = 0;
        for(int i = 1; i < args.length; i++){
        String[] data = args[i].split(",");
        if(me.equals(data[0])){
            life = Integer.parseInt(data[1]);
            power = Integer.parseInt(data[2]);
        }else{
            if(Integer.parseInt(data[1]) > 0){
                if(Integer.parseInt(data[1]) < weakestAmount){
                    weakest = Integer.parseInt(data[0]);
                    weakestAmount = Integer.parseInt(data[1]);
            }
            totalLife += Integer.parseInt(data[1]);
            totalPower += Integer.parseInt(data[2]);
            enemies++;
            }
        }
    }
    int powerV,totalPowerV,lifeV,totalLifeV,Defend = 0,AttackSelf = 0;
     powerV = power;
     totalPowerV = totalPower;
     lifeV = life;
     totalLifeV = totalLife;
    MetaFighter m = new MetaFighter();

    threat = m.calculateThreat(0, 0,totalLifeV,lifeV,powerV,totalPowerV, enemies);
    if (threat < 0){
        target = Integer.toString(weakest);
    }else{
    lifeV = lifeV - powerV;
    powerV++;
    AttackSelf = m.calculateThreat(0, 1,totalLifeV,lifeV,powerV,totalPowerV, enemies);  
     powerV = power;
     totalPowerV = totalPower;
    lifeV = life;
    totalLifeV = totalLife;
    Defend = m.calculateThreat(0, 2,totalLifeV,lifeV,powerV,totalPowerV, enemies);
    if(threat > AttackSelf && threat > Defend){
        target = Integer.toString(weakest);
    }
    if(Defend > AttackSelf && Defend > threat){
        target = "D";
    }
    if(AttackSelf > threat && AttackSelf > Defend){
        target = me;
    }
    if (Defend == threat){
        target = Integer.toString(weakest);
    }
    if (enemies < 3){
        target = Integer.toString(weakest);
    }
    }
    System.out.print(target);
    System.exit(0);
}
private int calculateThreat(int i, int s,int totalLifeV,int lifeV,int powerV, int totalPowerV, int enemies){
    if(totalLifeV > 0 && lifeV > 0){
        if(s == 0){
            totalLifeV += (0-powerV);
        }
        if (s != 2){
            lifeV += (0-totalPowerV);
        }else{
            lifeV += 0.5*(0-totalPowerV);
            powerV--;
        }
        powerV += enemies;
        totalPowerV++;
        i++;
    return calculateThreat(i, 0,totalLifeV,lifeV,powerV,totalPowerV, enemies);
    }
    if(lifeV > 0){
        return -1;
    }
    return i;
}

}

फाइनल एडिट: जोड़ा गया फीचर इसलिए यह हमला करता है अगर केवल 3 बॉट्स बचे हैं।

सबसे बड़ी कमजोरी: बुली।


मेटा फाइटर "क्यों विरोधी खुद के साथ युद्ध में है" सोच रहा है, लेकिन खुद पर हमला करने पर भी विचार करता है?
रुडी

@rudi वह सोच रहा है कि प्रतिद्वंद्वी खुद को इस तरह से लड़ेगा कि विरोधी के लिए फायदेमंद नहीं है। साथ ही सैद्धांतिक रूप से वह खुद पर हमला करेगा, लेकिन मेरे सभी परीक्षणों में ऐसा कभी नहीं हुआ।
colorado777

3

अजगर 2.7 - GTA V का ट्रेवर फिलिप्स और माइकल डी सांता


2015-05-25 संपादित करें: माइकल डे सांता का पहला संस्करण जोड़ा गया।
यहाँ GTA V के लिए थोड़ी श्रद्धांजलि है। मैंने GTA V के दो तीन नायक का प्रतिनिधित्व करते हुए दो पायथन बॉट बनाए। कृपया ट्रेवर फिलिप्स और माइकल डी सांता से मिलें। ट्रेवर के पास उसके बारे में बहुत सूक्ष्म नहीं है। माइकल के पास एक अच्छी मेमोरी है - और एक हिटलिस्ट। एक बार जब आप इस पर होते हैं, तो आपके दिन गिने जाते हैं।

नोट 1: जब मेरे पास समय होता है, तो मैं माइकल में कुछ और बुद्धिमत्ता डालूंगा और शायद एक फ्रैंकलिन (डींग मारने वाली ट्रेवर को बदलने के लिए) भी जोड़ दूंगा।

नोट 2: माइकल बिल्कुल सटीक प्रदर्शन करने लगता है। मेरे पास कुछ और विचार हैं, लेकिन मैं इसे बाहर करना चाहता था। शायद उसका एक "बेहतर" संस्करण आ जाएगा।

ट्रेवर फिलिप्स

# "Computer gamers with their computer rigs. 
#  All they do is cry. 
#  They will never get the game."
#                         - Trevor Phillips.
#
import sys, random
from __builtin__ import str

# YES!!! I'm alive!!!
args=sys.argv
if len(args)==1:
    print("ok")
    sys.exit()

# Basic strategy: Hit whoever hits me or just anyone; sometimes brag a Trevor quote.
me=int(args[1])
botnrs=[]
action=''
quotes=["Now would you get me a f*cking drink! I'm not gonna ask you again!",
        "Grumble grumble grumble I've got my work grumble grumble grumble I've got my life, never the two shall meet.",
        "Well hello there beautiful. here go buy yourself something nice",
        "I'm driving, you can jerk me off if I get bored... I'm joking, you can suck me off.",
        "Do you want me to get my dick out again?!",
        "Floyd..we're having people over.  We need chips, dip, and prostitutes"]
for bot in args[2:]:
    nr,life,power,lastaction=bot.split(',')
    botnrs.append(nr)
    if lastaction==str(me):
        action=int(nr)
if action=='':
    action=int(random.choice(botnrs))
if random.random()<0.05:
    action=random.choice(quotes)
print(action)

माइकल डी सांता

# Surviving is winning, Franklin, everything else is bullshit. 
# Fairy tales spun by people too afraid to look life in the eye. 
# Whatever it takes, kid: survive. 
#                                            - Michael De Santa.
#
import sys, pickle, re, operator

# List of power values for a certain bot in a given round range
def getpower( history, botid, roundrange ):
    return [sum([bot[2] for bot in history[i] if bot[0]==botid]) for i in roundrange]

# If you say nothing, I say "ok".
if len(sys.argv)==1:
    print("ok")
    historyfile=open('state/MichaelDeSanta.bin','w+')
    pickle.dump([[],{},0,0],historyfile)
    historyfile.close()
    sys.exit()

# Get data from file
myid=int(sys.argv[1])
historyfile=open('state/MichaelDeSanta.bin','r')
history,hitlist,botcount,roundnr=pickle.load(historyfile)
historyfile.close()
history.append([map(int,re.sub('[DX]','-1', bot).split(',')) for bot in sys.argv[2:]])

# Update hitlist:
if roundnr==0:
    hitlist=dict.fromkeys([bot[0] for bot in history[0]],0)

maxhealth=maxpower=[0,0]
for bot in history[roundnr]:
    if bot[0] != myid:
        if bot[1]<=0:
            hitlist[bot[0]]=0
        else:
            # If you hit me, you're on the list!
            if bot[3]==myid:
                hitlist[bot[0]]+=4
            # If I can kill you with one hit... You're on my list!
            if bot[1]<getpower(history,myid,[roundnr]):
                hitlist[bot[0]]+=1
            # If you're super healthy, you deserve PUNISHMENT!
            if bot[1]>maxhealth[1]:
                maxhealth=[bot[0],bot[1]]
            # If you're powerfull... Well... I'm not afraid!
            if bot[2]>maxpower[1]:
                maxpower=[bot[0],bot[1]]
hitlist[maxhealth[0]]+=3
hitlist[maxpower[0]]+=2

action=max(hitlist.iteritems(),key=operator.itemgetter(1))[0]
hitlist[action]-=1

# Save data to file
roundnr+=1
historyfile=open('state/MichaelDeSanta.bin','w+')
pickle.dump([history,hitlist,botcount,roundnr],historyfile)
historyfile.close()

# Wrap up and print the action
print(action)

2

जावा- पेट्रोक्लस

पेट्रोक्लस एक आक्रामक बॉट है, जो महिमा की तलाश करने के लिए निर्धारित है। उनकी काफी अच्छी याददाश्त है (भले ही मैं खुद ऐसा कहूं) और उनका मानना ​​है कि महिमा की तलाश का सबसे अच्छा तरीका सबसे आक्रामक दुश्मन है। वह याद करता है जिसने सभी खेलों में अब तक सबसे अधिक हमला किया है और अपनी बड़ी तलवार से उन्हें सिर के ऊपर काट दिया है।

उनकी सबसे बड़ी कमजोरी उनका बचाव करने के लिए उनका कामिकैज रवैया है- जब आपको अकिलिस का कवच पहनाया जाता है, तो उसे किसकी ज़रूरत होती है?

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;


public class Patroclus {

    final static File file = new File("state/Patroclus.txt");   
    static List<bot> enemies;
    static String me;

    public static void main(String[] args) {
            if(args.length < 1){
                if(file.exists())
                {
                    file.delete();
                }
                System.out.print("ok");
                System.exit(0);
            }
            me = args[0];
            enemies = new LinkedList<Patroclus.bot>();

            if(!file.exists())
            {
                createFile();               
                for(int i = 1; i<args.length; i++)
                {

                    String[] tokens = args[i].split(",");
                    bot newBot = new bot();
                    newBot.id = tokens[0];
                    newBot.life = Integer.valueOf(tokens[1]);
                    enemies.add(newBot);
                }               
            }
            else
            {

                openFile(args);

            }

            Collections.sort(enemies);
            Collections.reverse(enemies);

            String target = "D";
            for(int i = 0; (i<enemies.size()) && (i>-1); i++)
            {                               
                if(enemies.get(i).canAttack())
                {
                    target = enemies.get(i).id;
                    i = -10;
                }
            }
            saveFile();
            System.out.print(target);
            System.exit(0);
}


    private static void saveFile() {
        BufferedWriter writer;
        try {
            writer = new BufferedWriter(new FileWriter(file));
            for (bot b : enemies) {
                writer.write(b.toString());
                writer.write("#");
            }
            writer.flush();
            writer.close();
        } catch (IOException e) {           
        }
    }

    private static void openFile(String[] args) {       
            Scanner sc;
            try {
                sc = new Scanner(file);                     
                String[] lines = sc.next().split("#");

                for(int i = 0; i<lines.length; i++)
                {

                    bot newBot = new bot(lines[i]);


                    int j = 1;
                    for(; j<args.length && j>0; j++)
                    {
                        String[] tokens = args[j].split(",");
                        if(tokens[0].equals(newBot.id))
                        {
                            newBot.life=Integer.valueOf(tokens[1]);
                            if(newBot.life>0 && !tokens[3].equals("D"))
                            {
                                newBot.agression++;
                            }
                            j = -10;
                        }
                    }               
                    enemies.add(newBot);
                }           
            } catch (FileNotFoundException e) {
            }       
    }

    private static void createFile() {
        try {
            file.createNewFile();
        } catch (IOException e) {               
        }       
    }

    private static class bot implements Comparable<bot>
    {
        int agression, life;
        String id;

        public bot(String toParse)
        {
            String[] tokens = toParse.split(",");
            id = tokens[0];
            agression = Integer.valueOf(tokens[1]);
        }

        public bot()
        {
            this.agression = 0;
            this.life = 0;
            this.id = "D";
        }

        @Override
        public int compareTo(bot o) {
            if(this.agression>o.agression)
                return 1;
            else if (this.agression==o.agression)
                return 0;
            else
                return -1;
        }

        @Override
        public String toString() {
            StringBuilder sb = new StringBuilder();
            sb.append(id);
            sb.append(",");
            sb.append(agression);

            return sb.toString();
        }

        public Boolean canAttack()
        {
            return life>0 && !id.equals(me);
        }
    }
}

2

जंग - पागल

अपने आप को युद्ध के मैदान पर जीवंत की तुलना में रखता है।

struct Bot {
    id: i32,
    life: i32,
    power: i32,
    action: String,
}

fn main() {
    let args: Vec<_> = std::env::args().collect();
    if args.len() < 2 {
        print!("ok");
    } else {
        let id: i32 = args[1].to_string().trim().parse()
            .ok()
            .expect("Please type a number!");

        let mut target_bot = Bot { id:-1, life:-1, power:-1, action:"D".to_string() };
        let mut own_bot = Bot { id:id, life:0, power:1, action:"D".to_string() };

        for arg in args {
            let split: Vec<&str> = arg.split(",").collect();
            if split.len() == 4 {
                let bot_id: i32 = split[0].to_string().trim().parse()
                    .ok()
                    .expect("Please type a number!");
                let bot_life: i32 = split[1].to_string().trim().parse()
                    .ok()
                    .expect("Please type a number!");
                let bot_power: i32 = split[2].to_string().trim().parse()
                    .ok()
                    .expect("Please type a number!");
                let bot_action: String = split[3].to_string();

                let bot = Bot { id:bot_id, life:bot_life, power:bot_power, action:bot_action };

                if bot.id != id && bot.life > target_bot.life {
                    target_bot = bot;
                } else if bot.id == id {
                    own_bot = bot;
                }
            }
        }

        /* If I am not stronger than the strongest, defend */
        let turns_to_kill = target_bot.life/own_bot.power + 1;
        let turns_to_be_killed = own_bot.life/target_bot.power;

        if target_bot.id > -1 && turns_to_kill < turns_to_be_killed {
            print!("{}", target_bot.id);
        } else {
            print!("D");
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.