#include <iostream>
#include <vector>
#include <numeric>
#include <cmath>

using VecD = std::vector<double>;

double getMean(const VecD& data) {
    return std::accumulate(data.cbegin(), data.cend(), 0.0) / data.size();
}

double getVariance(const VecD& data, double meanVal) {
    double sum = 0.0;
    for (double x : data) {
        sum += std::pow(meanVal - x, 2);
    }
    return sum / data.size();
}

double getStdDev(const VecD& data, double meanVal) {
    return sqrt(getVariance(data, meanVal));
}

VecD zScoreNormalize(const VecD& data) {
    double meanVal = getMean(data);
    double stdDev = getStdDev(data, meanVal);
    VecD normalizedData(data.size());
    for (size_t i = 0; i < data.size(); i++) {
        normalizedData[i] = (data[i] - meanVal) / stdDev;
    }
    return normalizedData;
}

int main() {
    VecD v = {50, 60, 70, 80, 90, 600};
    auto ans = zScoreNormalize(v);
    for (double x : ans) {
        std::cout << x << ' ';
    }
    std::cout << std::endl;
    return 0;
}
