Exercism v3 launches on Sept 1st 2021. Learn more! ðŸš€ðŸš€ðŸš€

# thekeele's solution

## to Series in the Elixir Track

Published at May 21 2019 · 0 comments
Instructions
Test suite
Solution

#### Note:

This exercise has changed since this solution was written.

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:

\$ elixir series_test.exs

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

if !System.get_env("EXERCISM_TEST_EXAMPLES") do
end

ExUnit.start()
ExUnit.configure(exclude: :pending, trace: true)

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
assert StringSeries.slices("JosÃ©", 1) == ["J", "o", "s", "Ã©"]
assert StringSeries.slices("JosÃ©", 2) == ["Jo", "os", "sÃ©"]
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
defmodule StringSeries do

@spec slices(s :: String.t(), size :: integer) :: list(String.t())
def slices(_, size) when size < 1, do: []
def slices(s, size) when size == 1, do: String.codepoints(s)
def slices("", _), do: []
def slices(<<_::binary-size(1), rest::binary>> = s, size) do
{slice, _} = String.split_at(s, size)

if String.length(slice) == size, do: [slice | slices(rest, size)], else: []
end
end