function ProjectEuler:OnEnable() ProjectEuler:Problem001(1000) end function ProjectEuler:Problem001(upperLimit) self:Print("Sum of all numbers less than " .. upperLimit .. " that are divisible by 3 or 5") local f = function(factor) local n = math.ceil(upperLimit / factor) return n * (n-1) * factor / 2 end local result = f(3) + f(5) - f(15) self:Print(result) end

function ProjectEuler:Problem002(upperLimit) self:Print("Sum of all even numbers less than " .. upperLimit .. " in Fibonacci Sequence") local result, x1, x2 = 0, 1, 2 local f = function(t1, t2) return t2, t1+t2 end while x2 < upperLimit do self:Print("adding "..x2) result = result + x2 x1,x2 = f(f(f(x1,x2))) end self:Print(result) end

function ProjectEuler:Problem003(composite) self:Print("Largest prime factor of "..composite) local n = 2 while n < (composite / n) do if composite % n == 0 then composite = composite / n self:Print("prime factor="..n); n = 1 -- reset N to ensure primes (i.e., 2x2x3x5x5 = 300) end n=n+1 end self:Print("The largest is: "..composite) end

function ProjectEuler:Problem004() local reverse = function(a) local result = 0 while a > 0 do result = result * 10 + mod(a,10) a = floor(a/10) end return result end for n=999,900,-1 do for m=n,900,-1 do local x = n*m if x == reverse(x) then self:Print("Palindrome: "..x) return end end end end

function ProjectEuler:Problem005() local result = 1 local f = function(x) for i = 2, x do if x % i == 0 then return i, x / i end end return 1, x end for n = 20, 3, -1 do local z = n while z > 1 do pf, z = f(z) if pf == 1 then break end if result % pf == 0 then result = result / pf end end result = result * n end self:Print(result) end