diff --git a/.gitignore b/.gitignore index 16bdf0e..43950d6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ .DS_Store c/binaries +*/bin/* +*.dwarf diff --git a/crystal/001/euler001 b/crystal/001/euler001 deleted file mode 100755 index c08b083..0000000 Binary files a/crystal/001/euler001 and /dev/null differ diff --git a/crystal/001/euler001.dwarf b/crystal/001/euler001.dwarf deleted file mode 100644 index bb4d2a3..0000000 Binary files a/crystal/001/euler001.dwarf and /dev/null differ diff --git a/crystal/002/euler002 b/crystal/002/euler002 deleted file mode 100755 index 1a6705c..0000000 Binary files a/crystal/002/euler002 and /dev/null differ diff --git a/crystal/002/euler002.dwarf b/crystal/002/euler002.dwarf deleted file mode 100644 index 88fe852..0000000 Binary files a/crystal/002/euler002.dwarf and /dev/null differ diff --git a/crystal/003/euler003 b/crystal/003/euler003 deleted file mode 100755 index 963c05e..0000000 Binary files a/crystal/003/euler003 and /dev/null differ diff --git a/crystal/003/euler003.cr b/crystal/003/euler003.cr deleted file mode 100644 index 38be85b..0000000 --- a/crystal/003/euler003.cr +++ /dev/null @@ -1,26 +0,0 @@ -#wrong approach, should just do recursive trial division... - -def eratosthenes_sieve(n) - sieve = Array.new(n + 1, true) - sieve[0] = false - sieve[1] = false - - 2.step(to: Math.sqrt(n)) do |i| - if sieve[i] - (i * i).step(to: n, by: i) do |j| - sieve[j] = false - end - end - end - - result = sieve.map_with_index { |b, i| b ? i : nil }.compact -end - -def prime_factors(n) - nums = eratosthenes_sieve(n).select { |i| n % i == 0 } - nums = nums + nums.map { |i| n / i } -end - -puts eratosthenes_sieve(600851475143) - -puts prime_factors(600851475143).max diff --git a/crystal/003/euler003.dwarf b/crystal/003/euler003.dwarf deleted file mode 100644 index 07ba194..0000000 Binary files a/crystal/003/euler003.dwarf and /dev/null differ diff --git a/crystal/euler.cr b/crystal/euler.cr new file mode 100644 index 0000000..17dcdce --- /dev/null +++ b/crystal/euler.cr @@ -0,0 +1,23 @@ +# miscellaneous stuff + +module Euler + def self.eratosthenes_sieve(n) + sieve = Array.new(n + 1, true) + sieve[0] = false + sieve[1] = false + + 2.step(to: Math.sqrt(n)) do |i| + if sieve[i] + (i * i).step(to: n, by: i) do |j| + sieve[j] = false + end + end + end + + result = sieve.map_with_index { |b, i| b ? i : nil }.compact + end + + def self.palindrome?(x) + x.to_s.reverse == x.to_s + end +end diff --git a/crystal/001/euler001.cr b/crystal/euler001.cr similarity index 100% rename from crystal/001/euler001.cr rename to crystal/euler001.cr diff --git a/crystal/002/euler002.cr b/crystal/euler002.cr similarity index 100% rename from crystal/002/euler002.cr rename to crystal/euler002.cr diff --git a/crystal/euler003.cr b/crystal/euler003.cr new file mode 100644 index 0000000..cd5ab03 --- /dev/null +++ b/crystal/euler003.cr @@ -0,0 +1,27 @@ +alias NumType = Int32 | Int64 | UInt32 | UInt64 + +def trial_division(n : NumType) + factors = [] of NumType + check = ->(p: NumType) { + q, r = n.divmod(p) + while r.zero? + factors << p + n = q + q, r = n.divmod(p) + end + } + + check.call(2) + check.call(3) + p = 5 + while p * p <= n + check.call(p) + p += 2 + check.call(p) + p += 4 + end + factors << n if n > 1 + factors +end + +puts trial_division(600851475143).max diff --git a/crystal/euler004.cr b/crystal/euler004.cr new file mode 100644 index 0000000..6b9b4e6 --- /dev/null +++ b/crystal/euler004.cr @@ -0,0 +1,7 @@ +require "./euler" + +def products_of_three_digit_nums + (100..999).to_a.combinations(2).map { |p| p.product } +end + +puts products_of_three_digit_nums.select { |x| Euler.palindrome?(x) }.max