diff --git a/ruby/collatz-conjecture/README.md b/ruby/collatz-conjecture/README.md new file mode 100644 index 0000000..a0a4f52 --- /dev/null +++ b/ruby/collatz-conjecture/README.md @@ -0,0 +1,57 @@ +# Collatz Conjecture + +The Collatz Conjecture or 3x+1 problem can be summarized as follows: + +Take any positive integer n. If n is even, divide n by 2 to get n / 2. If n is +odd, multiply n by 3 and add 1 to get 3n + 1. Repeat the process indefinitely. +The conjecture states that no matter which number you start with, you will +always reach 1 eventually. + +Given a number n, return the number of steps required to reach 1. + +## Examples + +Starting with n = 12, the steps would be as follows: + +0. 12 +1. 6 +2. 3 +3. 10 +4. 5 +5. 16 +6. 8 +7. 4 +8. 2 +9. 1 + +Resulting in 9 steps. So for input n = 12, the return value would be 9. + +* * * * + +For installation and learning resources, refer to the +[exercism help page](http://exercism.io/languages/ruby). + +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: + + ruby collatz_conjecture_test.rb + +To include color from the command line: + + ruby -r minitest/pride collatz_conjecture_test.rb + + +## Source + +An unsolved problem in mathematics named after mathematician Lothar Collatz [https://en.wikipedia.org/wiki/3x_%2B_1_problem](https://en.wikipedia.org/wiki/3x_%2B_1_problem) + +## Submitting Incomplete Solutions +It's possible to submit an incomplete solution so you can see how others have completed the exercise. diff --git a/ruby/collatz-conjecture/collatz_conjecture.rb b/ruby/collatz-conjecture/collatz_conjecture.rb new file mode 100644 index 0000000..939762f --- /dev/null +++ b/ruby/collatz-conjecture/collatz_conjecture.rb @@ -0,0 +1,17 @@ +class CollatzConjecture + def self.steps(n, count = 0) + if n < 1 + raise ArgumentError + elsif n == 1 + count + else + count += 1 + if n % 2 == 0 + number = n / 2 + else + number = (3 * n) + 1 + end + steps(number, count) + end + end +end diff --git a/ruby/collatz-conjecture/collatz_conjecture_test.rb b/ruby/collatz-conjecture/collatz_conjecture_test.rb new file mode 100644 index 0000000..64b1193 --- /dev/null +++ b/ruby/collatz-conjecture/collatz_conjecture_test.rb @@ -0,0 +1,39 @@ +require 'minitest/autorun' +require_relative 'collatz_conjecture' + +# Common test data version: 1.2.1 d94e348 +class CollatzConjectureTest < Minitest::Test + def test_zero_steps_for_one + # skip + assert_equal 0, CollatzConjecture.steps(1) + end + + def test_divide_if_even + # skip + assert_equal 4, CollatzConjecture.steps(16) + end + + def test_even_and_odd_steps + # skip + assert_equal 9, CollatzConjecture.steps(12) + end + + def test_large_number_of_even_and_odd_steps + # skip + assert_equal 152, CollatzConjecture.steps(1_000_000) + end + + def test_zero_is_an_error + # skip + assert_raises(ArgumentError) do + CollatzConjecture.steps(0) + end + end + + def test_negative_value_is_an_error + # skip + assert_raises(ArgumentError) do + CollatzConjecture.steps(-15) + end + end +end