Compute the prime factors of a given natural number.
A prime number is only evenly divisible by itself and 1.
Note that 1 is not a prime number.
What are the prime factors of 60?
Our successful divisors in that computation represent the list of prime factors of 60: 2, 2, 3, and 5.
You can check this yourself:
For installation and learning resources, refer to the Ruby resources page.
For running the tests provided, you will need the Minitest gem. Open a terminal window and run the following command to install minitest:
gem install minitest
If you would like color output, you can
require 'minitest/pride' in
the test file, or note the alternative instruction, below, for running
the test file.
Run the tests from the exercise directory using the following command:
To include color from the command line:
ruby -r minitest/pride prime_factors_test.rb
The Prime Factors Kata by Uncle Bob http://butunclebob.com/ArticleS.UncleBob.ThePrimeFactorsKata
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
require 'minitest/autorun' require_relative 'prime_factors' class PrimeFactorsTest < Minitest::Test def test_1 assert_equal , PrimeFactors.of(1) end def test_2 skip assert_equal , PrimeFactors.of(2) end def test_3 skip assert_equal , PrimeFactors.of(3) end def test_4 skip assert_equal [2, 2], PrimeFactors.of(4) end def test_6 skip assert_equal [2, 3], PrimeFactors.of(6) end def test_8 skip assert_equal [2, 2, 2], PrimeFactors.of(8) end def test_9 skip assert_equal [3, 3], PrimeFactors.of(9) end def test_27 skip assert_equal [3, 3, 3], PrimeFactors.of(27) end def test_625 skip assert_equal [5, 5, 5, 5], PrimeFactors.of(625) end def test_901255 skip assert_equal [5, 17, 23, 461], PrimeFactors.of(901_255) end def test_93819012551 skip assert_equal [11, 9539, 894_119], PrimeFactors.of(93_819_012_551) end end
class PrimeFactors class << self def of(number) if number < 2 return  else factor = 2 results =  number_after_division = number loop do if number_after_division % factor == 0 number_after_division = number_after_division / factor results << factor else factor = factor + 1 end if number_after_division <= 1 break end end results end end def find_primes(number) result = (2..number).to_a result.each do |current| next_factor = 2 loop do if current.nil? || current * next_factor > number break end result[current * next_factor - 2] = nil next_factor += 1 end end result.compact.to_enum end end end
find primes is unused method