/// <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)); }
public override void PerformTestCase() { result = testedFunction(measurements, out isBraking); }
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); } //------------------------------------------------------------------------ }