cleans up some older solutions + new Euler module
parent
786860f59f
commit
4ba5651e9d
|
@ -0,0 +1,39 @@
|
||||||
|
require 'prime'
|
||||||
|
|
||||||
|
class Integer
|
||||||
|
def to_digit_list
|
||||||
|
self.to_s.split('').map(&:to_i)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
module Euler
|
||||||
|
|
||||||
|
class << self
|
||||||
|
|
||||||
|
def from_digit_list(list)
|
||||||
|
list.join('').to_i
|
||||||
|
end
|
||||||
|
|
||||||
|
def generate_pythagorean_triples(upper_bound)
|
||||||
|
[].tap do |triples|
|
||||||
|
(2..upper_bound).each do |a|
|
||||||
|
(a..upper_bound).each do |b|
|
||||||
|
c = Math.sqrt(a**2 + b**2)
|
||||||
|
triples << [a, b, c.to_i] if c % 1 == 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def palindrome?(n)
|
||||||
|
num = n.to_s
|
||||||
|
(0..(num.length-1)/2).each do |i|
|
||||||
|
if !(num[i] == num[num.length-1-i])
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
25
euler004.rb
25
euler004.rb
|
@ -1,28 +1,15 @@
|
||||||
def isPalindrome(n)
|
require_relative 'euler'
|
||||||
numString = n.to_s
|
|
||||||
for i in 0..(numString.length-1)/2
|
|
||||||
if !(numString[i] == numString[numString.length-1-i])
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
def productsOfThreeDigits
|
def products_of_three_digits
|
||||||
products = []
|
products = []
|
||||||
for i in 100..999
|
(100..999).each do |i|
|
||||||
for j in 100..999
|
(100..999).each do |j|
|
||||||
products << i*j
|
products << i*j
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
products
|
products
|
||||||
end
|
end
|
||||||
|
|
||||||
palindromes = []
|
def solution
|
||||||
for i in productsOfThreeDigits
|
products_of_three_digits.select { |x| Euler.palindrome?(x) }.max
|
||||||
if isPalindrome(i)
|
|
||||||
palindromes << i
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
puts palindromes.sort
|
|
||||||
|
|
34
euler005.rb
34
euler005.rb
|
@ -1,22 +1,24 @@
|
||||||
def multipleUpTo20
|
require_relative 'euler'
|
||||||
divisible = nil
|
require 'prime'
|
||||||
i = 2
|
|
||||||
while !divisible
|
def factorization_of_integer_divisible_by_all_integers_up_to(n)
|
||||||
numFound = true
|
{}.tap do |factorization|
|
||||||
puts "checking #{i}"
|
(2..n).map do |i|
|
||||||
for j in (2..20)
|
Prime.prime_division(i).map do |factor|
|
||||||
if !(i % j == 0)
|
factorization[factor.first] = factor.last if (!factorization.include?(factor.first) || (factor.last > factorization[factor.first]))
|
||||||
numFound = false
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if numFound
|
|
||||||
return i
|
|
||||||
end
|
|
||||||
i += 1
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
puts multipleUpTo20
|
def factors_to_int(factorization)
|
||||||
|
[].tap do |result|
|
||||||
|
factorization.each do |prime, exponent|
|
||||||
|
result << prime ** exponent
|
||||||
|
end
|
||||||
|
end.inject(:*)
|
||||||
|
end
|
||||||
|
|
||||||
|
def solution
|
||||||
2*3*2*5*7*2*3*11*13*2*17*19
|
factors_to_int(factorization_of_integer_divisible_by_all_integers_up_to(20))
|
||||||
|
end
|
||||||
|
|
19
euler006.rb
19
euler006.rb
|
@ -1,20 +1,15 @@
|
||||||
def sumSquared(n)
|
def sum_squared(n)
|
||||||
(1..n).inject(:+) ** 2
|
(1..n).inject(:+) ** 2
|
||||||
end
|
end
|
||||||
|
|
||||||
def squareSums(n)
|
def square_sums(n)
|
||||||
sum = 0
|
(1..n).map { |i| i ** 2 }.inject(:+)
|
||||||
for i in 1..n
|
|
||||||
sum += i ** 2
|
|
||||||
end
|
|
||||||
sum
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def difference(n)
|
def difference(n)
|
||||||
sumSquared(n) - squareSums(n)
|
sum_squared(n) - square_sums(n)
|
||||||
end
|
end
|
||||||
|
|
||||||
puts squareSums(10)
|
def solution
|
||||||
puts sumSquared(10)
|
difference(100)
|
||||||
|
end
|
||||||
puts difference(100)
|
|
||||||
|
|
34
euler007.rb
34
euler007.rb
|
@ -1,33 +1,5 @@
|
||||||
require 'progressbar'
|
require 'prime'
|
||||||
|
|
||||||
def increasingSieve(size)
|
def solution
|
||||||
startingSize = 10
|
Prime.take(10001).last
|
||||||
eSieve = []
|
|
||||||
while eSieve.length < size
|
|
||||||
eSieve = sieve(startingSize)
|
|
||||||
startingSize *= 2
|
|
||||||
end
|
|
||||||
eSieve
|
|
||||||
end
|
end
|
||||||
|
|
||||||
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
|
|
||||||
end
|
|
||||||
|
|
||||||
puts increasingSieve(10001)[10000]
|
|
||||||
|
|
30
euler008.rb
30
euler008.rb
|
@ -1,26 +1,10 @@
|
||||||
def consecutive_lists(num)
|
require_relative 'euler'
|
||||||
list_of_sub_lists = []
|
|
||||||
digit_list = num.to_s.split("")
|
def largest_consecutive_product(n, adjacent)
|
||||||
start_index = 0
|
n.to_digit_list.each_cons(adjacent).map { |x| x.inject(&:*) }.max
|
||||||
end_index = 4
|
|
||||||
while end_index < digit_list.size
|
|
||||||
list_of_sub_lists << digit_list[start_index..end_index].map(&:to_i)
|
|
||||||
start_index += 1
|
|
||||||
end_index += 1
|
|
||||||
end
|
|
||||||
list_of_sub_lists
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def consecutive_products(num)
|
def solution
|
||||||
product_list = []
|
largest_consecutive_product(7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450,
|
||||||
consecutive_lists(num).each do |list|
|
13)
|
||||||
product_list << list.inject(:*)
|
|
||||||
end
|
|
||||||
product_list
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def largest_consecutive_product(num)
|
|
||||||
consecutive_products(num).max
|
|
||||||
end
|
|
||||||
|
|
||||||
puts largest_consecutive_product(7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450)
|
|
||||||
|
|
31
euler009.rb
31
euler009.rb
|
@ -1,30 +1,5 @@
|
||||||
def generate_pythagorean_triples(upper_bound)
|
require_relative 'euler'
|
||||||
list_of_triples = []
|
|
||||||
a = 2
|
|
||||||
b = 3
|
|
||||||
while a < upper_bound
|
|
||||||
b = a + 1
|
|
||||||
while b < upper_bound
|
|
||||||
c = Math.sqrt(a**2 + b**2)
|
|
||||||
list_of_triples << [a, b, c.to_i] if c % 1 == 0 #this is a check that the sqrt is an integer
|
|
||||||
b += 1
|
|
||||||
end
|
|
||||||
a += 1
|
|
||||||
end
|
|
||||||
list_of_triples
|
|
||||||
end
|
|
||||||
|
|
||||||
def sums_of_triples(list_of_triples)
|
def solution
|
||||||
hash_of_sums = {}
|
Euler.generate_pythagorean_triples(500).find { |x| x.inject(:+) == 1000 }.inject(:*)
|
||||||
list_of_triples.each do |triple|
|
|
||||||
hash_of_sums[triple] = triple.inject(:+)
|
|
||||||
end
|
|
||||||
hash_of_sums
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def find_pythagorean_sum(upper_bound, sum_to_match)
|
|
||||||
hash_of_sums = sums_of_triples(generate_pythagorean_triples(upper_bound))
|
|
||||||
hash_of_sums.detect { |key, value| value == sum_to_match }
|
|
||||||
end
|
|
||||||
|
|
||||||
puts find_pythagorean_sum(500, 1000).first.inject(:*)
|
|
||||||
|
|
14
euler010.rb
14
euler010.rb
|
@ -1,11 +1,5 @@
|
||||||
#an implementation of the sieve of Eratosthenes
|
require_relative 'euler'
|
||||||
def improved_sieve(n)
|
|
||||||
eSieve = (2..n).to_a
|
|
||||||
(2..Math.sqrt(n)).each do |i|
|
|
||||||
next unless eSieve[i]
|
|
||||||
(i*i).step(n, i) { |j| eSieve[j] = nil } #steps by increments of i up to n starting at i*i and sets those elements to nil, marking them for removal
|
|
||||||
end
|
|
||||||
eSieve.compact
|
|
||||||
end
|
|
||||||
|
|
||||||
puts improved_sieve(2000000).inject(:+)
|
def solution
|
||||||
|
Prime.take_while { |x| x < 2000000 }.inject(:+)
|
||||||
|
end
|
||||||
|
|
Loading…
Reference in New Issue