# Java 8, Butter

Spreads itself as evenly as possible. Smothers a town if the town is sufficiently small.

<!-- language-all: lang-java -->


    import java.util.ArrayList;
    import java.util.List;
    
    public class Butter {
    
        int round;
        int playerID;
        int thisTownID;
    
        List<Town> towns;
        List<Town> myTowns;
        List<Town> otherTowns;
    
        Town thisTown;
    
        public static void main(String[] args){
            if (args.length == 0){
                System.out.println("34 34 34");
                return;
            }
            new Butter().spread(args[0].split(";"));
        }
    
        private void spread(String[] args) {
            round = Integer.parseInt(args[0]);
            playerID = Integer.parseInt(args[1]);
            thisTownID = Integer.parseInt(args[2]);
            towns = new ArrayList<>();
            myTowns = new ArrayList<>();
            otherTowns = new ArrayList<>();
    
    
            for (int i = 3; i < args.length; i++){
                towns.add(new Town(args[i]));
            }
    
            for (Town town : towns){
                if (town.isMine()){
                    myTowns.add(town);
                    if (town.isThisTown()){
                        thisTown = town;
                    }
                } else {
                    otherTowns.add(town);
                }
            }
    
            Town mySmallestTown = myTowns.stream().min((a, b) -> a.getFreeKnights() - b.getFreeKnights()).get();
    
            Town smallestEnemyTown = otherTowns.stream().min((a,b) -> a.knights - b.knights).get();
    
            if ((thisTown.getFreeKnights() - mySmallestTown.getFreeKnights())/2 > 0) {
                System.out.println("S " + mySmallestTown.getId() + " " + (thisTown.getFreeKnights() - mySmallestTown.getFreeKnights()) / 2);
            } else if (thisTown.getFreeKnights() / 2 > smallestEnemyTown.numberOfKnightsToConquer()){
                System.out.println("A " + smallestEnemyTown.getId() + " " + smallestEnemyTown.numberOfKnightsToConquer());
            } else {
                System.out.println("W");
            }
        }
    
    
        private class Town {
            private final int ownerId;
            private final int id;
            private final int knights;
            private final int lowborns;
    
            private Town(String string){
                String[] args = string.split("_");
                ownerId = Integer.parseInt(args[0]);
                id = Integer.parseInt(args[1]);
                knights = Integer.parseInt(args[2]);
                lowborns = Integer.parseInt(args[3]);
            }
    
            private int getId() {
                return id;
            }
    
            private int getOwner() {
                return ownerId;
            }
    
            private int knightCount() {
                return knights;
            }
    
            private int lowbornCount() {
                return lowborns;
            }
    
            private boolean isMine(){
                return ownerId == playerID;
            }
    
            private boolean isThisTown(){
                return id == thisTownID;
            }
    
            private int getFreeKnights() {
                return knights - lowborns / 2 - 1;
            }
    
            private int numberOfKnightsToConquer(){
                return ((knights * 6) / 5) + (lowborns / 2) + 1;
            }
    
        }
    }

Compile: `javac Butter.java`

Run: `java Butter`