From 6a4d2eab72e679ebbea54559b5b48264106382a8 Mon Sep 17 00:00:00 2001 From: Geoff Hubbard Date: Thu, 8 Jun 2017 08:56:54 +0100 Subject: [PATCH 1/3] collatz-conjecture: New exercise with test generator --- exercises/collatz-conjecture/.meta/.version | 1 + .../generator/collatz_conjecture_case.rb | 31 ++++++++++ .../.meta/solutions/collatz_conjecture.rb | 22 +++++++ .../collatz_conjecture_test.rb | 58 +++++++++++++++++++ 4 files changed, 112 insertions(+) create mode 100644 exercises/collatz-conjecture/.meta/.version create mode 100644 exercises/collatz-conjecture/.meta/generator/collatz_conjecture_case.rb create mode 100644 exercises/collatz-conjecture/.meta/solutions/collatz_conjecture.rb create mode 100644 exercises/collatz-conjecture/collatz_conjecture_test.rb diff --git a/exercises/collatz-conjecture/.meta/.version b/exercises/collatz-conjecture/.meta/.version new file mode 100644 index 0000000000..56a6051ca2 --- /dev/null +++ b/exercises/collatz-conjecture/.meta/.version @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/exercises/collatz-conjecture/.meta/generator/collatz_conjecture_case.rb b/exercises/collatz-conjecture/.meta/generator/collatz_conjecture_case.rb new file mode 100644 index 0000000000..0d0804c271 --- /dev/null +++ b/exercises/collatz-conjecture/.meta/generator/collatz_conjecture_case.rb @@ -0,0 +1,31 @@ +require 'generator/exercise_case' + +class CollatzConjectureCase < Generator::ExerciseCase + using Generator::Underscore + + def workload + case expected + when Fixnum + standard_assertion + when Hash + error_assertion + end + end + + def standard_assertion + assert_equal { subject_of_test } + end + + def error_assertion + "assert_raises(ArgumentError) { #{subject_of_test} }" + end + + def subject_of_test + "CollatzConjecture.steps(#{input})" + end + + def input + number.underscore + end +end + diff --git a/exercises/collatz-conjecture/.meta/solutions/collatz_conjecture.rb b/exercises/collatz-conjecture/.meta/solutions/collatz_conjecture.rb new file mode 100644 index 0000000000..61b140d86e --- /dev/null +++ b/exercises/collatz-conjecture/.meta/solutions/collatz_conjecture.rb @@ -0,0 +1,22 @@ +module BookKeeping + VERSION = 1 +end + +module CollatzConjecture + def self.steps(num) + raise ArgumentError if num < 1 + n = num + steps = 0 + until n == 1 + steps += 1 + if n.even? + n /= 2 + else + n = 3 * n + 1 + end + end + steps + end +end + + diff --git a/exercises/collatz-conjecture/collatz_conjecture_test.rb b/exercises/collatz-conjecture/collatz_conjecture_test.rb new file mode 100644 index 0000000000..33dad0490b --- /dev/null +++ b/exercises/collatz-conjecture/collatz_conjecture_test.rb @@ -0,0 +1,58 @@ +#!/usr/bin/env ruby +require 'minitest/autorun' +require_relative 'collatz_conjecture' + +# Common test data version: 1.1.1 25c4479 +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) { CollatzConjecture.steps(0) } + end + + def test_negative_value_is_an_error + skip + assert_raises(ArgumentError) { CollatzConjecture.steps(-15) } + end + + # Problems in exercism evolve over time, as we find better ways to ask + # questions. + # The version number refers to the version of the problem you solved, + # not your solution. + # + # Define a constant named VERSION inside of the top level BookKeeping + # module, which may be placed near the end of your file. + # + # In your file, it will look like this: + # + # module BookKeeping + # VERSION = 1 # Where the version number matches the one in the test. + # end + # + # If you are curious, read more about constants on RubyDoc: + # http://ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/constants.html + + def test_bookkeeping + skip + assert_equal 1, BookKeeping::VERSION + end +end From 23415aabd0a0a567ec7b7f8641fb5a88813efb75 Mon Sep 17 00:00:00 2001 From: Geoff Hubbard Date: Thu, 8 Jun 2017 10:04:33 +0100 Subject: [PATCH 2/3] Set executable bit on test file. --- exercises/collatz-conjecture/collatz_conjecture_test.rb | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 exercises/collatz-conjecture/collatz_conjecture_test.rb diff --git a/exercises/collatz-conjecture/collatz_conjecture_test.rb b/exercises/collatz-conjecture/collatz_conjecture_test.rb old mode 100644 new mode 100755 From b1a05ab931f9e5bdee02e526871afc2c917e19d2 Mon Sep 17 00:00:00 2001 From: Geoff Hubbard Date: Thu, 8 Jun 2017 10:10:22 +0100 Subject: [PATCH 3/3] Add collatz-conjecture to config.json --- config.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/config.json b/config.json index 9a605b8a48..799bd906b7 100644 --- a/config.json +++ b/config.json @@ -593,6 +593,18 @@ "topics": [ ] + }, + { + "slug": "collatz-conjecture", + "difficulty": 1, + "topics": [ + "Control-flow (loops)", + "Control-flow (conditionals)", + "Recursion", + "Integers", + "Algorithms", + "Mathematics" + ] } ], "deprecated": [