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.for(1) end def test_2 skip assert_equal , PrimeFactors.for(2) end def test_3 skip assert_equal , PrimeFactors.for(3) end def test_4 skip assert_equal [2, 2], PrimeFactors.for(4) end def test_6 skip assert_equal [2, 3], PrimeFactors.for(6) end def test_8 skip assert_equal [2, 2, 2], PrimeFactors.for(8) end def test_9 skip assert_equal [3, 3], PrimeFactors.for(9) end def test_27 skip assert_equal [3, 3, 3], PrimeFactors.for(27) end def test_625 skip assert_equal [5, 5, 5, 5], PrimeFactors.for(625) end def test_901255 skip assert_equal [5, 17, 23, 461], PrimeFactors.for(901_255) end def test_93819012551 skip assert_equal [11, 9539, 894_119], PrimeFactors.for(93_819_012_551) end end
require 'byebug' class PrimeGenerator def initialize @primes =  @i = 2 end def build(n) while @primes.length < n if is_prime?(@i) @primes << @i end @i += 1 end end def next build(@primes.length + 1) end def last @primes.last end def is_prime?(x) @primes.each do |prime| # Return early if the number in question is evenly divisible by a prime. return false if x != prime && x % prime == 0 end true end end class PrimeFactors def self.for(n) return  if n == 1 return  if n == 2 factors =  prime_generator = PrimeGenerator.new prime_generator.next current = n while current > 1 if current % prime_generator.last == 0 current /= prime_generator.last factors << prime_generator.last else prime_generator.next end end factors end end
A huge amount can be learned from reading other people’s code. This is why we wanted to give exercism users the option of making their solutions public.
Here are some questions to help you reflect on this solution and learn the most from it.