#include <iostream>
#include <array>
#include <random>
#include <numeric>
#include <algorithm>
#include <iterator>
template <class Result, class It>
Result avg(It begin,
It end)
{
auto sum = std::accumulate(begin,
end,
Result{});
auto size = std::distance(begin, end);
return sum / size;
}
thread_local std::mt19937 gen{std::random_device{}()};
// https://d...content-available-to-author-only...q.cc/post/180/nie-uzywaj-rand-cxx-ma-random/
template<typename T>
T random(T min, T max) {
using dist = std::conditional_t<
std::is_integral<T>::value,
std::uniform_int_distribution<T>,
std::uniform_real_distribution<T>
>;
return dist{min, max}(gen);
}
template <class It, class T = typename std::iterator_traits<It>::value_type>
void fillWithRandomData(It begin,
It end,
T min,
T max)
{
std::generate(begin, end, [&]() {
return random(min, max);
});
}
template <class It, class UnaryPredicate>
void print(It begin,
It end,
UnaryPredicate pred)
{
std::copy_if(begin,
end,
std::ostream_iterator<typename std::iterator_traits<It>::value_type>(std::cout, "\n"),
pred);
}
template <class It>
void printMinMax(It begin,
It end)
{
auto minmax = std::minmax_element(begin, end);
std::cout
<< "Min: " << *(minmax.first) << "\n"
<< "Max: " << *(minmax.second) << "\n";
}
template <class It>
void printMatrixMinMax(It begin,
It end)
{
using Type = typename std::iterator_traits<It>::value_type;
std::vector<typename Type::value_type> buffer;
std::for_each(begin,
end,
[&](auto elem) {
auto minmax = std::minmax_element(elem.begin(), elem.end());
buffer.push_back(*(minmax.first));
buffer.push_back(*(minmax.second));
});
auto minmax = std::minmax_element(buffer.begin(), buffer.end());
std::cout
<< "Min = " << *(minmax.first) << "\n"
<< "Max = " << *(minmax.second) << "\n";
}
template <class Result, class It>
Result sumDiagonalMatrix(It begin,
It end)
{
Result result{};
auto size = std::distance(begin, end);
auto iter = begin;
for (auto i = 0; i < size; ++i) {
auto tmp = *iter;
result += *(std::next(tmp.begin(), i));
std::advance(iter, 1);
}
return result;
}
int main()
{
// 1.
std::array<int, 8> foo {1, 2, 3, 4, 5, 6, 7, 8};
auto average = avg<double>(foo.begin(), foo.end());
std::cout << "Avg = " << average << "\n";
if (average < 5.0) {
std::cout << "< 5.0\n";
} else if (average > 5.0) {
std::cout << "> 5.0\n";
} else {
std::cout << "== 5.0\n";
}
// 2.
std::array<int, 10> bar;
fillWithRandomData(bar.begin(),
bar.end(),
1,
500);
print(bar.begin(),
bar.end(),
[](auto elem) {
return elem % 6 == 0;
});
// 3.
std::array<int, 20> simple;
fillWithRandomData(simple.begin(),
simple.end(),
10,
50);
printMinMax(simple.begin(), simple.end());
// 5.
std::array<std::array<int, 3>, 3> matrix;
for (auto& elem : matrix) {
fillWithRandomData(elem.begin(),
elem.end(),
0,
100);
}
printMatrixMinMax(matrix.begin(), matrix.end());
// 6.
std::array<std::array<int, 3>, 3> matrix2;
for (auto& elem : matrix2) {
fillWithRandomData(elem.begin(),
elem.end(),
0,
100);
}
auto sum = sumDiagonalMatrix<int>(matrix2.begin(),
matrix2.end());
std::cout << "Diagonal sum = " << sum << "\n";
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXJyYXk+CiNpbmNsdWRlIDxyYW5kb20+CiNpbmNsdWRlIDxudW1lcmljPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8aXRlcmF0b3I+Cgp0ZW1wbGF0ZSA8Y2xhc3MgUmVzdWx0LCBjbGFzcyBJdD4KUmVzdWx0IGF2ZyhJdCBiZWdpbiwKICAgICAgICAgICBJdCBlbmQpCnsKICBhdXRvIHN1bSA9IHN0ZDo6YWNjdW11bGF0ZShiZWdpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0e30pOwogIGF1dG8gc2l6ZSA9IHN0ZDo6ZGlzdGFuY2UoYmVnaW4sIGVuZCk7CiAgcmV0dXJuIHN1bSAvIHNpemU7Cn0KCnRocmVhZF9sb2NhbCBzdGQ6Om10MTk5MzcgZ2Vue3N0ZDo6cmFuZG9tX2RldmljZXt9KCl9OwoKLy8gaHR0cHM6Ly9kLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5xLmNjL3Bvc3QvMTgwL25pZS11enl3YWotcmFuZC1jeHgtbWEtcmFuZG9tLwp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpUIHJhbmRvbShUIG1pbiwgVCBtYXgpIHsKICAgIHVzaW5nIGRpc3QgPSBzdGQ6OmNvbmRpdGlvbmFsX3Q8CiAgICAgICAgc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUsCiAgICAgICAgc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248VD4sCiAgICAgICAgc3RkOjp1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPFQ+CiAgICA+OwogICAgcmV0dXJuIGRpc3R7bWluLCBtYXh9KGdlbik7Cn0KCnRlbXBsYXRlIDxjbGFzcyBJdCwgY2xhc3MgVCA9IHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0Pjo6dmFsdWVfdHlwZT4Kdm9pZCBmaWxsV2l0aFJhbmRvbURhdGEoSXQgYmVnaW4sCiAgICAgICAgICAgICAgICAgICAgICAgIEl0IGVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgVCBtaW4sCiAgICAgICAgICAgICAgICAgICAgICAgIFQgbWF4KQp7CiAgc3RkOjpnZW5lcmF0ZShiZWdpbiwgZW5kLCBbJl0oKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiByYW5kb20obWluLCBtYXgpOwogICAgICAgICAgICAgICAgfSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBJdCwgY2xhc3MgVW5hcnlQcmVkaWNhdGU+CnZvaWQgcHJpbnQoSXQgYmVnaW4sCiAgICAgICAgICAgSXQgZW5kLAogICAgICAgICAgIFVuYXJ5UHJlZGljYXRlIHByZWQpCnsKICBzdGQ6OmNvcHlfaWYoYmVnaW4sCiAgICAgICAgICAgICAgIGVuZCwKICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtX2l0ZXJhdG9yPHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0Pjo6dmFsdWVfdHlwZT4oc3RkOjpjb3V0LCAiXG4iKSwKICAgICAgICAgICAgICAgcHJlZCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBJdD4Kdm9pZCBwcmludE1pbk1heChJdCBiZWdpbiwKICAgICAgICAgICAgICAgICBJdCBlbmQpCnsKICBhdXRvIG1pbm1heCA9IHN0ZDo6bWlubWF4X2VsZW1lbnQoYmVnaW4sIGVuZCk7CiAgc3RkOjpjb3V0CiAgICA8PCAiTWluOiAiIDw8ICoobWlubWF4LmZpcnN0KSA8PCAiXG4iCiAgICA8PCAiTWF4OiAiIDw8ICoobWlubWF4LnNlY29uZCkgPDwgIlxuIjsKCn0KCnRlbXBsYXRlIDxjbGFzcyBJdD4Kdm9pZCBwcmludE1hdHJpeE1pbk1heChJdCBiZWdpbiwKICAgICAgICAgICAgICAgICAgICAgICBJdCBlbmQpCnsKICB1c2luZyBUeXBlID0gdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SXQ+Ojp2YWx1ZV90eXBlOwogIHN0ZDo6dmVjdG9yPHR5cGVuYW1lIFR5cGU6OnZhbHVlX3R5cGU+IGJ1ZmZlcjsKICBzdGQ6OmZvcl9lYWNoKGJlZ2luLAogICAgICAgICAgICAgICAgZW5kLAogICAgICAgICAgICAgICAgWyZdKGF1dG8gZWxlbSkgewogICAgICAgICAgICAgICAgICBhdXRvIG1pbm1heCA9IHN0ZDo6bWlubWF4X2VsZW1lbnQoZWxlbS5iZWdpbigpLCBlbGVtLmVuZCgpKTsKICAgICAgICAgICAgICAgICAgYnVmZmVyLnB1c2hfYmFjaygqKG1pbm1heC5maXJzdCkpOwogICAgICAgICAgICAgICAgICBidWZmZXIucHVzaF9iYWNrKCoobWlubWF4LnNlY29uZCkpOwogICAgICAgICAgICAgICAgfSk7CgogIGF1dG8gbWlubWF4ID0gc3RkOjptaW5tYXhfZWxlbWVudChidWZmZXIuYmVnaW4oKSwgYnVmZmVyLmVuZCgpKTsKICBzdGQ6OmNvdXQKICAgIDw8ICJNaW4gPSAiIDw8ICoobWlubWF4LmZpcnN0KSA8PCAiXG4iCiAgICA8PCAiTWF4ID0gIiA8PCAqKG1pbm1heC5zZWNvbmQpIDw8ICJcbiI7Cn0KCnRlbXBsYXRlIDxjbGFzcyBSZXN1bHQsIGNsYXNzIEl0PgpSZXN1bHQgc3VtRGlhZ29uYWxNYXRyaXgoSXQgYmVnaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBJdCBlbmQpCnsKICBSZXN1bHQgcmVzdWx0e307CiAgYXV0byBzaXplID0gc3RkOjpkaXN0YW5jZShiZWdpbiwgZW5kKTsKICBhdXRvIGl0ZXIgPSBiZWdpbjsKICBmb3IgKGF1dG8gaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKICAgIGF1dG8gdG1wID0gKml0ZXI7CiAgICByZXN1bHQgKz0gKihzdGQ6Om5leHQodG1wLmJlZ2luKCksIGkpKTsKICAgIHN0ZDo6YWR2YW5jZShpdGVyLCAxKTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQoKaW50IG1haW4oKQp7CiAgLy8gMS4KICBzdGQ6OmFycmF5PGludCwgOD4gZm9vIHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4fTsKICBhdXRvIGF2ZXJhZ2UgPSBhdmc8ZG91YmxlPihmb28uYmVnaW4oKSwgZm9vLmVuZCgpKTsKICBzdGQ6OmNvdXQgPDwgIkF2ZyA9ICIgPDwgYXZlcmFnZSA8PCAiXG4iOwogIGlmIChhdmVyYWdlIDwgNS4wKSB7CiAgICBzdGQ6OmNvdXQgPDwgIjwgNS4wXG4iOwogIH0gZWxzZSBpZiAoYXZlcmFnZSA+IDUuMCkgewogICAgc3RkOjpjb3V0IDw8ICI+IDUuMFxuIjsKICB9IGVsc2UgewogICAgc3RkOjpjb3V0IDw8ICI9PSA1LjBcbiI7CiAgfQoKICAvLyAyLgogIHN0ZDo6YXJyYXk8aW50LCAxMD4gYmFyOwogIGZpbGxXaXRoUmFuZG9tRGF0YShiYXIuYmVnaW4oKSwKICAgICAgICAgICAgICAgICAgICAgYmFyLmVuZCgpLAogICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICA1MDApOwogIHByaW50KGJhci5iZWdpbigpLAogICAgICAgIGJhci5lbmQoKSwKICAgICAgICBbXShhdXRvIGVsZW0pIHsKICAgICAgICAgIHJldHVybiBlbGVtICUgNiA9PSAwOwogICAgICAgIH0pOwoKICAvLyAzLgogIHN0ZDo6YXJyYXk8aW50LCAyMD4gc2ltcGxlOwogIGZpbGxXaXRoUmFuZG9tRGF0YShzaW1wbGUuYmVnaW4oKSwKICAgICAgICAgICAgICAgICAgICAgc2ltcGxlLmVuZCgpLAogICAgICAgICAgICAgICAgICAgICAxMCwKICAgICAgICAgICAgICAgICAgICAgNTApOwogIHByaW50TWluTWF4KHNpbXBsZS5iZWdpbigpLCBzaW1wbGUuZW5kKCkpOwoKICAvLyA1LgogIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQsIDM+LCAzPiBtYXRyaXg7CgogIGZvciAoYXV0byYgZWxlbSA6IG1hdHJpeCkgewogICAgZmlsbFdpdGhSYW5kb21EYXRhKGVsZW0uYmVnaW4oKSwKICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmVuZCgpLAogICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgMTAwKTsKICB9CgogIHByaW50TWF0cml4TWluTWF4KG1hdHJpeC5iZWdpbigpLCBtYXRyaXguZW5kKCkpOwoKICAvLyA2LgogIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQsIDM+LCAzPiBtYXRyaXgyOwoKICBmb3IgKGF1dG8mIGVsZW0gOiBtYXRyaXgyKSB7CiAgICBmaWxsV2l0aFJhbmRvbURhdGEoZWxlbS5iZWdpbigpLAogICAgICAgICAgICAgICAgICAgICAgIGVsZW0uZW5kKCksCiAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAxMDApOwogIH0KCiAgYXV0byBzdW0gPSBzdW1EaWFnb25hbE1hdHJpeDxpbnQ+KG1hdHJpeDIuYmVnaW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4Mi5lbmQoKSk7CiAgc3RkOjpjb3V0IDw8ICJEaWFnb25hbCBzdW0gPSAiIDw8IHN1bSA8PCAiXG4iOwp9