/// <summary>
        /// Metoda zwraca możliwą minimalną i maksymalną wartość prędkości samochodu w trakcie całego okresu trwania podróży.
        /// </summary>
        /// <param name="measurements">Tablica zawierające wartości pomiarów urządzenia zainstalowanego w aucie Mateusza</param>
        /// <param name="isBrakingValue">W tej wersji algorytmu proszę ustawić parametr na null</param>
        /// <returns>Struktura Velocities z informacjami o najniższej i najwyższej możliwej prędkości na trasie</returns>
        ///
        /// <remarks>
        /// Złożoność pamięciowa algorytmu powinna być nie większa niż O(sumy_wartości_pomiarów).
        /// Złożoność czasowa algorytmu powinna być nie większa niż O(liczby_pomiarów * sumy_wartości_pomiarów).
        /// </remarks>
        public static Velocities JourneyVelocities(int[] measurements, out bool[] isBrakingValue)
        {
            isBrakingValue = null;  // Nie zmieniać !!!

            // Uzupełnić
            int sum = measurements.Aggregate(0, (total, x) => total += x);

            if (0 == sum)
            {
                return(new Velocities(0, 0));
            }

            bool[] tmpBool;
            var    tmpMeasurements = new Queue <int[]>();

            for (int i = 0; i < measurements.Length; i++)
            {
                int[] subset = new int[i + 1];
                Array.Copy(measurements, subset, i + 1);    //TODO: length can cause problems
                tmpMeasurements.Enqueue(subset);
            }

            Velocities[] velocities = new Velocities[measurements.Length];

            for (int i = 0; i < velocities.Length; i++)
            {
                velocities[i] = FinalVelocities(tmpMeasurements.Dequeue(), out tmpBool);
            }

            int minVal = Int32.MaxValue;

            for (int i = 0; i < velocities.Length; i++)
            {
                if (minVal > velocities[i].minVelocity)
                {
                    minVal = velocities[i].minVelocity;
                }
            }

            return(new Velocities(minVal, sum));
        }
Exemple #2
0
 public override void PerformTestCase()
 {
     result = testedFunction(measurements, out isBraking);
 }
Exemple #3
0
        static void Main()
        {
            TestSet finalVelocitiesTests = new TestSet();

            finalVelocitiesTests.TestCases.Add(new VelocityMeasurementsTestCase(5, VelocityMeasurements.FinalVelocities, new int[] { 0 }, 0, 0));
            finalVelocitiesTests.TestCases.Add(new VelocityMeasurementsTestCase(5, VelocityMeasurements.FinalVelocities, new int[] { 10 }, 10, 10));
            finalVelocitiesTests.TestCases.Add(new VelocityMeasurementsTestCase(5, VelocityMeasurements.FinalVelocities, new int[] { 10, 3, 5, 4 }, 2, 22));
            finalVelocitiesTests.TestCases.Add(new VelocityMeasurementsTestCase(5, VelocityMeasurements.FinalVelocities, new int[] { 4, 11, 5, 5, 5 }, 0, 30));
            finalVelocitiesTests.TestCases.Add(new VelocityMeasurementsTestCase(5, VelocityMeasurements.FinalVelocities, new int[] { 10, 10, 5, 3, 1 }, 1, 29));
            finalVelocitiesTests.TestCases.Add(new VelocityMeasurementsTestCase(5, VelocityMeasurements.FinalVelocities, new int[] { 10, 10, 5, 3, 1, 9, 24, 3, 4, 19, 18, 7, 7, 8, 10, 5 }, 1, 143));
            finalVelocitiesTests.TestCases.Add(new VelocityMeasurementsTestCase(5, VelocityMeasurements.FinalVelocities, new int[] { 7, 10, 2, 18, 4, 6, 6 }, 1, 53));
            finalVelocitiesTests.TestCases.Add(new VelocityMeasurementsTestCase(5, VelocityMeasurements.FinalVelocities, GenerateTestArray(20, 1024), 1, 1101));
            finalVelocitiesTests.TestCases.Add(new VelocityMeasurementsTestCase(5, VelocityMeasurements.FinalVelocities, GenerateTestArray(100, 1024), 0, 4650));
            finalVelocitiesTests.TestCases.Add(new VelocityMeasurementsTestCase(5, VelocityMeasurements.FinalVelocities, GenerateTestArray(100, 123424), 1, 5337));
            finalVelocitiesTests.TestCases.Add(new VelocityMeasurementsTestCase(5, VelocityMeasurements.FinalVelocities, GenerateTestArray(1000, 123424), 1, 49209));

            Console.WriteLine("\nFinal velocities tests");
            finalVelocitiesTests.PreformTests(verbose: true, checkTimeLimit: false);


            TestSet journeyVelocitiesTests = new TestSet();

            journeyVelocitiesTests.TestCases.Add(new VelocityMeasurementsTestCase(5, VelocityMeasurements.JourneyVelocities, new int[] { 10 }, 10, 10, true));
            journeyVelocitiesTests.TestCases.Add(new VelocityMeasurementsTestCase(5, VelocityMeasurements.JourneyVelocities, new int[] { 10, 1, 1, 1 }, 7, 13, true));
            journeyVelocitiesTests.TestCases.Add(new VelocityMeasurementsTestCase(5, VelocityMeasurements.JourneyVelocities, new int[] { 10, 3, 5, 4 }, 2, 22, true));
            journeyVelocitiesTests.TestCases.Add(new VelocityMeasurementsTestCase(5, VelocityMeasurements.JourneyVelocities, new int[] { 4, 11, 5, 5, 5 }, 0, 30, true));
            journeyVelocitiesTests.TestCases.Add(new VelocityMeasurementsTestCase(5, VelocityMeasurements.JourneyVelocities, new int[] { 10, 10, 5, 3, 1 }, 0, 29, true));
            journeyVelocitiesTests.TestCases.Add(new VelocityMeasurementsTestCase(5, VelocityMeasurements.JourneyVelocities, new int[] { 5, 5, 10, 23, 45, 2, 1, 23, 9, 0, 8, 4, 1, 24, 86, 5, 6, 100, 353, 4, 5, 67, 32, 45, 23, 34, 56, 32, 23 }, 0, 1031, true));
            journeyVelocitiesTests.TestCases.Add(new VelocityMeasurementsTestCase(5, VelocityMeasurements.JourneyVelocities, GenerateTestArray(20, 1024), 0, 1101, true));
            journeyVelocitiesTests.TestCases.Add(new VelocityMeasurementsTestCase(5, VelocityMeasurements.JourneyVelocities, GenerateTestArray(100, 1024), 0, 4650, true));
            journeyVelocitiesTests.TestCases.Add(new VelocityMeasurementsTestCase(5, VelocityMeasurements.JourneyVelocities, GenerateTestArray(100, 123424), 0, 5337, true));
            journeyVelocitiesTests.TestCases.Add(new VelocityMeasurementsTestCase(5, VelocityMeasurements.JourneyVelocities, GenerateTestArray(1000, 123424), 0, 49209, true));
            int[] x = { 2, 2 }, y = GenerateTestArray(1000, 123424), z = new int[x.Length + y.Length];
            x.CopyTo(z, 0);
            y.CopyTo(z, x.Length);
            journeyVelocitiesTests.TestCases.Add(new VelocityMeasurementsTestCase(5, VelocityMeasurements.JourneyVelocities, z, 0, 49213, true));



            Console.WriteLine("\nJourney velocities tests");
            journeyVelocitiesTests.PreformTests(verbose: true, checkTimeLimit: false);

            //Custom Tests by G.Rozdzialik:
            Console.WriteLine("Custom tests");

            int[] testMeasurementsCounts = new int[] { 5, 100, 150, 200, 300, 400, 500, 1500, 4000 };
            int[] seeds = new int[] { 123456, 1000, 123456, 123456, 123456, 123456, 123456, 123456, 123456 };

            Stopwatch stopwatch = new Stopwatch();

            for (int i = 0; i < testMeasurementsCounts.Length; i++)
            {
                int[]  measurements = GenerateTestArray(testMeasurementsCounts[i], seeds[i]);
                bool[] isBrakingValue;

                stopwatch.Restart();
                Velocities velocities = VelocityMeasurements.FinalVelocities(measurements, out isBrakingValue);
                stopwatch.Stop();

                Console.WriteLine("Custom test {0,-1}:", i + 1, velocities.minVelocity, velocities.maxVelocity);
                Console.WriteLine("  min = {0}", velocities.minVelocity);
                Console.WriteLine("  max = {0}", velocities.maxVelocity);

                VelocityMeasurementsTestCase testCase = new VelocityMeasurementsTestCase(2, VelocityMeasurements.FinalVelocities,
                                                                                         measurements, velocities.minVelocity, velocities.maxVelocity);

                if (testCase.CustomIsBrakingArrayCorrect(isBrakingValue))
                {
                    Console.WriteLine("  isBrakingValue correct");
                }
                else
                {
                    Console.WriteLine("  isBrakingValue INVALID");
                }
                Console.WriteLine("  time elapsed = {0,5} ms", stopwatch.ElapsedMilliseconds);
                Console.WriteLine(String.Empty);
            }
            //------------------------------------------------------------------------
        }