อะไรไม่ฆ่าฉัน ...


106

ภาพรวม

นี่คือการต่อสู้บอทเพื่อดูว่าใครสามารถอยู่รอดได้นานที่สุด บอทเหล่านี้เพิ่มพลังของพวกเขาโดยการถูกโจมตีดังนั้นคุณต้องคิดให้รอบคอบก่อนยิง

ทุกเทิร์นคุณสามารถเลือกบอทเพื่อโจมตีหรือป้องกัน การโจมตีจะลดพลังชีวิตและเพิ่มพลัง ธ ปทที่ยืนอยู่สุดท้ายชนะ

บอท

บอทแต่ละอันเริ่มต้นด้วย 1,000 ชีวิตและ 10 พลัง

เมื่อถูกโจมตี:

  • พลังโจมตีของคุณถูกลบออกจากชีวิตของคุณ
  • พลังของคุณเพิ่มขึ้น 1

ดังนั้นถ้าในเทิร์นแรกคุณถูกโจมตีโดยบอทสองตัวคุณจะมีพลังชีวิต 980 และพลัง 12

หากคุณเลือกที่จะปกป้อง:

  • พลังของคุณจะลดลง 1
  • การโจมตีกับคุณในเทิร์นนี้จะลดลงครึ่งหนึ่ง
  • หากคุณถูกโจมตีคุณจะได้รับ 2 Power สำหรับผู้โจมตีแต่ละคนแทนที่จะเป็น 1

ดังนั้นถ้าคุณป้องกันในเทิร์นแรกและถูกโจมตีโดยสองบอทคุณจะมีชีวิต 990 และพลัง 13 หากคุณปกป้องและไม่ถูกโจมตีคุณจะมี 1,000 ชีวิต แต่มีพลัง 9 อย่าง

หากในตอนท้ายของการเปิดพลังงานของคุณต่ำกว่าหนึ่งก็จะถูกตั้งค่าเป็นหนึ่ง หากชีวิตของคุณต่ำกว่า 1 คุณจะตาย

Input / Output

บอทจะถูกเรียกหนึ่งครั้งต่อเทิร์น มีการ จำกัด เวลาหนึ่งวินาทีในแต่ละเทิร์น

แรกเริ่ม

ครั้งแรกที่บอทของคุณถูกเรียกมันจะไม่มีการโต้แย้ง okตอบสนองกับ สิ่งนี้ทำเพื่อให้แน่ใจว่าบอทของคุณตอบสนองเท่านั้น หากไม่เป็นเช่นนั้นจะไม่ถูกเพิ่มลงในรายการผู้เล่น

แต่ละเทิร์น

ทุกเทิร์นบอทของคุณจะได้รับข้อมูลเกี่ยวกับบอตทั้งหมดในเกมเป็นอาร์กิวเมนต์บรรทัดคำสั่ง ตัวอย่างของข้อโต้แย้งเหล่านี้คือ:

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

อาร์กิวเมนต์แรกคือรหัสที่ไม่ซ้ำกันของบอทของคุณ จากนั้นรายการบ็อตที่คั่นด้วยช่องว่างจะปรากฏขึ้น แต่ละบอทถูกจัดรูปแบบเป็น:

id,life,power,lastAction

lastActionอาจเป็นจำนวนเต็มแทนบอทที่พวกเขาโจมตีDถ้าพวกเขาปกป้องและXถ้านี่คือเทิร์นแรก ส่วนอื่นเป็นจำนวนเต็มทั้งหมด

ดังนั้นในตัวอย่างข้างต้นคุณเป็นบอท1และได้รับการปกป้องในเทิร์นสุดท้ายของคุณ บอท0โจมตีคุณและยังอยู่ในช่วงเริ่มต้นสุขภาพ / พลัง

ผลลัพธ์สำหรับการเลี้ยวในแต่ละครั้งนั้นง่ายมาก เพียงแค่ส่งบ็อตที่คุณต้องการโจมตีเป็นจำนวนเต็ม (เช่น0หรือ3) หรือDเพื่อปกป้อง อย่าโจมตีบ็อตที่ตายแล้วหรือไม่มีอยู่เพราะนั่นจะถือว่าเป็นคำสั่งที่ไม่ถูกต้อง คำสั่งที่ไม่ถูกต้องจะส่งผลให้คุณสูญเสียอำนาจ 1

โครงสร้างการแข่งขัน

แต่ละเกมประกอบด้วยบอตทั้งหมดเริ่มต้นที่ 1,000 พลังและพลัง 10 การกระทำของบอตทั้งหมดจะถูกดำเนินการพร้อมกัน จำนวนรอบการหมุนสูงสุดสำหรับเกมคือ 1,000

หากในตอนท้ายของการหมุนมีบอทหนึ่งที่เหลืออยู่ (ชีวิต> 0) มันบอทหนึ่งคะแนนและเกมอื่นเริ่มต้นขึ้น หากถึงขีด จำกัด การเลี้ยวและมีหลายบอทยังมีชีวิตอยู่ไม่มีใครได้รับคะแนน หากบอทที่เหลือทั้งหมดตายในเทิร์นเดียวกันก็ไม่มีใครได้คะแนน

การแข่งขันประกอบด้วย 15 เกม ใครก็ตามที่มีคะแนนมากที่สุดในตอนท้ายชนะ! ความสัมพันธ์จะถูกทำลายโดยผลรวมของชีวิตที่เหลืออยู่ในแต่ละเกมที่ชนะ

สถานะ

บอตสามารถอ่านหรือเขียนไฟล์เดียวที่ตั้งชื่อตามตัวมันเองในโฟลเดอร์ย่อยโดยตรงชื่อstate("ฮีโร่" สามารถเขียนได้state/hero.whatever) ไฟล์นี้ควรมีขนาดไม่เกิน 1024 2ไบต์ ดูแลสังเกตการ จำกัด เวลา โปรแกรมของคุณจะต้องสิ้นสุดภายในหนึ่งวินาทีเพื่อนับไม่เพียง แต่ให้การตอบสนอง

ไฟล์เหล่านี้จะถูกล้างก่อนการแข่งขันแต่ละครั้ง แต่จะยังคงมีอยู่ในเกมต่อเกม ตัวระบุบอต ( id) ทั้งหมดจะยังคงเหมือนเดิมระหว่างเกม

ตัวควบคุม

ด้านล่างคือผู้ควบคุมทัวร์นาเมนต์ ( Stronger.java) โดยค่าเริ่มต้นจะแสดงผลลัพธ์สุดท้ายเท่านั้น (รายชื่อผู้เล่นเรียงลำดับผู้ชนะอยู่ด้านบน) ซึ่งอาจใช้เวลาสักครู่ มันไม่ได้แช่แข็งเพียงแค่เงียบ หากคุณต้องการรายละเอียดเพิ่มเติมแบบเลี้ยวต่อเลี้ยวเพิ่ม-logอาร์กิวเมนต์เมื่อเรียกใช้

ในการเพิ่มบอทคุณมีสองทางเลือกดังนี้

  • เพิ่มคำสั่งเป็นอาร์กิวเมนต์ ( java Stronger -log "python bot.py")

  • เพิ่มคำสั่งdefaultPlayers[]ในแหล่งที่มา ( "python bot.py")

บอทHero , BullyและCowardสามารถพบได้ในคำตอบนี้และจะใช้สำหรับการให้คะแนน

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 รอบ ความรุ่งโรจน์ของSantayanaของราล์ฟมาร์แชลล์ซึ่งเกิดขึ้นเป็นครั้งแรกเป็น ธ ปท. เพียงคนเดียวที่ทำคะแนนได้ถึงสามครั้ง ที่ไม่เพียงพอดังนั้นเขายังเอาสถานที่ที่สามกับอุบาย Stormcrow ใช้เวลาที่สองกับPhantom Menaceซึ่งเป็นการโพสต์แรกที่ดี โดยรวมแล้วเรามีการแสดงที่ดีมากจากสมาชิกใหม่โดยที่หกอันดับแรกไปถึงคนที่มีโพสต์น้อยกว่าห้าคน ขอแสดงความยินดีและยินดีต้อนรับสู่เว็บไซต์!

บอทที่ได้คะแนนเป็นศูนย์ชนะจะไม่ปรากฏเพื่อประหยัดพื้นที่ บอททั้งหมดที่โพสต์ก่อนเวลาประทับข้างต้นจะถูกเรียกใช้ดังนั้นหากคุณไม่เห็นของคุณแสดงว่ามันไม่ชนะอะไรเลย

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 sketchy คอนโทรลเลอร์แบบขนาน ( โดยอื่น ๆ ):

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
@Tim รายการบอทคั่นด้วยช่องว่าง แต่ละสถานะของบอทจะถูกคั่นด้วยเครื่องหมายจุลภาค
Geobits

3
@ Mark บ็อตในปัจจุบันนั้นมีความสามารถในการป้องกันและการโจมตีครึ่งหนึ่ง ไม่มีบอทป้องกันตัวใดที่ชนะเพียงครั้งเดียว ฉันยอมรับว่ามันส่งเสริมการป้องกันบางอย่างแต่ข้อดีของการรุกรานคือการป้องกันที่บริสุทธิ์ไม่สามารถชนะคะแนนใด ๆ เลย คุณจะชนะคะแนนถ้าคุณเป็นผู้รอดชีวิตเพียงคนเดียว
Geobits

8
หากใครอยากรู้ว่าบอทนั้นกองซ้อนกันอย่างไรตอนนี้มีการส่งมากขึ้นนี่เป็นผลของการทดสอบแบบ "ไม่เป็นทางการ" ของฉัน: 3-809-Hero; 2-593-ศาสนวิทยา; 1-471-SurpriseBot; 1-433-ขี้ขลาด; 1-371-แซน; 1-364-Wiisniper; 1-262-นักวิเคราะห์; 1-230-Bully; 1-132-ควอไลเซอร์; 1-71-IKnowYou; 0-0 - precog, Berserker, BroBot, SemiRandom, MonteBot, Tactician, SnappingTurtle, Psycho, Revenger, Opportunity, PhantomMenace, Tank, นักมวย, Guardian, เหนือกว่าค่าเฉลี่ย, DefensiveBot คำสั่งที่ไม่ถูกต้องจำนวนมากจาก Opportunity, AboveAvg, BroBot, Boxer และ SemiRandom
OJFord

3
ฉันมีตัวควบคุมเวอร์ชันขนานที่รันเกมได้เร็วกว่าตัวควบคุมเดิมถ้าใครสนใจฉันสามารถโพสต์มันได้ ...
อื่น ๆ

3
@Manu ตราบใดที่บอทไม่ได้ถูกดำเนินการพร้อมกันมันก็ไม่สำคัญ ฉันคิดว่ารุ่นคู่ขนานยังคงมีบอตทั้งหมดหนึ่งรอบก่อนที่จะย้ายไปยังถัดไป อย่างที่ฉันบอกไปฉันจะตรวจสอบก่อนใช้หากโพสต์
Geobits

คำตอบ:


25

C ++ - MonteBot

จำลองเกมสุ่มจำนวนมากและเลือกการเคลื่อนไหวที่นำไปสู่โอกาสที่ยิ่งใหญ่ที่สุดของการไม่ตาย

ทำไมต้องคิดกลยุทธ์เมื่อคุณสามารถให้คอมพิวเตอร์สร้างมันให้คุณได้?

หมายเหตุ: รวบรวมสิ่งนี้ด้วยแฟล็ก -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;
}

C - MonteFaster

นอกจากนี้บ็อตนี้สามารถทำให้ทำงานได้เร็วขึ้นด้วยการใช้มัลติเธรด อย่างไรก็ตามเนื่องจากฉันไม่ทราบล่วงหน้าว่าบอทสามารถประเมินซ้ำได้กี่ครั้งก่อนหมดเวลา (บนแพลตฟอร์มการตัดสิน) ฉันจะไม่ใช้บอทนี้ (พร้อมรหัสด้านล่าง) สำหรับการแข่งขันครั้งนี้

รหัสด้านล่างเป็นเพียงเพื่อประโยชน์ของความอยากรู้

หมายเหตุ: รวบรวมสิ่งนี้ด้วยแฟล็ก -O3 และ -fopenmp เพื่อประสิทธิภาพที่ดีที่สุด

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

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

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

    srand(time(NULL));

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

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

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

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

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

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

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

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

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

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

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

    return 0;
}

2
กลยุทธ์ที่น่าสนใจ ใช้เวลานานแค่ไหนในการจำลองกับคู่ต่อสู้ 20ish?
Ralph Marshall

2
@RalphMarshall มันสามารถทำการจำลอง 60,000 แบบได้อย่างรวดเร็ว (จาก 0.03 วินาทีถึง 0.2 วินาที) สำหรับคู่ต่อสู้เพียงไม่กี่คน แต่จะกลายเป็นช้ามากอย่างมากสำหรับฝ่ายตรงข้าม 20 คน (โดยเฉลี่ย 10 วินาที) หวังว่าการยกเลิกอัลกอริทึมก่อนกำหนดจะยังคงให้ผลการแก้ไขที่เป็นไปได้
Potatomato

ฉันกำลังพิจารณาที่จะเพิ่มการสนับสนุนมัลติเธรดสำหรับบอทนี้เพื่อให้โปรแกรมทำงานได้เร็วขึ้น แต่ฉันไม่รู้ว่าคอมพิวเตอร์ที่ใช้ในการตัดสินจะสามารถประเมินซ้ำได้กี่ครั้งก่อนบอทจะหมดเวลา ฉันอาจเสียสละเกมแรกเพื่อทำโปรไฟล์เพื่อให้บอทสามารถทำงานซ้ำได้ตามจำนวนที่เหมาะสม
Potatomato

23

Java Psycho

ไม่มีใครบอกได้ว่าโรคจิตที่บ้าคลั่งนี้จะทำอะไร - อาจโจมตีใครก็ได้: บอทที่ตายแล้วหรือแม้แต่ตัวเขาเอง

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

Scala - Bandwagoner

Bandwagoner ไม่สนใจเกี่ยวกับเกียรติยศหรือหลักการ Bandwagoner วางต่ำหลีกเลี่ยงการอ่อนแอหรือแข็งแกร่งที่สุด Bandwagoner ไปกับฝูงชนโดยตั้งเป้าหมายที่ฉันทามติเพื่อหลีกเลี่ยงความสนใจ

import scala.util.Try

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

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

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

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

คุณมีความคิดใดบ้างไหมว่าทำไมฉันถึงได้รับข้อผิดพลาด "ลองไม่ได้เป็นสมาชิกของ scala.util" ในบรรทัดแรก? Googling ทำให้ฉันสูญเสีย ฉันมีการติดตั้งสกาล่ามาตรฐาน 2.9.2 ตรงจากที่เก็บ
Geobits

@Geobits นั่นเป็นรุ่นที่เก่ากว่าของฉันฉันกำลังรัน 2.11 หากการอัพเกรดไม่ใช่ตัวเลือกโปรดแจ้งให้เราทราบและฉันจะแก้ไขรหัสให้ใช้งานได้
อื่น ๆ

2
รับมันไป ฉันอ่าน "ตั้งแต่ 2.10" ในเอกสารเป็น "ตั้งแต่ 2.1.0" และไม่สามารถหาสาเหตุที่มันจะไม่อยู่ใน 2.9.2 :(
Geobits

18

Java Revenger

Revenger ไม่สนใจที่จะทะเลาะวิวาทเพราะวิวาท แต่ถ้าถูกโจมตีการแก้แค้นจะถูกตามหา!

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

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

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

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

        System.out.print(target);
    }
}

4
FYI: สิ่งนี้ไม่หยุดการโจมตีแม้หลังจากที่เป้าหมายตายแล้ว
Geobits

26
@Geobits โอ้ แต่การแก้แค้นเป็นอาหารที่ดีที่สุดเสิร์ฟแล้ว .. ตายไปแล้วหรือ : p ไม่ได้ตั้งใจ อัปเดต
OJFord

17

Java - Hero, Bully และ Coward

บอททั้งสามนี้รวมเป็นตัวอย่าง แต่จะเล่นในทัวร์นาเมนต์การให้คะแนน พวกเขาทั้งหมดมีพฤติกรรมที่ง่าย

พระเอก

ฮีโร่โจมตีผู้ใดก็ตามที่มีชีวิตมากที่สุดในทุก ๆ เทิร์น

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
น่าสนใจว่าฮีโร่กลายเป็นเทคนิคที่มีประสิทธิภาพสูง แม้กับบอทที่ 'ซับซ้อน' มากขึ้น (เช่น MonteBot นักวิเคราะห์) มันเป็นเพียงตัวอย่างง่ายๆหรือคุณใช้ความเข้าใจอย่างถ่องแท้บ้างไหม?
OJFord

1
ไม่ฉันเพิ่งโยนสามสิ่งแรกที่ฉันคิดว่าเป็นตัวอย่าง ฉันไม่คิดว่ามันจะทำได้ดีเลย
Geobits

16

Perl - นักยุทธศาสตร์

สิ่งนี้เริ่มต้นจากการแก้ไขบอต Let 'em Fight ของฉัน แต่ฉันได้ทำการเปลี่ยนแปลงพอที่ฉันตัดสินใจที่จะป้อนเป็นรายการใหม่ ตรรกะใหม่มีดังนี้

  • หากไม่มีใครโจมตีในเทิร์นก่อนหน้าให้โจมตีคู่ต่อสู้ด้วยมูลค่าชีวิตสูงสุด สิ่งนี้ควรป้องกันตอนจบที่ไม่มีใครโจมตีใครอย่างน้อยที่สุดตราบใดที่ฉันยังมีชีวิตอยู่
  • หากใครบางคนทำร้ายฉันในเทิร์นล่าสุดให้เลือกผู้โจมตีที่ทรงพลังที่สุดและตีกลับ
  • หากเราลดลงไปสองบอทหรือฉันมีความแข็งแกร่งต่ำกว่าค่าเฉลี่ยให้โจมตีคู่ต่อสู้ด้วยพลังชีวิตสูงสุด
  • หากระดับพลังงานของฉันต่ำกว่าค่าเฉลี่ยทำการโจมตีเพื่อเพิ่มพลังของฉันให้อยู่ในระดับที่สมเหตุสมผลยิ่งขึ้น
  • มิฉะนั้นรอเวลาของฉัน

ฉันได้ทดสอบสิ่งนี้ในพื้นที่กับบอท Java อื่น ๆ ที่ได้รับการป้อนและจัดการเพื่อให้ได้รับชัยชนะไม่กี่ครั้ง แต่ก็ยังไม่ใช่รายการที่น่าตื่นเต้นในส่วนของฉัน

#!/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";

Perl - Santayana

ผู้ที่จำประวัติไม่ได้จะต้องตายก่อนกำหนดหรือบางส่วน บอทนี้พยายามที่จะใช้ประโยชน์จากธรรมชาติของการแข่งขันหลายรอบโดยการรักษาประวัติความแข็งแกร่งโดยรวมของแต่ละบอทในทุกรอบและโจมตีผู้ที่แข็งแกร่งที่สุดเสมอ ในทางทฤษฎีสิ่งนี้ควรป้องกันไม่ให้บ็อตใด ๆ ออกไปข้างนอกเพื่อนำไปสู่การบดขยี้ แต่แน่นอนว่าฉันเก็บสถิติในขณะที่ฉันยังมีชีวิตอยู่ดังนั้นถ้าบอตนี้จบลงด้วยการมีชีวิตที่สั้นสถิติจะไม่ดีนัก

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

โปรดทราบว่าฉันค่อนข้างแน่ใจว่าฉันลบรายการอื่นของฉัน (ติดป้ายกำกับ Let 'em Fight) ดังนั้นฉันควรมีเพียงสองบอท แต่ถ้าไม่โปรดเพิกเฉยต่อรายการนั้นและใช้สองรายการนี้เท่านั้น ขอบคุณ
Ralph Marshall

6
ขอแสดงความยินดีในการที่ทั้งสองสถานที่แรกและที่สามในตารางคะแนนล่าสุด :)
Geobits

ยอดเยี่ยมที่สุด! นี่เป็นความท้าทายที่ยิ่งใหญ่
Ralph Marshall

14

Java Guardian

ผู้พิทักษ์ปกป้องผู้อ่อนแอ เขาจะโจมตีใครก็ตามที่ใช้ตาสุดท้ายของพวกเขาในการเลือกบอตที่อ่อนแอที่สุดในตอนนี้ แม้ว่าเขาฉลาดพอที่จะไม่โจมตี:

1) ตัวเอง (เว้นแต่เขาจะเป็นคนพาลจากนั้นเขารู้สึกว่าเขาสมควรได้รับมัน)

2) บอทที่โจมตีตนเอง

3) บอทที่ตายแล้ว

4) บอทที่เหลือน้อยกว่าสิบชีวิต (ผู้ที่หวังว่าจะได้เรียนรู้บทเรียนของพวกเขา!)

ผู้พิทักษ์จะเลือกผู้เล่นคนเดียวกันซ้ำ ๆ หากจำเป็น ผูกสำหรับ "ผู้เล่นที่อ่อนแอที่สุด" และ "ผู้ที่เลือกเขา" ทั้งคู่ไปที่คนแรกในรายการ (ซึ่งก็คือการพูดแบบสุ่ม)

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

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

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

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

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

1
โปรดแก้ไขความผิดพลาดต่าง ๆ นานาและความผิดพลาดในเรื่องนี้และบอทอื่น ๆ ของคุณ ฉันไม่สามารถรวบรวมได้ตามที่มันเป็น
Geobits

ฉันคิดว่าในกรณีที่มันเป็นคนพาลมันควรจะคิดเกี่ยวกับสิ่งที่มันทำคือD efend
user3819867

แก้ไขข้อผิดพลาด @ user3819867 ฉันคิดเกี่ยวกับการเพิ่มนั้น แต่ผู้พิทักษ์จะปกป้องความอ่อนแอในทุกค่าใช้จ่ายแม้แต่กับตัวเอง
Xynariz

13

Java - นักวิเคราะห์

กำหนดภัยคุกคามของคู่ต่อสู้แต่ละคนโดยการเพิ่มพลังของมัน 5 โดยถ้ามันโจมตีและ 25 ถ้ามันโจมตีนักวิเคราะห์ ในกรณีที่เสมอกันมันจะโจมตีผู้เล่นด้วยชีวิตน้อยที่สุด

รหัสส่วนใหญ่ยืมมาจากคำตอบของ Geobits

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

Python 2, Snapping Turtle

ซ่อนในเปลือกของมันโผล่ออกมากัดคนแรกที่จะโจมตีมันเทิร์นสุดท้าย (เว้นแต่พวกเขาจะตาย) จากนั้นกลับเข้าไปในเปลือกของมันอีกครั้ง
วิ่งด้วย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:])

Python 2, Berserker

Berserker ชน! ฮิตตัวเองจนกว่าจะมีพลังมากพอจากนั้นเริ่มโจมตีสิ่งมีชีวิตที่ใกล้เคียงที่สุด ก็กระทบตัวเองด้วยถ้าไม่สามารถคิดออกได้ว่าควรจะชนใครด้วยเหตุผลใดก็ตาม

แก้ไข: เปลี่ยนเกณฑ์ความโกรธของ Berserker จาก 50 เป็น 25 เพราะไม่เช่นนั้นมันจะพาตัวเองออกไปก่อนที่จะทำอะไร ...

ทำงานด้วย python Berserker.py <input>

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


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

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

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

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

12

R - โอกาส

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

ดี ฉันเริ่มวิธีแก้ปัญหาใน R แต่มันดีกว่ามาก
Alex A.

ถ้าคุณนึกถึงกลยุทธ์ที่ดีอย่าลังเลที่จะใส่บอต R ใหม่บนวงแหวน (คุณสามารถนำโค้ดของฉันกลับมาใช้ใหม่ได้แม้ว่าจะจำเป็น)! ฉันอยากรู้อยากเห็นบอต Julia แม้ว่า (เนื่องจากบางครั้งคุณเล่นกอล์ฟในจูเลีย)
plannapus

บางทีฉันจะให้มันยิงในจูเลีย ขอบคุณสำหรับกำลังใจ :)
อเล็กซ์ A.

10

Python 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 ตัวอักษร? โค้ดกอล์ฟคืออะไร ;)
Casey Kuball

1
@Darthfett: เพียงเพราะมีการส่ง Java จำนวนมากที่นี่ไม่ได้หมายความว่าทุกคนต้องทิ้งรหัสของพวกเขาด้วยจำนวนสำเร็จรูปที่คล้ายกัน ...
หยุดหัน counterclockwis

11
นักมวยผอมเขามีน้ำหนักพอเหมาะกับการต่อสู้ เขาสนุกกับการรับประทานอาหารเพื่อสุขภาพของความเข้าใจและลูกแกะ คุณจะไม่พบเขากินเบอร์เกอร์แบบคงที่หรือการเคี้ยวเฟรนช์ฟราย
ลอจิกอัศวิน

4
@CarpetPython Terseness เพื่อประโยชน์ของ terseness นั้นแย่พอ ๆ กับการใช้คำฟุ่มเฟื่อย
Kroltan

9

C - SurpriseBot

สมมติว่าเทิร์นแรกจะเป็นระเบียบและปกป้อง หลังจากนั้นโจมตีใครบางคนที่ไม่ได้ป้องกันเทิร์นสุดท้าย - พวกเขาจะไม่เห็นมันมา!

คำตอบนี้โง่เล็กน้อย แต่ฉันต้องการเขียนแพลตฟอร์มทั่วไปสำหรับสร้างคำตอบใน C ดังนั้นที่นี่คุณไป

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

Python 2 Precog

Precog พยายามทำนายการเคลื่อนไหวของคนอื่นโดยพิจารณาจากความถี่ในการกระทำที่ผ่านมาจากนั้นลองจำลองสถานการณ์สองสามครั้งและเลือกหนึ่งครั้งเพื่อเพิ่มคะแนน มันไม่น่าเชื่อถือโดยเฉพาะ แต่แล้ว ... ESP ไม่ใช่ของจริง : D

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% ของเวลาที่บอทของคุณรวมอยู่ในการทดสอบของฉัน)
Potatomato

9

bash - CopyCat

CopyCat ชื่นชมคนที่แข็งแกร่งแข็งแรงและก้าวร้าวและโจมตีเหมือนที่พวกเขาทำ เมื่อเธอมี "ความประทับใจ" แสดงว่าบอทส่วนใหญ่จู่โจมที่นี่เธอจะเริ่มป้องกันตัวเองหรือโจมตีคนอ่อนแอเว้นแต่เธอจะแข็งแกร่งขึ้นหรือคนอื่น ๆ ส่วนใหญ่หยุดโจมตีที่นี่

เพียงแค่รันด้วย /bin/bash copycat.sh

#!/bin/bash

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

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

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

myMostWeakAttacker=-1
mmwaAwe=0

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

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

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

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

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

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

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

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

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

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

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

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

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

echo "$myAction"
exit 0

จุดอ่อนของเธอ: เธออาจจะไม่ดีขึ้นอย่างที่เธอมอง :()


8

Python 3 DefensiveBot

บอทพยายามที่จะหาศัตรูที่มีพลังสูงสุดที่สามารถฆ่าได้ด้วยพลังปัจจุบัน มิฉะนั้นปกป้อง ทำงานด้วย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ตอบสนองกับ สิ่งนี้ทำเพื่อให้แน่ใจว่าบอทของคุณตอบสนองเท่านั้น หากไม่เป็นเช่นนั้นจะไม่ถูกเพิ่มลงในรายการผู้เล่น
Geobits

แก้ไข @Geobits แล้ว
Elias Benevedes

ตกลงมันทำงาน แต่มีการพิมพ์ที่เกิดขึ้นภายนอก ฉันต้องคอมเม้นท์บรรทัดที่ 28 และ 32 เพื่อให้คำตอบที่ถูกต้อง มิฉะนั้นมันก็จะตาย
Geobits

คุณอาจต้องการตรวจสอบให้แน่ใจว่าบอทยังมีชีวิตอยู่ก่อนกำหนดเป้าหมาย เป้าหมายนี้มีคนตายบ่อยครั้งซึ่งนับว่าเป็นการเคลื่อนไหวที่ไม่ถูกต้องและลดพลังของคุณลง
Geobits

แก้ไขการถอนหายใจแล้ว ฉันมีความรู้สึกว่านี่ไม่ใช่การแก้ไขล่าสุด: P
Elias Benevedes

8

Java Tank

รถถังไม่คิดว่าเขาไม่สนใจเขาแค่โจมตีบอตแรกที่เขาเห็น! แม้ว่าเขาจะฉลาดพอที่จะไม่โจมตีตัวเองหรือคนตาย แต่

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
ดังที่บันทึกไว้ในบอตอื่น ๆ ของคุณสิ่งนี้จะไม่รวบรวมเหมือนเดิม
Geobits

8

Java - Phantom Menace

Hi! นี่คือการโพสต์ครั้งแรกของฉันที่นี่ที่รหัสกอล์ฟ ฉันเป็นคน C # ดังนั้นโปรดให้อภัยคนฝรั่งเศสของฉัน ฉันใช้ชิ้นส่วนของรหัสตัวอย่าง Hero และ Coward แล้ว

บอทของฉันเป็นคนเรียบง่ายที่มีทัศนคติทางการเมืองค่อนข้าง เวลาส่วนใหญ่เขาเพิ่งซ่อนตัวเองในล็อบบี้ดื่มกาแฟและเตรียมแผนการของเขา แต่เมื่อมีโอกาสเกิดขึ้นและโอกาสในการทำกำไรนั้นแข็งแกร่งพอที่เขาจะกระโดดขึ้นจากเก้าอี้เท้าแขนในล็อบบี้ที่แสนสบายของเขาโยนหนังสือพิมพ์และไปหาเงิน

เขาปกป้องตัวเองหลังจากทำอันตรายใด ๆ กับเขา ไม่เช่นนั้นเขาจะทำตัวเหมือนฮีโร่ตัวจริง (นั่นก็เป็นการตัดสินใจทางการเมืองเพราะมันค่อนข้างปลอดภัย) เมื่อเขามีคู่แข่งเพียงสามคนเขาก็จะชนะ

เขาปฏิบัติตามหลักการพื้นฐานสองสามข้อ นักการเมืองที่จริงจังทุกคนควรมีหลักการที่แตกไม่ได้และมีรายละเอียดที่ชัดเจน ...

อย่าช่วยใครนอกจากตัวคุณเอง! (เห็นแก่ตัว)

สง่าราศีหมายถึงความตาย! (สงสัย)

ไม่มีอะไรหลังจากคุณตาย! (พระเจ้า)

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
ดีมากและตอนนี้อยู่ในสถานที่ที่สอง ยินดีต้อนรับสู่เว็บไซต์ :)
Geobits

โอ้ขอบคุณแม้ว่ามันจะเป็นความประหลาดใจที่น่ายินดีฉันต้องยอมรับว่าฉันไม่เคยหยุดเชื่อในบอทของฉัน: P
Stormcrow

7

ฉันรู้ว่าคุณ - Java

วิเคราะห์ศัตรูทั้งหมดและใช้ข้อมูลนี้เพื่อปกป้องตัวเองให้ดีขึ้น น่าเสียดายที่มันมีแนวโน้มที่จะแก้แค้นการโจมตี

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

Java - Velociraptor

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

Python 3 แบบกึ่งสุ่ม

เลือกระหว่างการโจมตีและการป้องกันโดยพิจารณาจากน้ำหนักแบบสุ่มจากการเปลี่ยนแปลงความแข็งแกร่งก่อนหน้าหลังจากการโจมตีและการปกป้อง หากเลือกการโจมตีจะทำการโจมตีผู้เล่นที่แข็งแกร่งที่สุด Strongness life * powerถูกกำหนดให้เป็น

จากตัวอย่างทั้ง 3 บอทนั้นไม่ค่อยชนะ อาจจะอยู่ในป่า ...

import sys, random

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

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

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

7

Java- เต่าโรมัน

Roman Tortoise จะโจมตีใครก็ตามที่เข้ามาใกล้ แต่จะสุ่มเลือกที่จะโจมตีบอทคนอื่นเพราะมันไม่ใช่คนขี้ขลาด มันเป็นครั้งคราว (1 ใน 50) แสดงการให้อภัย

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 ไม่ได้อีกต่อไป ฉันได้รับข้อยกเว้นนั้นบางครั้งเมื่อเข้าถึงหนึ่งในองค์ประกอบของอาร์เรย์ การแก้ไขข้อผิดพลาดของฉัน แต่เพียงซ้ายจับลองใน - ดีกว่าปลอดภัยกว่าขออภัย :)
euanjt

7

Java - BroBot

BroBot จะโจมตีคู่ต่อสู้ที่ทรงพลังที่สุดยกเว้นว่าศัตรูที่มีการโจมตีมากกว่าค่าที่น้อยกว่านั้นก็ตัดสินใจที่จะโจมตี BroBot ซึ่งในกรณีนี้เขาจะป้องกันการโจมตีนั้น

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

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

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

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

Java - SisBot

พี่ชายที่ไม่มีน้องสาวคืออะไร? หลายสิ่งหลายอย่าง ... แต่นั่นอยู่ตรงประเด็น การเป็นบอทที่ชาญฉลาด SisBot บันทึกการกระทำสุดท้ายของแต่ละบอทวิเคราะห์การกระทำในปัจจุบันและสุดท้ายของเธอและทำให้เธอเคลื่อนไหว - เธอจะโจมตีบอทด้วยพลังสูงสุดโดยไม่ต้องมีความคิดที่สองหากสุขภาพและพลังงานของเธอนั้นสูงพอ ไม่มีบอทตัวอื่นที่มีพลังอำนาจเหนือค่าที่แน่นอนตัดสินใจโจมตีเธอ ในกรณีนั้นเธอจะสลับไปมาระหว่างการโจมตีและการป้องกันหรือเพียงแค่ปกป้องอย่างตรงไปตรงมาหากพลังของผู้โจมตีนั้นสูงมาก

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

ฉันต้องเรียนรู้ภาษาอื่นจริง ๆ ... : P


ดูเหมือนว่าคุณต้องการการตรวจสอบสำหรับเป้าหมายที่เลือกไว้ว่าตายแล้ว
Ralph Marshall

ฉันคิดว่าฉันมีอยู่แล้ว ... แต่แล้วอีกครั้งฉันสร้างกลยุทธ์ที่แตกต่างกันก่อนโพสต์ที่นี่ ขอบคุณสำหรับการจับที่
ทีเอ็นที

6

อีควอไลเซอร์ Java

ถึงแม้ว่าการป้องกันจะเป็นกลยุทธ์ที่มีประสิทธิภาพมากที่สุด (: P) แต่ผู้ชายคนนี้คิดว่าการโจมตีผู้คนบนศีรษะจนกว่าพวกเขาจะโค่นล้มยักษ์ใหญ่ดูเหมือนว่าจะสนุก แต่คนเหล่านั้นที่ป้องกันอยู่ตลอดเวลา พวกเขาไม่ได้รับพลังจากผู้ชายคนนี้

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

Java - Wiisniper - เอเจนต์สะท้อนกลับ

เอเจนต์สะท้อนแสงอย่างง่ายซึ่งระบุบอทที่อันตรายที่สุดโดยใช้ฮิวริสติกแบบง่ายแล้วโจมตีมัน

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

Java - สูงกว่าค่าเฉลี่ย

พยายามรักษาสถานะของเขาที่ควอไทล์ชั้นบน ใช้เทคโนโลยีการทำนายเพื่อทำนายสิ่งที่ศัตรูจะทำ

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 statusดูเหมือนว่าจะยกเว้นIndexOutOfBoundsในเทิร์นแรก
OJFord

5

Java - Pacifier

ส่งครั้งแรก! \ o / ทำงานกับบอตสำหรับการประกวดครั้งนี้ซึ่งใช้การบันทึกข้อมูลจำนวนมากและพยายามหารูปแบบและคิดเกี่ยวกับสิ่งนี้ โดยทั่วไปถ้าเขาคิดว่าความเสียหายของเขาต่ำเกินไปที่จะทำสิ่งที่มีประโยชน์เขาจะปกป้องตัวเอง ไม่เช่นนั้นเขาจะโจมตีศัตรูที่คุกคามมากขึ้นซึ่งจะพิจารณาจากจำนวนการโจมตีที่จะฆ่าเขาและมันจะสร้างความเสียหาย ไม่สามารถลองได้ แต่ฉันคิดว่าเขาทำได้ดีมาก!

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

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

        if(args.length==0)
        {

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

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

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

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

        }

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

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

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

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

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

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

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

เขาไม่มีสมองที่ใหญ่โตดังนั้นเขาจำอะไรไม่ได้เลย แต่ฉันคิดว่ามันสามารถทำงานได้ดี ประเด็นตลก: ถ้าเขายังมีชีวิตอยู่เขาจะพยายามเตะศพผู้ซอมบี้จะทำให้เขากลัว!

แก้ไข:

ส่งโอเคในรอบแรกเพียงแค่ทดสอบกับตัวอย่างเขาได้รับความยากลำบากเขาจะทำงานกับเขาก่อนหน้าเล็กน้อย

แก้ไข 2:

ตอนนี้เขาจำข้อมูลบางส่วนและทำได้ดีกว่าไม่เคยชนะ แต่จริง ๆ แล้วเสียแต่ละครั้งโดย <50 hp ... ho และหนึ่งในสิ่งที่ฉันทำกับกลุ่มตัวอย่างทำให้ฉัน:

14 3170 java Bully
0 0 java Pacifier
0 0 java Hero
0 0 java Coward

มันไม่ได้เกิดขึ้นอีกแล้ว (เขาได้รับคะแนนจริง ๆ :)) แต่ก็ตลก: D

แก้ไข 3:

ใช้ชื่อไฟล์ที่ถูกต้องและการปรับปรุงบางอย่าง ทำงานได้ดีและดีกว่ามากเมื่อบอทอยู่ที่นี่ :)


3

Java - Meta Fighter

หมายเหตุ: โปรดบอกฉันว่ามันไม่ทำงาน

นักรบเมตาดาต้าไม่ได้พิจารณาคู่ต่อสู้ทุกคนว่าเป็นศัตรูรายบุคคล เขาถือว่าพวกเขาทั้งหมด Meta Fighter เพิ่มพลังและความแข็งแกร่งของศัตรูทั้งหมดเข้าด้วยกันและคิดว่ามันเป็นเขาและพวกมัน จากนั้นเขาคำนวณว่าการเคลื่อนไหวใดจะมีประสิทธิภาพมากที่สุดในการลดคะแนนทั้งสอง การฆ่าคู่ต่อสู้ที่อ่อนแอนั้นมีประโยชน์เพราะมันช่วยลดความแข็งแกร่งและพลังในเวลาเดียวกัน อย่างไรก็ตามหากโจมตีศัตรูจะให้พลังที่เป็นประโยชน์มากกว่าที่จะเอาความแข็งแกร่งเขาตัดสินใจว่ามันไม่คุ้มค่าและปกป้องหรือโจมตีตัวเอง นักสู้ Meta กำลังสงสัยว่าทำไมคู่ต่อสู้กำลังทำสงครามกับตัวเอง ...

(BTW, รายการที่สองของฉันที่เคย Codegolf)

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 บอทเท่านั้น

จุดอ่อนที่ใหญ่ที่สุด: คนพาล


ทำไม Meta Fighter จึงสงสัยว่าทำไมคู่ต่อสู้ถึงทำสงครามกับตัวเอง แต่ก็คิดว่าโจมตีตัวเองเช่นกัน?
rudi

@rudi เขาสงสัยว่าทำไมคู่ต่อสู้จะต่อสู้กับตัวเองในแบบที่ไม่เป็นประโยชน์ต่อคู่ต่อสู้ ในทางทฤษฎีเขาจะโจมตีตัวเอง แต่ในการทดสอบทั้งหมดของฉันมันไม่เคยมี
colorado777

3

python 2.7 - Trevor Phillips ของ GTA V และ Michael De Santa


แก้ไข 2015-05-25: เพิ่มรุ่นแรกของ Michael De Santa
นี่เป็นการแสดงความเคารพเล็กน้อยต่อ GTA V. ฉันได้สร้าง ธ อร์ ธ บ ธ . สองตัวเป็นตัวแทนของสองในสามของ GTA V กรุณาพบเทรเวอร์ฟิลลิปส์และไมเคิลเดอซานต้า เทรเวอร์ไม่มีอะไรที่ลึกซึ้งเกินไปเกี่ยวกับเขา ไมเคิลมีความทรงจำที่ดี - และเป็นรายการยอดนิยม เมื่อคุณทำเสร็จแล้ววันของคุณก็จะถูกนับ

Note1: เมื่อฉันมีเวลาฉันจะเพิ่มความฉลาดให้กับ Michael และอาจเพิ่ม Franklin (เพื่อแทนที่ Trevor เป้อเย้อ)

หมายเหตุ 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)

Michael De Santa

# 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

Java- Patroclus

Patroclus เป็นบอตก้าวร้าวซึ่งมุ่งมั่นที่จะแสวงหาความรุ่งโรจน์ เขามีความทรงจำที่ดี (แม้ว่าฉันจะพูดด้วยตัวเอง) และเขาเชื่อว่าวิธีที่ดีที่สุดในการแสวงหาความรุ่งโรจน์คือการโจมตีศัตรูที่ก้าวร้าวที่สุด เขาจำได้ว่าใครเป็นผู้โจมตีมากที่สุดในทุกเกมและโจมตีพวกเขาด้วยดาบเล่มใหญ่ของเขา

จุดอ่อนที่ใหญ่ที่สุดของเขาคือทัศนคติกามิกาเซ่ของเขาในการป้องกัน - ใครต้องการมันเมื่อคุณใส่ชุดเกราะของ Achilles?

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.