fixed some old code + added solutions for new problems
parent
6947402ff4
commit
3c91e1fb8f
|
@ -0,0 +1,9 @@
|
||||||
|
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
|
||||||
|
end
|
||||||
|
|
||||||
|
puts multiples_of_three_and_five_below(1000).inject(:+)
|
|
@ -0,0 +1,16 @@
|
||||||
|
def factorial(n)
|
||||||
|
i = 1
|
||||||
|
while (n > 0)
|
||||||
|
i *= n
|
||||||
|
n -= 1
|
||||||
|
end
|
||||||
|
i
|
||||||
|
end
|
||||||
|
|
||||||
|
def combination(n, k)
|
||||||
|
factorial(n) / (factorial(k) * factorial(n-k))
|
||||||
|
end
|
||||||
|
|
||||||
|
def lattice_paths(size)
|
||||||
|
combination(2*size, size)
|
||||||
|
end
|
|
@ -0,0 +1,29 @@
|
||||||
|
def gcd(a, b)
|
||||||
|
b == 0 ? a : gcd(b, a % b)
|
||||||
|
end
|
||||||
|
|
||||||
|
def is_relatively_prime?(a, b)
|
||||||
|
gcd(a, b) == 1
|
||||||
|
end
|
||||||
|
|
||||||
|
def multiplicative_order_of_ten(n)
|
||||||
|
return nil unless is_relatively_prime?(10, n)
|
||||||
|
(2..n-1).each do |i|
|
||||||
|
return i if 10**i % n == 1
|
||||||
|
end
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def longest_repeating_decimal
|
||||||
|
highest_order = 0
|
||||||
|
highest_order_n = 0
|
||||||
|
(1..1000).each do |n|
|
||||||
|
order = multiplicative_order_of_ten(n)
|
||||||
|
next if order.nil?
|
||||||
|
if highest_order < order
|
||||||
|
highest_order = order
|
||||||
|
highest_order_n = n
|
||||||
|
end
|
||||||
|
end
|
||||||
|
highest_order_n
|
||||||
|
end
|
|
@ -0,0 +1,17 @@
|
||||||
|
def spiral(size)
|
||||||
|
max_value = size**2
|
||||||
|
|
||||||
|
diagonals = [1]
|
||||||
|
diagonal_increase_value = 2
|
||||||
|
current_num = 1
|
||||||
|
|
||||||
|
until current_num == max_value
|
||||||
|
4.times do
|
||||||
|
current_num += diagonal_increase_value
|
||||||
|
diagonals << current_num
|
||||||
|
end
|
||||||
|
diagonal_increase_value += 2
|
||||||
|
end
|
||||||
|
|
||||||
|
diagonals.inject(:+)
|
||||||
|
end
|
18
euler031.rb
18
euler031.rb
|
@ -1,18 +1,20 @@
|
||||||
def change(n, list_of_coins)
|
def change(n, list_of_coins)
|
||||||
changeHelper(n, list_of_coins, [])
|
change_helper(n, list_of_coins, [])
|
||||||
end
|
end
|
||||||
|
|
||||||
def changeHelper(n, list_of_coins, result_list)
|
def change_helper(n, list_of_coins, result_list)
|
||||||
if list_of_coins.empty?
|
if list_of_coins.empty?
|
||||||
[result_list]
|
return []
|
||||||
elsif n == 0
|
elsif n == 0
|
||||||
[result_list]
|
return [result_list]
|
||||||
else
|
else
|
||||||
if n >= list_of_coins.first
|
list_of_coins.each do |coin|
|
||||||
changeHelper(n - list_of_coins.first, list_of_coins, result_list << list_of_coins.first) +
|
if n < coin
|
||||||
changeHelper(n, list_of_coins[1..list_of_coins.count-1], result_list)
|
return []
|
||||||
else
|
else
|
||||||
changeHelper(n, list_of_coins[1..list_of_coins.count-1], result_list)
|
return change_helper(n - coin, list_of_coins, result_list + [coin]) + change_helper(n, list_of_coins - [coin], result_list)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
69
euler033.rb
69
euler033.rb
|
@ -1,21 +1,56 @@
|
||||||
class Integer
|
def gcd(a, b)
|
||||||
def mod_exp(exp, mod)
|
b == 0 ? a : gcd(b, a % b)
|
||||||
exp < 0 and raise ArgumentError, "negative exponent"
|
|
||||||
prod = 1
|
|
||||||
base = self % mod
|
|
||||||
until exp.zero?
|
|
||||||
exp.odd? and prod = (prod * base) % mod
|
|
||||||
exp >>= 1
|
|
||||||
base = (base * base) % mod
|
|
||||||
end
|
|
||||||
prod
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
PHI = (1 + Math.sqrt(5)) / 2
|
def generate_fractional_pairs
|
||||||
|
pairs = []
|
||||||
def fib(n)
|
(10..99).each do |i|
|
||||||
((PHI ** n - (-1 / PHI) ** n) / Math.sqrt(5)).to_i
|
(10..99).each do |j|
|
||||||
|
pairs << [i,j] if i < j
|
||||||
|
end
|
||||||
|
end
|
||||||
|
pairs
|
||||||
end
|
end
|
||||||
|
|
||||||
puts fib(8)
|
def check_weird_cancellations
|
||||||
|
solutions = []
|
||||||
|
fractions = generate_fractional_pairs
|
||||||
|
|
||||||
|
fractions.each do |fraction|
|
||||||
|
next if fraction.first % 10 == 0
|
||||||
|
num = fraction.first.to_s
|
||||||
|
den = fraction.last.to_s
|
||||||
|
|
||||||
|
if (num.include?(den[0]))
|
||||||
|
digit = num[num.index(den[0])]
|
||||||
|
new_num = num.delete(digit)
|
||||||
|
new_den = den.delete(digit)
|
||||||
|
elsif (num.include?(den[1]))
|
||||||
|
digit = num[num.index(den[1])]
|
||||||
|
new_num = num.delete(digit)
|
||||||
|
new_den = den.delete(digit)
|
||||||
|
end
|
||||||
|
|
||||||
|
solutions << [fraction.first, fraction.last] if (num.to_f / den.to_f) == (new_num.to_f / new_den.to_f)
|
||||||
|
|
||||||
|
end
|
||||||
|
solutions
|
||||||
|
end
|
||||||
|
|
||||||
|
def reduce_fraction(numerator, denominator)
|
||||||
|
until (gcd = gcd(numerator, denominator)) == 1
|
||||||
|
numerator /= gcd
|
||||||
|
denominator /= gcd
|
||||||
|
end
|
||||||
|
[numerator, denominator]
|
||||||
|
end
|
||||||
|
|
||||||
|
def multiply_fractions(fractions)
|
||||||
|
numerators = 1
|
||||||
|
denominators = 1
|
||||||
|
fractions.each do |fraction|
|
||||||
|
numerators *= fraction.first
|
||||||
|
denominators *= fraction.last
|
||||||
|
end
|
||||||
|
reduce_fraction(numerators, denominators)
|
||||||
|
end
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
def factorial(n)
|
||||||
|
i = 1
|
||||||
|
while (n > 0)
|
||||||
|
i *= n
|
||||||
|
n -= 1
|
||||||
|
end
|
||||||
|
i
|
||||||
|
end
|
||||||
|
|
||||||
|
def curious_numbers(range)
|
||||||
|
solutions = []
|
||||||
|
(3..range).each do |i|
|
||||||
|
digits = i.to_s.split('').map(&:to_i)
|
||||||
|
solutions << i if digits.map { |x| factorial(x) }.inject(:+) == i
|
||||||
|
end
|
||||||
|
solutions
|
||||||
|
end
|
|
@ -0,0 +1,29 @@
|
||||||
|
require 'prime'
|
||||||
|
|
||||||
|
def primes_up_to(n)
|
||||||
|
Prime.take_while { |x| x < n }
|
||||||
|
end
|
||||||
|
|
||||||
|
def integer_rotations(n)
|
||||||
|
rotations = []
|
||||||
|
digits = n.to_s.split('')
|
||||||
|
|
||||||
|
digits.count.times do
|
||||||
|
rotations << digits.join('').to_i
|
||||||
|
digits.rotate!
|
||||||
|
end
|
||||||
|
|
||||||
|
rotations
|
||||||
|
end
|
||||||
|
|
||||||
|
def is_circular?(n)
|
||||||
|
circular = true
|
||||||
|
integer_rotations(n).each do |perm|
|
||||||
|
return false unless Prime.prime?(perm)
|
||||||
|
end
|
||||||
|
circular
|
||||||
|
end
|
||||||
|
|
||||||
|
def circular_primes_up_to(n)
|
||||||
|
primes_up_to(n).select { |x| puts x; is_circular?(x) }
|
||||||
|
end
|
|
@ -0,0 +1,11 @@
|
||||||
|
def is_palindromic_base_ten?(n)
|
||||||
|
n.to_s == n.to_s.reverse
|
||||||
|
end
|
||||||
|
|
||||||
|
def is_palindromic_base_two?(n)
|
||||||
|
n.to_s(2) == n.to_s(2).reverse
|
||||||
|
end
|
||||||
|
|
||||||
|
def palindromic_up_to(n)
|
||||||
|
(1..n).select { |i| is_palindromic_base_two?(i) && is_palindromic_base_ten?(i) }
|
||||||
|
end
|
|
@ -0,0 +1,32 @@
|
||||||
|
require 'prime'
|
||||||
|
|
||||||
|
def truncate_right(n)
|
||||||
|
n.to_s[0..-2].to_i
|
||||||
|
end
|
||||||
|
|
||||||
|
def truncate_left(n)
|
||||||
|
n.to_s[1..-1].to_i
|
||||||
|
end
|
||||||
|
|
||||||
|
def prime_truncatable_right?(n)
|
||||||
|
return false unless Prime.prime?(n)
|
||||||
|
truncated_prime = n
|
||||||
|
until (truncated_prime = truncate_right(truncated_prime)) == 0
|
||||||
|
return false unless Prime.prime?(truncated_prime)
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
def prime_truncatable_left?(n)
|
||||||
|
return false unless Prime.prime?(n)
|
||||||
|
truncated_prime = n
|
||||||
|
until (truncated_prime = truncate_left(truncated_prime)) == 0
|
||||||
|
return false unless Prime.prime?(truncated_prime)
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
def primes_truncatable_up_to(n)
|
||||||
|
(1..n).select { |i| prime_truncatable_right?(i) && prime_truncatable_left?(i) }
|
||||||
|
end
|
Loading…
Reference in New Issue