From 3196a562f47da0c658ea24db947f7e558ecaeefe Mon Sep 17 00:00:00 2001 From: Dmitry Kokorin Date: Wed, 6 Apr 2016 15:21:08 +0300 Subject: [PATCH] series: iteration 1 --- cpp/series/series.cpp | 54 +++++++++++++++++++++++++++++++++++++++++++ cpp/series/series.h | 16 +++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 cpp/series/series.cpp create mode 100644 cpp/series/series.h diff --git a/cpp/series/series.cpp b/cpp/series/series.cpp new file mode 100644 index 0000000..6099224 --- /dev/null +++ b/cpp/series/series.cpp @@ -0,0 +1,54 @@ +#include "series.h" + +#include +#include + +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; +} + + +} diff --git a/cpp/series/series.h b/cpp/series/series.h new file mode 100644 index 0000000..351991d --- /dev/null +++ b/cpp/series/series.h @@ -0,0 +1,16 @@ +#pragma once + +#define EXERCISM_RUN_ALL_TESTS + +#include +#include + +namespace series { + +typedef std::vector digits_t; +typedef std::vector> slice_t; + +digits_t digits(const std::string &input); +slice_t slice(const std::string &input, std::size_t size); + +}