public void Test() { string word = "blue hades"; var problemnum = 2; int unitIndex = 2; int seedIndex = 5; var problem = ProblemsSet.GetProblem(problemnum); var originalUnit = problem.units[unitIndex]; var prefix = new List<MoveType>(); var spawnedUnit = Game.SpawnUnit(originalUnit, problem).Move(MoveType.SE).Move(MoveType.SW); var unit = spawnedUnit; var units = new List<Unit> { unit }; foreach (var c in word) { var moveType = MoveTypeExt.Convert(c); unit = unit.Move(moveType.Value); units.Add(unit); } var minX = units.SelectMany(x => x.members).Min(t => t.x); while (minX < 0) { prefix.Add(MoveType.E); minX++; } while (minX > 0) { prefix.Add(MoveType.W); minX--; } prefix.Add(MoveType.SE); prefix.Add(MoveType.SW); var game = new SolverGame(problem, problem.sourceSeeds[seedIndex], new string[0]); game.Step(); var danananananananananananananan = "danananananananananananananan"; game.ApplyUnitSolution(danananananananananananananan); if (game.state != GameBase.State.End && game.state != GameBase.State.WaitUnit) throw new InvalidOperationException(string.Format("Invalid game state: {0}", game.state)); game.Step(); Assert.That(game.spawnedUnitIndex, Is.EqualTo(unitIndex)); var staticPowerPhraseBuilder = new StaticPowerPhraseBuilder(); var solution = staticPowerPhraseBuilder.Build(prefix) + word; Console.Out.WriteLine(danananananananananananananan + solution); game.ApplyUnitSolution(solution); var output = new Output { problemId = problemnum, seed = problem.sourceSeeds[seedIndex], solution = danananananananananananananan + solution }; }
public string Solve(Problem problem, int seed, string[] powerPhrases) { var finalPowerPhraseBuilder = new SimplePowerPhraseBuilder(powerPhrases); var spelledPhrases = new bool[powerPhrases.Length]; var solution = new List<MoveType>(); var game = new SolverGame(problem, seed, powerPhrases); while (true) { switch (game.state) { case GameBase.State.WaitUnit: game.Step(); break; case GameBase.State.UnitInGame: var reachablePositions = new ReachablePositionsWithWords(game.map, powerPhrases, spelledPhrases); var evaluatePositions = new EvaluatePositions2(game.map); var endPositions = reachablePositions.EndPositions(game.currentUnit); var estimated = new Dictionary<Unit, double>(); var bestPosition = endPositions.ArgMax(p => { double value; if (estimated.TryGetValue(p.Item1, out value)) return value; return estimated[p.Item1] = evaluatePositions.Evaluate(p.Item1); }); var score = evaluatePositions.Evaluate(bestPosition.Item1); var wayToBestPosition = bestPosition.Item2; var unitSolution = staticPowerPhraseBuilder.Build(wayToBestPosition.path); SolutionAdded(game, unitSolution); game.ApplyUnitSolution(unitSolution); spelledPhrases = wayToBestPosition.spelledWords; solution.AddRange(wayToBestPosition.path); break; case GameBase.State.EndInvalidCommand: case GameBase.State.EndPositionRepeated: throw new InvalidOperationException(string.Format("Invalid state: {0}", game.state)); case GameBase.State.End: return finalPowerPhraseBuilder.Build(solution); default: throw new ArgumentOutOfRangeException(); } } }
public override string Solve(Problem problem, int seed, string[] powerPhrases) { var finalPowerPhraseBuilder = new SimplePowerPhraseBuilder(powerPhrases); var spelledPhrases = new bool[powerPhrases.Length]; var solution = new List<MoveType>(); var game = new SolverGame(problem, seed, powerPhrases); while (true) { switch (game.state) { case GameBase.State.WaitUnit: game.Step(); break; case GameBase.State.UnitInGame: if (nextUnitsPositions == null || !nextUnitsPositions.Any()) { var bestPositions = FindBestPositions_Recursive(unitsAhead, game.map.Clone(), new[] { game.currentUnit }.Concat(game.GetAllRestUnits()).ToArray(), 0, powerPhrases, spelledPhrases); nextUnitsPositions = bestPositions.Item2.ToList(); } var wayToBestPosition = nextUnitsPositions.First(); nextUnitsPositions = nextUnitsPositions.Skip(1).ToList(); var unitSolution = staticPowerPhraseBuilder.Build(wayToBestPosition.Item2.path); CallEvent(game, unitSolution); game.ApplyUnitSolution(unitSolution); solution.AddRange(wayToBestPosition.Item2.path); spelledPhrases = wayToBestPosition.Item2.spelledWords; break; case GameBase.State.EndInvalidCommand: case GameBase.State.EndPositionRepeated: throw new InvalidOperationException(string.Format("Invalid state: {0}", game.state)); case GameBase.State.End: return finalPowerPhraseBuilder.Build(solution); default: throw new ArgumentOutOfRangeException(); } } }