কি আমাকে মেরে না ...


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
@ টিম বট তালিকাটি স্থান পৃথক করা হয়। প্রতিটি বটের পরিসংখ্যান কমা দ্বারা পৃথক করা হয়।
জিওবিটস 14:38

3
@ মার্ক বর্তমান বটগুলি প্রায় অর্ধেক ডিফেন্সিয়ালি ওরিয়েন্টেড এবং অর্ধেক আক্রমণ। ডিফেন্সিভ বটগুলির কোনওটিরই একক জয় নেই। আমি একমত যে এটি কিছু প্রতিরক্ষা উত্সাহ দেয় , তবে আগ্রাসনের সুবিধা হ'ল খাঁটি প্রতিরক্ষা কোনও পয়েন্টই জিততে পারে না । আপনি যদি কেবলমাত্র বেঁচে থাকেন তবে আপনি পয়েন্টগুলি জয় করতে পারেন ।
জিওবিটস

8
যদি কারও কৌতূহল হয় যে কীভাবে বটগুলি এখন আরও জমা দেওয়া আছে, তবে এখানে আমার "বেসরকারী" পরীক্ষার ফলাফল: 3-809-হিরো; 2-593-Velociraptor; 1-471-SurpriseBot; 1-433-কোঅর্দ; 1-371-Santayana; 1-364-Wiisniper; 1-262-বিশ্লেষক; 1-230-শাবাশ; 1-132-ইকুয়ালাইজার; 1-71-IKnowYou; 0-0 - প্রিগোগ, বার্সার, ব্রোবট, সেমিআরডম, মন্টিবট, কৌশলবিদ, স্নাপ্টগার্ট, সাইকো, রেভেঞ্জার, সুযোগ, ফ্যান্টমেনেস, ট্যাঙ্ক, বক্সার, অভিভাবক, উপরের গড়, ডিফেন্সিভ বট। সুযোগ, উপরের অ্যাভজি, ব্রোবট, বক্সার, এবং সেমিআরডম থেকে প্রচুর অবৈধ কমান্ড।
ওজেফোর্ড

3
আমার কাছে নিয়ামকের একটি সমান্তরাল সংস্করণ রয়েছে যা গেমগুলি মূল কন্ট্রোলারের চেয়ে দ্রুত চালায়, যদি কেউ আগ্রহী হয় তবে আমি এটি পোস্ট করতে পারি ...
অন্যরা

3
@ মনু যতক্ষণ না প্রতিটি বট এক সাথে কার্যকর করা হয় ততক্ষণ তা বিবেচনা করা উচিত নয়। আমি ধরে নিয়েছি যে সমান্তরাল সংস্করণে এখনও সমস্ত বটগুলি পরের দিকে যাওয়ার আগে একটি পালা শেষ হয়েছে। আমি যেমন বলেছি, পোস্ট করার পরে এটি ব্যবহারের আগে যাচাই করতে যাচ্ছি।
জিওবিটস 18'15

উত্তর:


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 এবং -ফেন্প্যাম্প পতাকা দিয়ে সংকলন করুন।

#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
আকর্ষণীয় কৌশল। প্রায় 20 বিরোধীদের সাথে সিমুলেশন করতে কতক্ষণ সময় লাগে?
রাল্ফ মার্শাল

2
@ র‌্যাল্ফমারশাল এটি কয়েকটি প্রতিপক্ষের জন্য দ্রুত (০.০৩ সেকেন্ড থেকে ০.২ সেকেন্ড) 60০ হাজার সিমুলেশন করতে পারে, তবে দ্রুত ২০ টি প্রতিপক্ষের (প্রায় 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

স্কালা - ব্যান্ডওয়াগোনার

ব্যান্ডওয়াগোনার সম্মান বা নীতিগুলির বিষয়ে চিন্তা করে না। দুর্বল বা শক্তিশালী হওয়া এড়িয়ে ব্যান্ডওয়াগোনার নীচু থাকে। দৃষ্টি আকর্ষণ এড়াতে ব্যান্ডওয়াগোনার sensকমত্য লক্ষ্য লক্ষ্য করে জনতার সাথে যায়।

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

আপনার কি কোনও ধারণা আছে যে কেন আমি প্রথম লাইনে "ট্রাই স্ক্যালা.ইটিল এর সদস্য নয়" এর নির্বোধ ত্রুটি পেয়েছি? গুগলিং আমাকে একটি ক্ষতিতে ফেলেছে। আমার কাছে স্ট্যান্ডার্ড স্কেল ইনস্টল রয়েছে, সরাসরি সংগ্রহস্থল থেকে 2.9.2।
জিওবিটস

@ জিওবিটস আমার চেয়ে পুরানো স্কেলার সংস্করণটি সম্পর্কে জানায়, আমি ২.১১ চালিয়ে যাচ্ছি। যদি আপগ্রেড করা কোনও বিকল্প না হয় তবে আমাকে জানান এবং আমি আমার কোডটি কাজ করে ফিক্স করব।
অন্যরা

2
বুঝতে পেরেছি। আমি দস্তাবেজে "২.১.০" হিসাবে "২.১০" পড়ছিলাম এবং এটি
২.৯.২

18

জাভা রেভেঞ্জার

রিভেঞ্জার ঝগড়া করার জন্য ঝগড়া করতে আগ্রহী নয় isn't তবে আক্রমণ হলে প্রতিশোধ নেওয়া হবে !

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
এফওয়াইআই: লক্ষ্য শেষ হয়ে যাওয়ার পরেও এটি আক্রমণ থামায় না।
জিওবিটস 14:58

26
@ জিওবিটস ওহ তবে প্রতিশোধ হ'ল একটি খাবারটি সেরা পরিবেশন করা হয় .. ইতিমধ্যে মারা গেছেন? : p ইচ্ছাকৃতভাবে ছিল না; আপডেট করা হয়েছে।
ওজেফোর্ড 14'15

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
আকর্ষণীয় যে হিরো অত্যন্ত কার্যকর কৌশল হিসাবে দেখা দেয়; এমনকি আরও 'পরিশীলিত' বটের বিরুদ্ধে (যেমন মন্টেবট, বিশ্লেষক)। এটি কি একটি সাধারণ উদাহরণ ছিল, না আপনি কিছুটা অন্তর্দৃষ্টির ভিত্তিতে রেখেছেন?
ওজেফোর্ড 17'15

1
না, আমি প্রথম তিনটি জিনিস কেবল উদাহরণ হিসাবে ফেলেছি। আমি ভাবি নি যে এটি মোটেও খুব ভাল করবে, সত্যি কথা বলতে।
জিওবিটস

16

পার্ল - কৌশলবিদ

এটি আমার লেট 'এম ফাইট বট'-এর সম্পাদনা হিসাবে শুরু হয়েছিল, তবে আমি যথেষ্ট পরিবর্তন করেছি যে আমি এটি নতুন এন্ট্রি হিসাবে প্রবেশ করার সিদ্ধান্ত নিয়েছি। নতুন যুক্তিটি নিম্নরূপ

  • পূর্বের পালা কেউ যদি আক্রমণ না করে তবে প্রতিপক্ষকে সর্বোচ্চ জীবনের মূল্য দিয়ে আক্রমণ করুন। এটি এমন পরিণতিগুলি রোধ করা উচিত যেখানে কমপক্ষে যতদিন আমি বেঁচে থাকি কেউ অন্য কারও উপর আক্রমণ করে না।
  • যদি কেউ শেষ মুহুর্তে আমার উপর আক্রমণ করে তবে সবচেয়ে শক্তিশালী এই জাতীয় আক্রমণকারীটিকে বেছে নিয়ে পিছনে আঘাত করুন।
  • আমরা যদি দুটি বোটে চলে যাই, বা আমি নীচে গড়ের শক্তিতে আছি, প্রতিপক্ষকে সর্বোচ্চ জীবন দিয়ে আক্রমণ করুন।
  • যদি আমার নিজের পাওয়ার রেটিং গড়ের নিচে থাকে তবে আমার শক্তি আরও যুক্তিসঙ্গত পর্যায়ে বাড়ানোর জন্য আক্রমণ করুন
  • অন্যথায়, আমার সময় বিদায়

আমি স্থানীয়ভাবে এটি অন্যান্য জাভা বটগুলির বিরুদ্ধে পরীক্ষা করেছি যেগুলি প্রবেশ করেছে এবং কয়েকটি বিজয় অর্জন করতে পরিচালিত হয়েছে, তবে এখনও আমার পক্ষ থেকে দর্শনীয় প্রবেশ নয় not

#!/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) মৃত বট

৪) দশ বছরেরও কম জীবনের বাক্সগুলি (যারা আশা করি তাদের পাঠ শিখেছে!)

গার্ডিয়ান প্রয়োজনে একই প্লেয়ারটি বারবার বাছাই করবে। "দুর্বলতম খেলোয়াড়" এবং "কে তাকে ধরেছিল" এর জন্য সম্পর্ক দুটিই তালিকার প্রথমটিতে যান (যা বলা যায় এলোমেলো)।

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
দয়া করে এটিতে এবং আপনার অন্যান্য বটটিতে অসংখ্য টাইপস এবং ভুলগুলি ঠিক করুন । আমি তাদের দুটি যেমন হয় তেমন সংকলন করতে পারি না।
জিওবিটস 15'15

আমি মনে করি যদি এটি বোকা হয়েছে তবে এটি কী হয়েছে , অর্থাৎ ডি এফেন্ড সম্পর্কে চিন্তা করা উচিত ।
ব্যবহারকারী 3819867

ত্রুটিগুলি স্থির করা হয়েছে। @ ব্যবহারকারীর 3819867, আমি এটি যুক্ত করার বিষয়ে ভেবেছিলাম, তবে একজন অভিভাবক দুর্বলদের সর্বদা ব্যয় করবেন, এমনকি নিজের ব্যয়েও রক্ষা করবেন।
জিনারিজ

13

জাভা - বিশ্লেষক

প্রতিটি প্রতিপক্ষের হুমকি নির্ধারণ করে যদি এটি আক্রমণ করে তবে তার শক্তিটিকে 5 দ্বারা এবং যদি বিশ্লেষককে আক্রমণ করে তবে 25 দ্বারা তার গুণনকে বৃদ্ধি করে। টাই হওয়ার ক্ষেত্রে এটি খেলোয়াড়কে ন্যূনতম জীবন দিয়ে আক্রমণ করে।

কোডটির বেশিরভাগ অংশ জিওবিটসের উত্তর থেকে ধার করা হয়েছিল।

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, বার্সার

বার্সারকে চুরমার! পর্যাপ্ত শক্তি না পাওয়া পর্যন্ত নিজেকে আঘাত করে, তারপরে নিকটতম জীবন্ত জিনিসে আক্রমণ শুরু করে। এটি যে কারনেই মারতে হবে তা যদি কাজ না করতে পারে তবে নিজেকেও আঘাত করে।

সম্পাদনা: বার্সার ক্রোধের থ্রেশহোল্ডটি 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 অক্ষর? কোড গল্ফ এটি কি? ;)
কেসি কুবল 21

1
@ ডার্থফেট: এখানে প্রায় জাভা সাবমিশন থাকার কারণে, এর অর্থ এই নয় যে প্রত্যেককেই তাদের কোড সমান পরিমাণে বয়লারপ্লেটের সাথে লিটার করা দরকার ...
ঘড়ির

11
বক্সার হাতা - তিনি সহজেই তার লড়াইয়ের ওজন মেটান। তিনি বোঝাপড়া এবং ল্যাম্বডাসের একটি স্বাস্থ্যকর খাদ্য উপভোগ করেন। আপনি তাকে কোনও স্ট্যাটিক টাইপিং বার্গার খাচ্ছেন না, বা ধনুর্বন্ধনী ভাজাতে ফাটাচ্ছেন won't
লজিক নাইট

4
নিবন্ধন করার জন্য কার্পেট পাইথন অদৃশ্যতা ভার্বোসিটির মতোই খারাপ।
Kroltan

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 - প্রাকোগ

প্রিগ্রোগ অতীত ক্রিয়া ফ্রিকোয়েন্সি এর উপর ভিত্তি করে প্রত্যেকের চলার পূর্বাভাস দেওয়ার চেষ্টা করে, তারপরে কয়েকটি সিমুলেশন চেষ্টা করে এবং তার স্কোরকে সর্বাধিক করে তোলে এমন একটি বাছাই করে। এটি বিশেষভাবে নির্ভরযোগ্য নয়, তবে ... ESP আসল নয়। : ডি

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

বাশ - কপিরাইট

কপিরাইটগুলি শক্তিশালী, স্বাস্থ্যকর এবং আক্রমণাত্মকদের প্রশংসা করে এবং তাদের মতোই আক্রমণ করে। যদি তার "ছাপ" থাকে, যখন বেশিরভাগ বট এখানে আক্রমণ করছে, তিনি নিজেকে রক্ষা করতে বা দুর্বল ব্যক্তিদের আক্রমণ করা শুরু করেন যতক্ষণ না সে দৃ gets় হয় না বা বেশিরভাগ বটগুলি এখানে আক্রমণ বন্ধ না করে।

কেবল এটি দিয়ে চালানো /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 লাইনের মন্তব্য করতে হবে। অন্যথায় এটি কেবল মারা যায়।
জিওবিটস

আপনি কোনও বটকে টার্গেট করার আগে বেঁচে আছে তা নিশ্চিত করতেও পারেন। এটি মৃত ব্যক্তিকে প্রায়শই লক্ষ্য করে, যা একটি অবৈধ পদক্ষেপ হিসাবে গণ্য হয় এবং আপনার শক্তি হ্রাস করে।
জিওবিটস 14'15

দীর্ঘশ্বাস স্থির। আমার একটা অনুভূতি আছে এটি শেষ সমাধান নয়: পি
এলিয়াস বেনিভেডিস

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

জাভা - ফ্যান্টম মেনেস

ওহে! কোড গল্ফে এটি আমার প্রথম পোস্ট। আমি একজন সি # লোক তাই আমার ফরাসি ক্ষমা করুন। আমি হিরো এবং কাউয়ার্ড নমুনা কোডগুলির কিছু অংশ ব্যবহার করেছি।

আমার বটটি বেশ সহজ রাজনৈতিক দৃষ্টিভঙ্গিযুক্ত একটি সাধারণ লোক। বেশিরভাগ সময় তিনি কেবল লবিতে কফি পান করে এবং তার পরিকল্পনাগুলি প্রস্তুত করেন in কিন্তু যখন সুযোগটি আসে এবং লাভের সম্ভাবনা যথেষ্ট প্রবল হয় তখন তিনি তার আরামদায়ক লবি আর্মচেয়ার থেকে লাফিয়ে উঠে সংবাদপত্রটি ছুঁড়ে ফেলে অর্থের জন্য যান।

তার কোনও ক্ষতি হওয়ার পরে সে নিজেকে রক্ষা করে। অন্যথায় তিনি একজন সত্যিকারের বীরের মতো আচরণ করেন (এটি বেশ নিরাপদ বলে এটি একটি রাজনৈতিক সিদ্ধান্তও)। যখন তার কেবল তিনটি প্রতিযোগী থাকে সে জয়ের জন্য যায়।

তিনি কয়েকটি বুনিয়াদি নীতি অনুসরণ করেন। প্রতিটি গুরুতর রাজনীতিকের কিছু অটুট নীতি এবং একটি স্পষ্টভাবে সংজ্ঞায়িত প্রোফাইল থাকা উচিত ...

নিজেকে ছাড়া কাউকে সাহায্য করবেন না! (স্বার্থপর ব্যক্তি)

গৌরব মানে মৃত্যু! (সংশয়ী)

তুমি মারা যাওয়ার পরে কিছুই নেই! (নাস্তিক)

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

জাভা - Velociraptor

ভেলোসিরাপটার একটি দুষ্টু হত্যাকারী। আক্রমণাত্মক শিকারটি পর্যবেক্ষণ করে তিনি আক্রমণ পর্যন্ত অপেক্ষা করবেন। তারপরে তিনি দ্রুত হত্যা করতে যান এবং লক্ষ্যটি নিচে রেখে তিনি দ্রুততম হত্যা করতে পারেন। তার আক্রমণ শুরু করার পরে, ধর্ষক কোনও ভয় জানে না এবং যতক্ষণ না তিনি একমাত্র জীবিত রয়েছেন ততক্ষণ ক্ষতিগ্রস্থদের ধরে নেওয়া চালিয়ে যাবেন।

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 - SemiRandom

আক্রমণ এবং ডিফেন্সের পরে পূর্ববর্তী দৃness়তা-পরিবর্তনের দ্বারা ওজনিত এলোমেলোতার উপর ভিত্তি করে আক্রমণ এবং ডিফেন্ডের মধ্যে নির্বাচন করা হয়। আক্রমণটি চয়ন করা হলে এটি শক্তিশালী খেলোয়াড়কে আক্রমণ করে। দৃr়তা হিসাবে সংজ্ঞায়িত করা হয় life * power

৩ টি উদাহরণের বটগুলির বিরুদ্ধে এটি খুব কমই জিততে পারে। বন্য মধ্যে হতে পারে ...

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

@TNT আর নেই। অ্যারের উপাদানগুলির মধ্যে একটিতে অ্যাক্সেস করার সময় আমি কখনও কখনও সেই ব্যতিক্রম পাচ্ছিলাম। আমার বাগটি সংশোধন করে
ফেলেছে

7

জাভা - ব্রবট

ব্রোবট সবচেয়ে শক্তিশালী প্রতিপক্ষকে আক্রমণ করবে যতক্ষণ না কিছু ধীরে ধীরে সামান্য মানের চেয়ে বেশি আক্রমণযুক্ত শত্রু ব্রবটকে আক্রমণ করার সিদ্ধান্ত নেয়, সেক্ষেত্রে সে সেই পালাটি রক্ষা করবে।

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

জাভা - সিসবট

বোন ছাড়া ভাই কী? অনেক কিছুই ... তবে এটি বিন্দু পাশে। বুদ্ধিমান বোট হওয়ার কারণে, সিসবট প্রতিটি বটের শেষ ক্রিয়াকলাপগুলি সংরক্ষণ করে, তাদের বর্তমান এবং শেষ ক্রিয়াগুলি বিশ্লেষণ করে এবং তাকে সরানো হয় - তিনি তার স্বাস্থ্য এবং শক্তি যথেষ্ট উচ্চতর এবং এই যে দ্বিতীয় স্তরের চিন্তা ছাড়াই সর্বোচ্চ শক্তিতে বট আক্রমণ করবে provided কোনও নির্দিষ্ট মানের উপরে পাওয়ার স্ট্যাটযুক্ত অন্য কোনও বট তার আক্রমণ করার সিদ্ধান্ত নেয় না; সেক্ষেত্রে তিনি আক্রমণ এবং ডিফেন্ডিংয়ের মধ্যে পরিবর্তন করতে পারবেন, বা আক্রমণকারীর শক্তি যদি সত্যিই বেশি থাকে তবে কেবল সোজা ডিফেন্ডিংয়ের মধ্যে চলে যেতে পারেন।

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প্রথম টার্ন ছাড়াও মনে হয় ।
ওজেফোর্ড 17'15

5

জাভা - প্রশান্তকারী

প্রথম জমা! contest 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();}
    }
}

তার বড় মস্তিষ্ক নেই, তাই তার কোনও কিছুই মনে নেই তবে আমি মনে করি এটি কিছু ভাল কাজ করতে পারে। মজার বিষয়: তিনি যদি শেষ বেঁচে থাকেন তবে তিনি কিছু মৃতদেহ লাথি মারার চেষ্টা করবেন, জম্বিরা তাকে ভয় দেখায়!

সম্পাদনা করুন:

প্রথম বারে ঠিক পাঠিয়েছেন, স্যাম্পলগুলির বিপরীতে এটি পরীক্ষা করেছেন, তিনি কিছুটা কঠিন সময় পাচ্ছেন, তার আগে কিছুটা কাজ করবে work

সম্পাদনা 2:

তিনি এখন কিছু ডেটা মুখস্থ করেছেন, এবং আরও ভাল করেছেন, কখনই জিতেনি, তবে প্রকৃতপক্ষে প্রতিবার <50 এইচপি ... হের কাছে হেরে গেছে, এবং নমুনার বিরুদ্ধে আমি যে রান করেছিলাম তার একটি আমাকে দিয়েছে:

14 3170 java বুলি
0 0 java Pacifier
0 0 java Hero
0 0 java Coward

এটি আর ঘটছে না (তিনি কিছু পয়েন্ট আসলে জিতলেন :)), তবে মজার ছিল: ডি।

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 টি বট অবশিষ্ট থাকে।

বৃহত্তম দুর্বলতা: বুলি।


মেটা ফাইটার কেন বিস্মিত হচ্ছেন যে "কেন প্রতিপক্ষ নিজের সাথে যুদ্ধ করছে" কিন্তু নিজেকে আক্রমণ করাও বিবেচনা করে?
রুডি

@ অরডি তিনি ভাবছেন যে প্রতিপক্ষ কেন এমনভাবে লড়াই করবে যে প্রতিপক্ষের পক্ষে সুবিধাজনক নয়? তাত্ত্বিকভাবে তিনি নিজে আক্রমণ করবেন তবে আমার সমস্ত পরীক্ষায় এটি কখনও হয় নি।
কলরাডো

3

অজগর 2.7 - জিটিএ ভি এর ট্রেভর ফিলিপস এবং মাইকেল ডি সান্তা


2015-05-25 সম্পাদনা করুন: মাইকেল ডি সান্তার প্রথম সংস্করণ যুক্ত হয়েছে।
এখানে জিটিএ ভি-র প্রতি একটু শ্রদ্ধা জানানো হয়েছে G আমি জিটিএ ভি'র তিনটি চরিত্রের মধ্যে দু'জনের প্রতিনিধিত্ব করে দুটি পাইথন বট তৈরি করেছি Please ট্রেভর তার সম্পর্কে খুব সূক্ষ্ম কিছুই নেই। মাইকেল একটি ভাল স্মৃতি আছে - এবং একটি হিটলিস্ট। একবার আপনি এটির পরে, আপনার দিন গণনা করা হয়।

দ্রষ্টব্য 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

জাভা- প্যাট্রোক্লাস

প্যাট্রোক্লাস একটি আক্রমণাত্মক বট, যিনি গৌরব অর্জনের জন্য দৃ determined় প্রতিজ্ঞ। তাঁর বেশ ভাল স্মৃতি রয়েছে (যদিও আমি নিজেও তাই বলি) এবং তিনি বিশ্বাস করেন যে গৌরব অর্জনের সর্বোত্তম উপায়টি সবচেয়ে আক্রমণাত্মক শত্রুকে আক্রমণ করছে। তিনি স্মরণে রেখেছেন যে এখন পর্যন্ত সমস্ত গেমসে সবচেয়ে বেশি আক্রমণ করেছে এবং তার বড় তরোয়াল দিয়ে মাথার উপরে উঠে গেছে।

তার সবচেয়ে বড় দুর্বলতা হ'ল তার পক্ষে রক্ষার পক্ষে কমিক্যাজে মনোভাব- আপনি যখন অ্যাকিলিসের বর্ম পরিধান করছেন তখন কার দরকার?

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");
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.