diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..496ee2c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store \ No newline at end of file diff --git a/euler.rb b/euler.rb index f61fde2..5ecb019 100644 --- a/euler.rb +++ b/euler.rb @@ -6,14 +6,18 @@ class Integer end def divisors - divisors = [] - (1..Math.sqrt(self).to_i).each do |num| - if self % num == 0 - divisors << num - divisors << self / num + [].tap do |divisors| + (1..Math.sqrt(self).to_i).each do |num| + if self % num == 0 + divisors << num + divisors << self / num + end end end - divisors + end + + def prime_factors + self.prime_division.map(&:first) end def factorial diff --git a/euler001.rb b/euler001.rb index 6b02231..f06584e 100644 --- a/euler001.rb +++ b/euler001.rb @@ -1,9 +1,7 @@ def multiples_of_three_and_five_below(n) - multiples = [] - (3..n-1).each do |i| - multiples << i if ((i % 3 == 0) || (i % 5 == 0)) - end - multiples + (3..n-1).select { |i| (i % 3 == 0) || (i % 5 == 0) } end -puts multiples_of_three_and_five_below(1000).inject(:+) +def solution + multiples_of_three_and_five_below(1000).inject(:+) +end diff --git a/euler002.rb b/euler002.rb index c4f1253..9d66d54 100644 --- a/euler002.rb +++ b/euler002.rb @@ -1,30 +1,16 @@ -def fibonacci(n) - fibTable = [] - if (n == 0) or (n == 1) - return 1 - else - if fibTable.at(n-1) == nil - fibTable.insert(n-1, fibonacci(n-1)) - fib1 = fibTable.at(n-1) - else - fib1 = fibTable.at(n-1) +def even_fibonacci_up_to(n) + Enumerator.new do |y| + a = 0 + b = 1 + loop do + temp = b + b = a + b + a = temp + y << b end - if fibTable.at(n-2) == nil - fibTable.insert(n-2, fibonacci(n-2)) - fib2 = fibTable.at(n-2) - else - fib2 = fibTable.at(n-2) - end - return fib1 + fib2 - end + end.take_while { |i| i < n }.select { |i| i.even? } end -sum = 0 -for i in 1..32 - fib = fibonacci(i) - if (fib%2) == 0 - sum += fib - end +def solution + even_fibonacci_up_to(4000000).inject(:+) end - -puts sum diff --git a/euler003.rb b/euler003.rb index 51ac37f..834e177 100644 --- a/euler003.rb +++ b/euler003.rb @@ -1,38 +1,5 @@ -def sieve(n) - eSieve = (2..n).to_a - i = 0 - pbar = ProgressBar.new("sieving", n) - while i < Math.sqrt(n) - j = i + 1 - while (j < eSieve.length) - if (eSieve[j] > (i ** 2)) and ((eSieve[j] % eSieve[i]) == 0) - eSieve.delete_at j - pbar.inc - end - j += 1 - end - i += 1 - pbar.set(i + (n-eSieve.length)) - end - pbar.finish - eSieve +require_relative 'euler' + +def solution + 600851475143.prime_factors.max end - -eSieve = sieve(600851475143) - -def isPrime(n) - eSieve.contains(n) -end - -puts isPrime(7) - -factors = [] -for i in 1..600851475143 - if (600851475143 % i) == 0 - if isPrime(600851475143 % i) - factors << i - end - end -end - - diff --git a/euler004.rb b/euler004.rb index 2d7d5fe..a22d0f3 100644 --- a/euler004.rb +++ b/euler004.rb @@ -1,13 +1,13 @@ require_relative 'euler' def products_of_three_digits - products = [] - (100..999).each do |i| - (100..999).each do |j| - products << i*j + [].tap do |products| + (100..999).each do |i| + (100..999).each do |j| + products << i*j + end end end - products end def solution diff --git a/euler005.rb b/euler005.rb index a53732a..2a0ca51 100644 --- a/euler005.rb +++ b/euler005.rb @@ -1,22 +1,17 @@ require_relative 'euler' -require 'prime' def factorization_of_integer_divisible_by_all_integers_up_to(n) {}.tap do |factorization| (2..n).map do |i| - Prime.prime_division(i).map do |factor| - factorization[factor.first] = factor.last if (!factorization.include?(factor.first) || (factor.last > factorization[factor.first])) + Prime.prime_division(i).map do |prime, exponent| + factorization[prime] = exponent if (!factorization.include?(prime) || (exponent > factorization[prime])) end end end end def factors_to_int(factorization) - [].tap do |result| - factorization.each do |prime, exponent| - result << prime ** exponent - end - end.inject(:*) + factorization.map { |prime, exponent| prime ** exponent }.inject(:*) end def solution diff --git a/euler006.rb b/euler006.rb index e1f7d1a..d299fe5 100644 --- a/euler006.rb +++ b/euler006.rb @@ -6,10 +6,6 @@ def square_sums(n) (1..n).map { |i| i ** 2 }.inject(:+) end -def difference(n) - sum_squared(n) - square_sums(n) -end - def solution - difference(100) + sum_squared(100) - square_sums(100) end diff --git a/euler008.rb b/euler008.rb index 7754ea6..ea65bd3 100644 --- a/euler008.rb +++ b/euler008.rb @@ -1,7 +1,7 @@ require_relative 'euler' def largest_consecutive_product(n, adjacent) - n.to_digit_list.each_cons(adjacent).map { |x| x.inject(&:*) }.max + n.to_digit_list.each_cons(adjacent).map { |x| x.inject(:*) }.max end def solution diff --git a/euler016.rb b/euler016.rb index 6b1d2d6..7e8bfd5 100644 --- a/euler016.rb +++ b/euler016.rb @@ -1 +1,5 @@ -puts (2**1000).to_s.split("").map(&:to_i).inject(:+) +require_relative 'euler' + +def solution + (2**1000).to_digit_list.inject(:+) +end