#include <algorithm>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>
namespace detail {
template <typename ForwardIterator>
auto mean(ForwardIterator first, ForwardIterator last,
const std::size_t elements_count) {
const auto sum_of_elements = std::accumulate(first, last, 0.0);
return sum_of_elements / elements_count;
}
template <typename ForwardIterator>
auto variance(ForwardIterator first, ForwardIterator last,
const double elements_mean) {
auto VarianceAccumulator = [elements_mean](auto total, auto next_value) {
const auto diff = next_value - elements_mean;
return total + (diff * diff);
};
return std::accumulate(first, last, 0.0, VarianceAccumulator);
}
} //namespace
template <typename ForwardIterator>
auto mean(ForwardIterator first, ForwardIterator last) {
const auto element_count = std::distance(first, last);
return detail::mean(first, last, element_count);
}
template <typename ForwardIterator>
auto standard_deviation(ForwardIterator first, ForwardIterator last) {
const auto elements_count = std::distance(first, last);
const auto elements_mean = detail::mean(first, last, elements_count);
const auto elements_variance = detail::variance(first, last, elements_mean);
return std::sqrt(elements_variance / elements_count);
}
template <typename ForwardIterator>
void print_standard_deviation(ForwardIterator first, ForwardIterator last,
std::ostream &out) {
std::copy(first, last, std::ostream_iterator<int>(out, " "));
out << "\nStandard Deviation: " << std::setprecision(4) << std::fixed
<< standard_deviation(first, last) << '\n' << '\n';
}
int main() {
std::vector<std::vector<int>> inputs{
{5, 6, 11, 13, 19, 20, 25, 26, 28, 37},
{37, 81, 86, 91, 97, 108, 109, 112, 112, 114, 115, 117, 121, 123, 141},
{266, 344, 375, 399, 409, 433, 436, 440, 449, 476, 502, 504, 530, 584,
587},
{809, 816, 833, 849, 851, 961, 976, 1009, 1069, 1125, 1161, 1172, 1178,
1187, 1208, 1215, 1229, 1241, 1260, 1373}};
for (const auto &input : inputs) {
print_standard_deviation(input.begin(), input.end(), std::cout);
}
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxudW1lcmljPgojaW5jbHVkZSA8dmVjdG9yPgoKbmFtZXNwYWNlIGRldGFpbCB7CnRlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I+CmF1dG8gbWVhbihGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIEZvcndhcmRJdGVyYXRvciBsYXN0LAogICAgICAgICAgY29uc3Qgc3RkOjpzaXplX3QgZWxlbWVudHNfY291bnQpIHsKICBjb25zdCBhdXRvIHN1bV9vZl9lbGVtZW50cyA9IHN0ZDo6YWNjdW11bGF0ZShmaXJzdCwgbGFzdCwgMC4wKTsKICByZXR1cm4gc3VtX29mX2VsZW1lbnRzIC8gZWxlbWVudHNfY291bnQ7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I+CmF1dG8gdmFyaWFuY2UoRm9yd2FyZEl0ZXJhdG9yIGZpcnN0LCBGb3J3YXJkSXRlcmF0b3IgbGFzdCwKICAgICAgICAgICAgICBjb25zdCBkb3VibGUgZWxlbWVudHNfbWVhbikgewogIGF1dG8gVmFyaWFuY2VBY2N1bXVsYXRvciA9IFtlbGVtZW50c19tZWFuXShhdXRvIHRvdGFsLCBhdXRvIG5leHRfdmFsdWUpIHsKICAgIGNvbnN0IGF1dG8gZGlmZiA9IG5leHRfdmFsdWUgLSBlbGVtZW50c19tZWFuOwogICAgcmV0dXJuIHRvdGFsICsgKGRpZmYgKiBkaWZmKTsKICB9OwogIAogIHJldHVybiBzdGQ6OmFjY3VtdWxhdGUoZmlyc3QsIGxhc3QsIDAuMCwgVmFyaWFuY2VBY2N1bXVsYXRvcik7Cn0KfSAvL25hbWVzcGFjZQoKdGVtcGxhdGUgPHR5cGVuYW1lIEZvcndhcmRJdGVyYXRvcj4KYXV0byBtZWFuKEZvcndhcmRJdGVyYXRvciBmaXJzdCwgRm9yd2FyZEl0ZXJhdG9yIGxhc3QpIHsKICBjb25zdCBhdXRvIGVsZW1lbnRfY291bnQgPSBzdGQ6OmRpc3RhbmNlKGZpcnN0LCBsYXN0KTsKICByZXR1cm4gZGV0YWlsOjptZWFuKGZpcnN0LCBsYXN0LCBlbGVtZW50X2NvdW50KTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIEZvcndhcmRJdGVyYXRvcj4KYXV0byBzdGFuZGFyZF9kZXZpYXRpb24oRm9yd2FyZEl0ZXJhdG9yIGZpcnN0LCBGb3J3YXJkSXRlcmF0b3IgbGFzdCkgewogIGNvbnN0IGF1dG8gZWxlbWVudHNfY291bnQgPSBzdGQ6OmRpc3RhbmNlKGZpcnN0LCBsYXN0KTsKICBjb25zdCBhdXRvIGVsZW1lbnRzX21lYW4gPSBkZXRhaWw6Om1lYW4oZmlyc3QsIGxhc3QsIGVsZW1lbnRzX2NvdW50KTsKICBjb25zdCBhdXRvIGVsZW1lbnRzX3ZhcmlhbmNlID0gZGV0YWlsOjp2YXJpYW5jZShmaXJzdCwgbGFzdCwgZWxlbWVudHNfbWVhbik7CgogIHJldHVybiBzdGQ6OnNxcnQoZWxlbWVudHNfdmFyaWFuY2UgLyBlbGVtZW50c19jb3VudCk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I+CnZvaWQgcHJpbnRfc3RhbmRhcmRfZGV2aWF0aW9uKEZvcndhcmRJdGVyYXRvciBmaXJzdCwgRm9yd2FyZEl0ZXJhdG9yIGxhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSAmb3V0KSB7CiAgc3RkOjpjb3B5KGZpcnN0LCBsYXN0LCBzdGQ6Om9zdHJlYW1faXRlcmF0b3I8aW50PihvdXQsICIgIikpOwogIG91dCA8PCAiXG5TdGFuZGFyZCBEZXZpYXRpb246ICIgPDwgc3RkOjpzZXRwcmVjaXNpb24oNCkgPDwgc3RkOjpmaXhlZAogICAgICA8PCBzdGFuZGFyZF9kZXZpYXRpb24oZmlyc3QsIGxhc3QpIDw8ICdcbicgPDwgJ1xuJzsKfQoKaW50IG1haW4oKSB7CiAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50Pj4gaW5wdXRzewogICAgICB7NSwgNiwgMTEsIDEzLCAxOSwgMjAsIDI1LCAyNiwgMjgsIDM3fSwKICAgICAgezM3LCA4MSwgODYsIDkxLCA5NywgMTA4LCAxMDksIDExMiwgMTEyLCAxMTQsIDExNSwgMTE3LCAxMjEsIDEyMywgMTQxfSwKICAgICAgezI2NiwgMzQ0LCAzNzUsIDM5OSwgNDA5LCA0MzMsIDQzNiwgNDQwLCA0NDksIDQ3NiwgNTAyLCA1MDQsIDUzMCwgNTg0LAogICAgICAgNTg3fSwKICAgICAgezgwOSwgODE2LCA4MzMsIDg0OSwgODUxLCA5NjEsIDk3NiwgMTAwOSwgMTA2OSwgMTEyNSwgMTE2MSwgMTE3MiwgMTE3OCwKICAgICAgIDExODcsIDEyMDgsIDEyMTUsIDEyMjksIDEyNDEsIDEyNjAsIDEzNzN9fTsKCiAgZm9yIChjb25zdCBhdXRvICZpbnB1dCA6IGlucHV0cykgewogICAgcHJpbnRfc3RhbmRhcmRfZGV2aWF0aW9uKGlucHV0LmJlZ2luKCksIGlucHV0LmVuZCgpLCBzdGQ6OmNvdXQpOwogIH0KfQ==