ðŸŽ‰ Exercism Research is now launched. Help Exercism, help science and have some fun at research.exercism.io ðŸŽ‰

# angelikatyborska's solution

## to Series in the Elixir Track

Published at Feb 01 2020 · 0 comments
Instructions
Test suite
Solution

Given a string of digits, output all the contiguous substrings of length `n` in that string in the order that they appear.

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.

## Running tests

Execute the tests with:

``````\$ mix test
``````

### Pending tests

In the test suites, all but the first test have been skipped.

Once you get a test passing, you can unskip the next one by commenting out the relevant `@tag :pending` with a `#` symbol.

For example:

``````# @tag :pending
test "shouting" do
assert Bob.hey("WATCH OUT!") == "Whoa, chill out!"
end
``````

Or, you can enable all the tests by commenting out the `ExUnit.configure` line in the test suite.

``````# ExUnit.configure exclude: :pending, trace: true
``````

If you're stuck on something, it may help to look at some of the available resources out there where answers might be found.

## Source

A subset of the Problem 8 at Project Euler 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.

### series_test.exs

``````defmodule StringSeriesTest do
use ExUnit.Case

# @tag :pending
test "slices of size 1" do
assert StringSeries.slices("01234", 1) == ["0", "1", "2", "3", "4"]
end

@tag :pending
test "slices of size 2" do
assert StringSeries.slices("01234", 2) == ["01", "12", "23", "34"]
end

@tag :pending
test "slices of size 3" do
assert StringSeries.slices("01234", 3) == ["012", "123", "234"]
end

@tag :pending
test "slices of size 4" do
assert StringSeries.slices("01234", 4) == ["0123", "1234"]
end

@tag :pending
test "slices same size as string" do
assert StringSeries.slices("01234", 5) == ["01234"]
end

@tag :pending
test "Unicode characters count as a single character" do
end

@tag :pending
test "slices with size longer than string return empty list" do
assert StringSeries.slices("01234", 6) == []
end

@tag :pending
test "slices with size zero or negative return empty list" do
assert StringSeries.slices("01234", -1) == []
assert StringSeries.slices("01234", 0) == []
end
end``````

### test_helper.exs

``````ExUnit.start()
ExUnit.configure(exclude: :pending, trace: true)``````
``````defmodule StringSeries do
@doc """
Given a string `s` and a positive integer `size`, return all substrings
of that size. If `size` is greater than the length of `s`, or less than 1,
return an empty list.
"""
@spec slices(s :: String.t(), size :: integer) :: list(String.t())
def slices(_s, size) when size <= 0, do: []

def slices(s, size) do
s
|> String.split("", trim: true)
|> Enum.map(&Enum.join/1)
end
end``````