diff --git a/euler001.rb b/euler001.rb new file mode 100644 index 0000000..6b02231 --- /dev/null +++ b/euler001.rb @@ -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(:+) diff --git a/euler015.rb b/euler015.rb new file mode 100644 index 0000000..afa59b2 --- /dev/null +++ b/euler015.rb @@ -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 diff --git a/euler026.rb b/euler026.rb new file mode 100644 index 0000000..6e9fa17 --- /dev/null +++ b/euler026.rb @@ -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 diff --git a/euler028.rb b/euler028.rb new file mode 100644 index 0000000..687cd2c --- /dev/null +++ b/euler028.rb @@ -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 diff --git a/euler031.rb b/euler031.rb index 71c120f..4d77911 100644 --- a/euler031.rb +++ b/euler031.rb @@ -1,18 +1,20 @@ def change(n, list_of_coins) - changeHelper(n, list_of_coins, []) + change_helper(n, list_of_coins, []) end -def changeHelper(n, list_of_coins, result_list) +def change_helper(n, list_of_coins, result_list) if list_of_coins.empty? - [result_list] + return [] elsif n == 0 - [result_list] + return [result_list] else - if n >= list_of_coins.first - changeHelper(n - list_of_coins.first, list_of_coins, result_list << list_of_coins.first) + - changeHelper(n, list_of_coins[1..list_of_coins.count-1], result_list) - else - changeHelper(n, list_of_coins[1..list_of_coins.count-1], result_list) + list_of_coins.each do |coin| + if n < coin + return [] + else + return change_helper(n - coin, list_of_coins, result_list + [coin]) + change_helper(n, list_of_coins - [coin], result_list) + end end end + end diff --git a/euler033.rb b/euler033.rb index 2c8f5b9..35878d8 100644 --- a/euler033.rb +++ b/euler033.rb @@ -1,21 +1,56 @@ -class Integer - def mod_exp(exp, mod) - 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 +def gcd(a, b) + b == 0 ? a : gcd(b, a % b) +end + +def generate_fractional_pairs + pairs = [] + (10..99).each do |i| + (10..99).each do |j| + pairs << [i,j] if i < j end - prod end + pairs end -PHI = (1 + Math.sqrt(5)) / 2 +def check_weird_cancellations + solutions = [] + fractions = generate_fractional_pairs -def fib(n) - ((PHI ** n - (-1 / PHI) ** n) / Math.sqrt(5)).to_i + 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 -puts fib(8) +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 diff --git a/euler034.rb b/euler034.rb new file mode 100644 index 0000000..7fb6f22 --- /dev/null +++ b/euler034.rb @@ -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 diff --git a/euler035.rb b/euler035.rb new file mode 100644 index 0000000..79d418e --- /dev/null +++ b/euler035.rb @@ -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 diff --git a/euler036.rb b/euler036.rb new file mode 100644 index 0000000..c676516 --- /dev/null +++ b/euler036.rb @@ -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 diff --git a/euler037.rb b/euler037.rb new file mode 100644 index 0000000..27ccab6 --- /dev/null +++ b/euler037.rb @@ -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