anchor.diff:          // You have to output the target position
           // followed by the power (0 <= thrust <= 100)
           // i.e.: "x y thrust"
  -
  -        Solution gen = genetic(pods, 6, 95, lastSolution);
  -        
  -        stderr.writeln("Genetic eval: ${gen.score(pods)}");
  -        
  -        stderr.writeln("Move 0 ${gen.moves0[0]}");
  -        stderr.writeln("Move 1 ${gen.moves1[0]}");
  -        
  -        pods[0].output(gen.moves0[0]);
  -        pods[1].output(gen.moves1[0]);
  +        
  +        if(turn == 0 && pods[0].distance2(checkpoints[1]) > 4000 * 4000){
  +            print("${checkpoints[1].x} ${checkpoints[1].y} BOOST");
  +            print("${checkpoints[1].x} ${checkpoints[1].y} BOOST");
  +            
  +        } else {
  +            
  +            int solLength = 6;
  +            
  +            //monte carlo the enemy players for a bit
  +            List<Pod> enemiesFirst = [pods[2], pods[3], pods[0], pods[1]];
  +            Solution enemySol = genetic(enemiesFirst, solLength, 15, null, null);
  +            
  +
  +            Solution gen = genetic(pods, solLength, 95, lastSolution, enemySol);
  +            lastSolution = gen;
  +            
  +            // stderr.writeln("Genetic eval: ${gen.score(pods)}");
  +            
  +            pods[0].output(gen.moves0[0]);
  +            pods[1].output(gen.moves1[0]);
  +        }
           
           [0, 1, 2, 3].forEach((index) {
               pods[index].timeout -= 1;
  
positive.code:     return bestSolution;
  }
  
  Solution genetic(List<Pod> startPods, int length, int timeout, Solution lastSolution){
      int poolSize = 10;
      
      Stopwatch sw = new Stopwatch();
      sw.start();
      Solution naive = naiveSolution(startPods, length);
      
      Map<num, Solution> pool = new SplayTreeMap();
      num naiveEval = naive.score(startPods);
      pool[naiveEval] = naive;
      stderr.writeln("Created naive $naiveEval ${sw.elapsedMilliseconds}");
      
      
      for(int i = 0; i < poolSize; i++){
          Solution randomSolution = new Solution(
              new List.generate(length, (index) => randomMove()),
              new List.generate(length, (index) => randomMove()),
              naive.moves2,
              naive.moves3);
          num randomEval = randomSolution.score(startPods);
          //stderr.writeln("${pool.length} $poolSize Random eval $randomEval");
          pool[randomEval] = randomSolution;
      }
      
      stderr.writeln("Filled pool ${pool.length} ${sw.elapsedMilliseconds}");
      stderr.writeln("Pool first ${pool.keys.first} last ${pool.keys.last}");
      
      while(sw.elapsedMilliseconds < timeout){
          // stderr.writeln("Creating GAs ${sw.elapsedMilliseconds}");
          //TODO generate new solution with mutation and crossover
              
          Solution mutatedSolution = pool[pool.keys.toList()[rand.nextInt(pool.length)]].clone();
          mutatedSolution.mutate();
          
          num geneticEval = mutatedSolution.score(startPods);
          if( geneticEval > pool.keys.first && !pool.containsKey(geneticEval)){
  
negative.code:             pool.remove(pool.keys.first);
          }
      }
      stderr.writeln("End Pool first ${pool.keys.first} last ${pool.keys.last}");
     
      return pool[pool.keys.last];
      
  