Nathan Craddock avatar Nathan Craddock committed f109ffa

Added a test base to assert that all tests take less than 1 minute to run. Redid Problem3. Runs fast now

Comments (0)

Files changed (12)

 *.lib
 *.sbr
 *.scc
+*.crunchsolution.cache
+*.crunchproject.local
+*.crunchsolution.local.xml
+*.crunchproject.local.xml
 [Bb]in
 [Dd]ebug*/
 obj/
 [Bb]uild[Ll]og.*
 *.[Pp]ublish.xml
 Uploads/
-App_Data/
+App_Data/

NKC.ProjectEuler.Tests/Level1/Problem1.cs

 namespace NKC.ProjectEuler.Tests.Problem1
 {
     [TestClass]
-    public class Problem1Test
+    public class Problem1Test : ProjectEulerTestBase
     {
         [TestMethod]
         public void SumOfAllMultiplesOf3Or5Below1000()

NKC.ProjectEuler.Tests/Level1/Problem2.cs

 namespace NKC.ProjectEuler.Tests.Problem2
 {
     [TestClass]
-    public class Problem2Test
+    public class Problem2Test : ProjectEulerTestBase
     {
         [TestMethod]
         public void SumOfEvenValuedFibonacciTermsUnder4Million()

NKC.ProjectEuler.Tests/Level1/Problem3.cs

 namespace NKC.ProjectEuler.Tests.Problem3
 {
     [TestClass]
-    public class Problem3Test
+    public class Problem3Test : ProjectEulerTestBase
     {
         [TestMethod]
         public void Solve()
         {
             const long NUMBER_TO_CHECK = 600851475143;
-            var solver = new Problem3Solver();
-            long[] primes = solver.FindPrimesUpTo(NUMBER_TO_CHECK);
-            long[] primeFactors = solver.FindFactorsInList(NUMBER_TO_CHECK, primes);
-            Console.WriteLine("Largest prime factor: " + primeFactors[primeFactors.Length - 1]);
-        }
-    }
-
-    public class Problem3Solver
-    {
-        public long[] FindFactorsInList(long value, long[] possibleFactors)
-        {
-            var factors = new List<long>();
-
-            foreach (long possible in possibleFactors)
-                if (value % possible == 0)
-                    factors.Add(possible);
-
-            return factors.ToArray();
+            long answer = FindLargestPrimeFactorOf(NUMBER_TO_CHECK);
         }
 
-        public long[] FindPrimesUpTo(long x)
+        private long FindLargestPrimeFactorOf(long value)
         {
-            var primes = new List<long>();
-
-            for (long i = 0; i <= (long)Math.Sqrt(x); i++)
+            for (long i = 3; i < Math.Sqrt(value); i += 2)
             {
-                long value = i + 2;
-                if (!IsMultipleOf(value, primes))
-                    primes.Add(value);
+                if (value % i == 0)
+                {
+                    value /= i;
+                    i = 3;
+                }
             }
 
-            return primes.ToArray();
-        }
-
-        private bool IsMultipleOf(long value, IList<long> primes)
-        {
-            foreach (long p in primes)
-                if (value % p == 0) return true;
-            return false;
+            return value;
         }
     }
 }

NKC.ProjectEuler.Tests/Level1/Problem4.cs

 namespace NKC.ProjectEuler.Tests.Problem4
 {
     [TestClass]
-    public class Problem4Test
+    public class Problem4Test : ProjectEulerTestBase
     {
         [TestMethod]
         public void Solve()

NKC.ProjectEuler.Tests/Level1/Problem5.cs

 namespace NKC.ProjectEuler.Tests.Problem5
 {
     [TestClass]
-    public class Problem5Test
+    public class Problem5Test : ProjectEulerTestBase
     {
         int[] FactorsToCheck = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
 

NKC.ProjectEuler.Tests/Level1/Problem6.cs

 namespace NKC.ProjectEuler.Tests.Level1
 {
     [TestClass]
-    public class Problem6
+    public class Problem6 : ProjectEulerTestBase
     {
         [TestMethod]
         public void Solve()

NKC.ProjectEuler.Tests/Level1/Problem7.cs

 namespace NKC.ProjectEuler.Tests.Level1
 {
     [TestClass]
-    public class Problem7
+    public class Problem7 : ProjectEulerTestBase
     {
         [TestMethod]
         public void Solve()
                         return i;
                     AddAllMultiplesUpToN(nonPrimes, i, UPPER_LIMIT);
                 }
-
             }
 
             return 0;

NKC.ProjectEuler.Tests/Level1/Problem8.cs

 namespace NKC.ProjectEuler.Tests.Level1
 {
     [TestClass]
-    public class Problem8
+    public class Problem8 : ProjectEulerTestBase
     {
         const string THE_BIG_NUMBER = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";
         const int CONSECUTIVE_DIGITS = 5;

NKC.ProjectEuler.Tests/Level1/Problem9.cs

 namespace NKC.ProjectEuler.Tests.Level1
 {
     [TestClass]
-    public class Problem9
+    public class Problem9 : ProjectEulerTestBase
     {
         [TestMethod]
         public void Solve()

NKC.ProjectEuler.Tests/NKC.ProjectEuler.Tests.csproj

     <Compile Include="Level1\Problem7.cs" />
     <Compile Include="Level1\Problem8.cs" />
     <Compile Include="Level1\Problem9.cs" />
+    <Compile Include="ProjectEulerTestBase.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 

NKC.ProjectEuler.Tests/ProjectEulerTestBase.cs

+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using System.Diagnostics;
+
+namespace NKC.ProjectEuler.Tests
+{
+    [TestClass]
+    public class ProjectEulerTestBase
+    {
+        private const long MAXIMUM_MILLISECONDS = 60000;
+        private const string TOO_LONG_MESSAGE = "Test took more than 1 minute. That counts as losing";
+        private Stopwatch _stopwatch;
+
+        [TestInitialize]
+        public void Setup()
+        {
+            _stopwatch = new Stopwatch();
+            _stopwatch.Start();
+        }
+
+        [TestCleanup]
+        public void Teardown()
+        {
+            _stopwatch.Stop();
+            Assert.IsTrue(_stopwatch.ElapsedMilliseconds < MAXIMUM_MILLISECONDS, TOO_LONG_MESSAGE);
+        }
+    }    
+}
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.