series: iteration 1

This commit is contained in:
Dmitry Kokorin 2016-04-06 15:21:08 +03:00
parent ff9a749710
commit 3196a562f4
2 changed files with 70 additions and 0 deletions

54
cpp/series/series.cpp Normal file
View file

@ -0,0 +1,54 @@
#include "series.h"
#include <algorithm>
#include <stdexcept>
namespace series {
using namespace std;
namespace {
inline int char_to_digit(char ch)
{
if (!isdigit(ch))
throw domain_error("not a digit");
return ch - '0';
}
}
digits_t digits(const string &input)
{
digits_t result(input.size());
transform(input.cbegin(), input.cend(), result.begin(), char_to_digit);
return result;
}
slice_t slice(const string &input, size_t size)
{
if (size > input.size())
throw domain_error("not enough digits to slice");
if (size == 0)
return slice_t();
digits_t input_digits = digits(input);
slice_t result;
auto begin = input_digits.cbegin();
auto end = begin + size - 1;
while (end != input_digits.cend())
result.push_back(digits_t(begin++, ++end));
return result;
}
}

16
cpp/series/series.h Normal file
View file

@ -0,0 +1,16 @@
#pragma once
#define EXERCISM_RUN_ALL_TESTS
#include <string>
#include <vector>
namespace series {
typedef std::vector<int> digits_t;
typedef std::vector<std::vector<int>> slice_t;
digits_t digits(const std::string &input);
slice_t slice(const std::string &input, std::size_t size);
}