ruby - series
This commit is contained in:
parent
e31b976368
commit
6ccf257fdd
51
ruby/series/README.md
Normal file
51
ruby/series/README.md
Normal 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
17
ruby/series/series.rb
Normal 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
102
ruby/series/series_test.rb
Normal 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
|
Loading…
x
Reference in New Issue
Block a user