public override List <PairHelper> GetDivePairs(List <Diver> divers, DiveSchedule diveSchedule) { List <PairHelper> pairList = new List <PairHelper>(); // Sort diver by depth determined by certification divers = divers.OrderBy(x => x.certificate.depth).ToList(); int start = 0; int end = divers.Count() - 1; int numOfDivers = diveSchedule.numOfDivers; while (numOfDivers > 0) { if (numOfDivers % 2 == 0) { numOfDivers -= 2; pairList.Add(new PairHelper(new List <Diver>() { divers[start++], divers[end--] }, diveSchedule.maxDepth)); } else { numOfDivers -= 3; pairList.Add(new PairHelper(new List <Diver>() { divers[start], divers[start + 1], divers[end--] }, diveSchedule.maxDepth)); start += 2; } } return(pairList); }
public override List <PairHelper> GetDivePairs(List <Diver> divers, DiveSchedule diveSchedule) { List <PairHelper> pairList = new List <PairHelper>(); int start = 0, end = divers.Count() - 1, numOfDivers = diveSchedule.numOfDivers; // Random sort divers array divers = divers.OrderBy(x => Guid.NewGuid()).ToList(); while (numOfDivers > 0) { if (numOfDivers % 2 == 0) { numOfDivers -= 2; pairList.Add(new PairHelper(new List <Diver>() { divers[start++], divers[end--] }, diveSchedule.maxDepth)); } else { numOfDivers -= 3; pairList.Add(new PairHelper(new List <Diver>() { divers[start], divers[start + 1], divers[end--] }, diveSchedule.maxDepth)); start += 2; } } return(pairList); }
/// <summary> /// Get minimum safe dive /// </summary> /// <param name="institution">Institution we're inspecting/visiting</param> /// <returns>Minimum safe dive</returns> public DiveSchedule Visit(InstitutionAbstract institution) { DiveSchedule minSafeDive = null; float minSafetyMeasure = 0; float safetyMeasurePerDive = 0; foreach (DiveSchedule dive in institution.diveSchedule) { safetyMeasurePerDive = dive.safetyMeasure / dive.diveGroups.Count(); if (safetyMeasurePerDive > minSafetyMeasure) { minSafeDive = dive; minSafetyMeasure = safetyMeasurePerDive; } } return(minSafeDive); }
public override List <PairHelper> GetDivePairs(List <Diver> diversList, DiveSchedule diveSchedule) { List <Diver> divers = new List <Diver>(diversList); List <PairHelper> pairList = new List <PairHelper>(); List <Diver> leftovers = new List <Diver>(); int numOfDivers = diveSchedule.numOfDivers; bool tripleAdded = false; // Create groups for divers who have their pair // And create list with divers who don't have their pair while (numOfDivers != 0) { int counter = 1; List <int> diverPositions = new List <int>(); string firstLvlInArr = divers[0].certificate.level; for (int i = 1; i < divers.Count(); i++) { if (firstLvlInArr == divers[i].certificate.level) { diverPositions.Add(i); counter++; } } if (numOfDivers == 3 && leftovers.Count() != 1) { numOfDivers -= 3; pairList.Add(new PairHelper(new List <Diver>() { divers[0], divers[1], divers[2] }, diveSchedule.maxDepth)); } // Odd number of divers else if (diveSchedule.numOfDivers % 2 != 0) { if (counter >= 3 && !tripleAdded) { tripleAdded = true; numOfDivers -= 3; pairList.Add(new PairHelper(new List <Diver>() { divers[0], divers[diverPositions[0]], divers[diverPositions[1]] }, diveSchedule.maxDepth)); divers.RemoveAt(0); divers.RemoveAt(diverPositions[0] - 1); divers.RemoveAt(diverPositions[1] - 2); } else if (counter >= 2) { numOfDivers -= 2; pairList.Add(new PairHelper(new List <Diver>() { divers[0], divers[diverPositions[0]] }, diveSchedule.maxDepth)); divers.RemoveAt(0); divers.RemoveAt(diverPositions[0] - 1); } else if (counter == 1) { leftovers.Add(divers[0]); divers.RemoveAt(0); numOfDivers--; } } else if (diveSchedule.numOfDivers % 2 == 0) { if (counter >= 2) { numOfDivers -= 2; pairList.Add(new PairHelper(new List <Diver>() { divers[0], divers[diverPositions[0]] }, diveSchedule.maxDepth)); divers.RemoveAt(0); divers.RemoveAt(diverPositions[0] - 1); } else if (counter == 1) { leftovers.Add(divers[0]); divers.RemoveAt(0); numOfDivers--; } } } // Create groups from leftovers :( numOfDivers = leftovers.Count(); int start = 0; while (numOfDivers > 0) { if (numOfDivers % 2 == 0) { numOfDivers -= 2; pairList.Add(new PairHelper(new List <Diver>() { leftovers[start], leftovers[start + 1] }, diveSchedule.maxDepth)); start += 2; } else if (numOfDivers % 2 != 0) { numOfDivers -= 3; pairList.Add(new PairHelper(new List <Diver>() { leftovers[start], leftovers[start + 1], leftovers[start + 2] }, diveSchedule.maxDepth)); start += 3; } } return(pairList); }
public abstract List <PairHelper> GetDivePairs(List <Diver> diver, DiveSchedule diveSchedule);
/// <summary> /// Update dive schedule list when subject transmits update /// </summary> /// <param name="subject">concrete subject</param> public override void Update(Subject subject) { DiveSchedule dive = subject.GetDive(); diveSchedule.Add(dive); }