public static string GetBrigadeFormationString(PhlebotomistRepository phlebotomistRepository, BrigadeFormation formation) { StringBuilder output = new StringBuilder(); var rows = phlebotomistRepository.Context.BrigadeFormationVerticalPositionTypes.OrderByDescending(x => x.DamageDealtModifier); output.AppendLine(string.Format("Brigade Formation: {0}", formation.Name)); foreach (var row in rows) { // using the assumption that HorizontalPositionTypeId increases from left to right foreach (var horizontalPosition in formation.Positions.OrderBy(x => x.HorizontalPositionTypeId)) { if (horizontalPosition.VerticalPositionTypes.Id == row.Id) { output.Append("*"); } else { output.Append(" "); } } output.AppendLine(); } return(output.ToString()); }
static string GetBrigadeFormationsString(PhlebotomistRepository phlebotomistRepository, IQueryable <BrigadeFormation> formations) { StringBuilder output = new StringBuilder(); foreach (var brigadeFormation in formations) { output.Append(GetBrigadeFormationString(phlebotomistRepository, brigadeFormation)); } return(output.ToString()); }
static List <FamiliarWinPercent> ReadInputFile(PhlebotomistRepository phlebotomistRepository, string fileName) { int maxFamiliars = 10; var winPercents = new List <FamiliarWinPercent>(); using (var streamReader = new StreamReader(_inputFileName)) { while (!streamReader.EndOfStream && winPercents.Count < maxFamiliars) { var line = streamReader.ReadLine(); var columns = line.Split(','); int result; if (winPercents.Count == 0 && columns.All(x => !int.TryParse(x, out result))) { System.Console.WriteLine("Assuming initial line contains headers: '{0}'", line); continue; } if (columns.Length != 4) { throw new InvalidOperationException( string.Format("Row does not contain exactly four columns of data: '{0}'", line)); } foreach (var column in columns) { System.Console.Write("'{0}'\t", column); } System.Console.WriteLine(); var familiarWinPercent = new FamiliarWinPercent { FamiliarName = columns[0] }; int nextInputFileColumn = 1; foreach (var verticalPosition in phlebotomistRepository.Context.BrigadeFormationVerticalPositionTypes .OrderByDescending(x => x.DamageDealtModifier)) { familiarWinPercent.WinPercents[verticalPosition] = int.Parse(columns[nextInputFileColumn]); nextInputFileColumn++; } winPercents.Add(familiarWinPercent); } } return(winPercents); }
public BrigadeFormationWithFamiliars(PhlebotomistRepository phlebotomistRepository, bool includeReserve = true) { PhlebotomistRepository = phlebotomistRepository; IncludeReserve = includeReserve; FamiliarsInPositions = new Dictionary <BrigadeFormationVerticalPositionType, List <FamiliarWinPercent> >(); MaxFamiliarsInPositions = new Dictionary <BrigadeFormationVerticalPositionType, int>(); // Initialize each potential index in the dictionaries. foreach (var verticalPosition in phlebotomistRepository.Context.BrigadeFormationVerticalPositionTypes) { FamiliarsInPositions[verticalPosition] = new List <FamiliarWinPercent>(); MaxFamiliarsInPositions[verticalPosition] = 0; } }
static IEnumerable <BrigadeFormationWithFamiliars> GetBrigadeFormationPermutations( PhlebotomistRepository phlebotomistRepository, List <FamiliarWinPercent> familiarWinPercents, BrigadeFormation formation, bool includeReserve) { if (formation == null) { throw new ArgumentNullException("formation", "The BrigadeFormation argument can not be null!"); } var currentBrigadeInstace = new BrigadeFormationWithFamiliars(phlebotomistRepository, includeReserve); currentBrigadeInstace.Formation = formation; foreach (var brigadeFormation in GetBrigadeFormationPermutations(phlebotomistRepository, familiarWinPercents, currentBrigadeInstace, includeReserve)) { yield return(brigadeFormation); } }
public static IEnumerable <BrigadeFormationWithFamiliars> GetBrigadeFormationPermutations( PhlebotomistRepository phlebotomistRepository, List <FamiliarWinPercent> familiarWinPercents, BrigadeFormationWithFamiliars currentFormation, bool includeReserve) { // Either no more familiars left to place or we've placed everyone already. if (familiarWinPercents.Count == 0 || currentFormation.NumFamiliarsInPosition == (currentFormation.Formation.NumPositions * (currentFormation.IncludeReserve ? 2 : 1))) { yield return(currentFormation); } // First place all familiars in the non-reserve positions (that is, make sure at least // currentFormation.Formation.NumPositions familiars have been placed). else if (currentFormation.NumFamiliarsInPosition < currentFormation.Formation.NumPositions) { bool forReserve = false; var positionsWithOpenSlots = new List <BrigadeFormationVerticalPositionType>(); foreach (var verticalPosition in phlebotomistRepository.Context.BrigadeFormationVerticalPositionTypes) { if (currentFormation.HasOpenSlotsInPosition(verticalPosition, forReserve)) { positionsWithOpenSlots.Add(verticalPosition); } } var nextFamiliar = familiarWinPercents[0]; foreach (var verticalPosition in positionsWithOpenSlots) { BrigadeFormationWithFamiliars nextFormation = new BrigadeFormationWithFamiliars(currentFormation); var remainingFamiliars = new List <FamiliarWinPercent>(familiarWinPercents); remainingFamiliars.RemoveAt(0); nextFormation.FamiliarsInPositions[verticalPosition].Add(nextFamiliar); foreach (var permutation in GetBrigadeFormationPermutations(phlebotomistRepository, remainingFamiliars, nextFormation, includeReserve)) { yield return(permutation); } } } // Then place a reserve familiar if we are including reserves. else if (includeReserve) { bool placingReserveFamiliar = true; var positionsWithOpenSlots = new List <BrigadeFormationVerticalPositionType>(); foreach (var verticalPosition in phlebotomistRepository.Context.BrigadeFormationVerticalPositionTypes) { if (currentFormation.HasOpenSlotsInPosition(verticalPosition, placingReserveFamiliar)) { positionsWithOpenSlots.Add(verticalPosition); } } var nextFamiliar = familiarWinPercents[0]; foreach (var verticalPosition in positionsWithOpenSlots) { BrigadeFormationWithFamiliars nextFormation = new BrigadeFormationWithFamiliars(currentFormation); var remainingFamiliars = new List <FamiliarWinPercent>(familiarWinPercents); remainingFamiliars.RemoveAt(0); nextFormation.FamiliarsInPositions[verticalPosition].Add(nextFamiliar); foreach (var permutation in GetBrigadeFormationPermutations(phlebotomistRepository, remainingFamiliars, nextFormation, includeReserve)) { yield return(permutation); } } } }