From 6ccf257fddc0b6976df71900ac2ce04d5557664e Mon Sep 17 00:00:00 2001 From: James Walker Date: Thu, 20 Sep 2018 16:45:20 -0400 Subject: [PATCH] ruby - series --- ruby/series/README.md | 51 +++++++++++++++++++ ruby/series/series.rb | 17 +++++++ ruby/series/series_test.rb | 102 +++++++++++++++++++++++++++++++++++++ 3 files changed, 170 insertions(+) create mode 100644 ruby/series/README.md create mode 100644 ruby/series/series.rb create mode 100644 ruby/series/series_test.rb diff --git a/ruby/series/README.md b/ruby/series/README.md new file mode 100644 index 0000000..0f278a2 --- /dev/null +++ b/ruby/series/README.md @@ -0,0 +1,51 @@ +# Series + +Given a string of digits, output all the contiguous substrings of length `n` in +that string. + +For example, the string "49142" has the following 3-digit series: + +- 491 +- 914 +- 142 + +And the following 4-digit series: + +- 4914 +- 9142 + +And if you ask for a 6-digit series from a 5-digit string, you deserve +whatever you get. + +Note that these series are only required to occupy *adjacent positions* +in the input; the digits need not be *numerically consecutive*. + +* * * * + +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 series_test.rb + +To include color from the command line: + + ruby -r minitest/pride series_test.rb + + +## Source + +A subset of the Problem 8 at Project Euler [http://projecteuler.net/problem=8](http://projecteuler.net/problem=8) + +## 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/series/series.rb b/ruby/series/series.rb new file mode 100644 index 0000000..3abdbdc --- /dev/null +++ b/ruby/series/series.rb @@ -0,0 +1,17 @@ +class Series + def initialize(digits) + @digits = digits + end + + def slices(slice_length) + if slice_length > @digits.length + raise ArgumentError + end + + slices = [] + 0.upto(@digits.length - slice_length) do |i| + slices.push @digits.slice(i, slice_length) + end + slices + end +end diff --git a/ruby/series/series_test.rb b/ruby/series/series_test.rb new file mode 100644 index 0000000..dabfe6e --- /dev/null +++ b/ruby/series/series_test.rb @@ -0,0 +1,102 @@ +require 'minitest/autorun' +require_relative 'series' + +class SeriesTest < Minitest::Test + def test_simple_slices_of_one + series = Series.new('01234') + assert_equal ['0', '1', '2', '3', '4'], series.slices(1) + end + + def test_simple_slices_of_one_again + # skip + series = Series.new('92834') + assert_equal ['9', '2', '8', '3', '4'], series.slices(1) + end + + def test_simple_slices_of_two + # skip + series = Series.new('01234') + assert_equal ['01', '12', '23', '34'], series.slices(2) + end + + def test_other_slices_of_two + # skip + series = Series.new('98273463') + expected = ['98', '82', '27', '73', '34', '46', '63'] + assert_equal expected, series.slices(2) + end + + def test_simple_slices_of_two_again + # skip + series = Series.new('37103') + assert_equal ['37', '71', '10', '03'], series.slices(2) + end + + def test_simple_slices_of_three + # skip + series = Series.new('01234') + assert_equal ['012', '123', '234'], series.slices(3) + end + + def test_simple_slices_of_three_again + # skip + series = Series.new('31001') + assert_equal ['310', '100', '001'], series.slices(3) + end + + def test_other_slices_of_three + # skip + series = Series.new('982347') + expected = ['982', '823', '234', '347'] + assert_equal expected, series.slices(3) + end + + def test_simple_slices_of_four + # skip + series = Series.new('01234') + assert_equal ['0123', '1234'], series.slices(4) + end + + def test_simple_slices_of_four_again + # skip + series = Series.new('91274') + assert_equal ['9127', '1274'], series.slices(4) + end + + def test_simple_slices_of_five + # skip + series = Series.new('01234') + assert_equal ['01234'], series.slices(5) + end + + def test_simple_slices_of_five_again + # skip + series = Series.new('81228') + assert_equal ['81228'], series.slices(5) + end + + def test_simple_slice_that_blows_up + # skip + series = Series.new('01234') + assert_raises ArgumentError do + series.slices(6) + end + end + + def test_more_complicated_slice_that_blows_up + # skip + slice_string = '01032987583' + + series = Series.new(slice_string) + assert_raises ArgumentError do + series.slices(slice_string.length + 1) + end + end + + def test_sequential_slices + # skip + series = Series.new('1234') + assert_equal ['12', '23', '34'], series.slices(2) + assert_equal ['123', '234'], series.slices(3) + end +end