From 3c91e1fb8f16a1e9d16f283b9a6b7084daa00adf Mon Sep 17 00:00:00 2001 From: Evan Hemsley Date: Fri, 14 Nov 2014 00:57:29 -0800 Subject: [PATCH] fixed some old code + added solutions for new problems --- euler001.rb | 9 ++++++++ euler015.rb | 16 ++++++++++++++ euler026.rb | 29 ++++++++++++++++++++++++ euler028.rb | 17 +++++++++++++++ euler031.rb | 20 +++++++++-------- euler033.rb | 63 +++++++++++++++++++++++++++++++++++++++++------------ euler034.rb | 17 +++++++++++++++ euler035.rb | 29 ++++++++++++++++++++++++ euler036.rb | 11 ++++++++++ euler037.rb | 32 +++++++++++++++++++++++++++ 10 files changed, 220 insertions(+), 23 deletions(-) create mode 100644 euler001.rb create mode 100644 euler015.rb create mode 100644 euler026.rb create mode 100644 euler028.rb create mode 100644 euler034.rb create mode 100644 euler035.rb create mode 100644 euler036.rb create mode 100644 euler037.rb 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