示例#1
0
        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);
        }
示例#3
0
        /// <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);
        }
示例#4
0
        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);
        }