ruby - series

This commit is contained in:
James Walker 2018-09-20 16:45:20 -04:00
parent e31b976368
commit 6ccf257fdd
Signed by: walkah
GPG Key ID: 3C127179D6086E93
3 changed files with 170 additions and 0 deletions

51
ruby/series/README.md Normal file
View File

@ -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.

17
ruby/series/series.rb Normal file
View File

@ -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

102
ruby/series/series_test.rb Normal file
View File

@ -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