#include <array>
#include <cstdlib>
namespace sehn {
template <typename T, std::size_t N>
using matrix = std::array<std::array<T, N>, N>;
template <typename T, std::size_t N>
matrix<T, N> flipud (matrix<T, N> const &);
template <typename T, std::size_t N, int K>
std::array<T, N - std::abs (K)> diag (matrix<T, N> const &);
}
#include <iostream>
template <typename T, std::size_t N>
std::array<int, 2 * N - 1> sum_diags (sehn::matrix<T, N> const &);
int main () {
std::size_t const size (3);
sehn::matrix<int, size> m { {
1, 2, 3,
10, 20, 30,
100, 200, 300
} };
for (auto const &row : m) {
for (auto const &item : row)
std::cout << item << '\t';
std::cout << std::endl;
}
std::cout << std::endl;
for (auto const &s : sum_diags (m))
std::cout << s << '\t';
std::cout << std::endl << std::endl;
auto f (sehn::flipud (m));
for (auto const &row : f) {
for (auto const &item : row)
std::cout << item << '\t';
std::cout << std::endl;
}
std::cout << std::endl;
for (auto const &s : sum_diags (f))
std::cout << s << '\t';
std::cout << std::endl << std::endl;
return 0;
}
#include <iterator>
#include <numeric>
#include <type_traits>
template <typename T, std::size_t N, int K>
typename std::enable_if<K < static_cast<int> (N) - 1>::type
sum_diags_impl (sehn::matrix<T, N> const &, std::array<int, 2 * N - 1> &);
template <typename T, std::size_t N, int K>
typename std::enable_if<K == static_cast<int> (N) - 1>::type
sum_diags_impl (sehn::matrix<T, N> const &, std::array<int, 2 * N - 1> &);
template <typename T, std::size_t N>
std::array<int, 2 * N - 1> sum_diags (sehn::matrix<T, N> const &source) {
std::array<int, 2 * N - 1> sums;
sum_diags_impl<T, N, -N + 1> (source, sums);
return sums;
}
template <typename T, std::size_t N, int K>
typename std::enable_if<K < static_cast<int> (N) - 1>::type
sum_diags_impl (sehn::matrix<T, N> const &matrix, std::array<int, 2 * N - 1> &sums) {
auto diag = sehn::diag<T, N, K> (matrix);
sums[N - 1 + K] = std::accumulate (std::begin (diag), std::end (diag), T{});
sum_diags_impl<T, N, K + 1> (matrix, sums);
}
template <typename T, std::size_t N, int K>
typename std::enable_if<K == static_cast<int> (N) - 1>::type
sum_diags_impl (sehn::matrix<T, N> const &matrix, std::array<int, 2 * N - 1> &sums) {
auto diag = sehn::diag<T, N, K> (matrix);
sums[N - 1 + K] = std::accumulate (std::begin (diag), std::end (diag), T{});
}
#include <utility>
namespace sehn {
template <typename T, std::size_t N>
matrix<T, N> flipud (matrix<T, N> const &source) {
matrix<T, N> clone (source);
for (std::size_t i (0); i < N / 2; ++i)
std::swap (clone[i], clone[N - 1 - i]);
return clone;
}
template <typename T, std::size_t N, int K>
std::array<T, N - std::abs (K)> diag (matrix<T, N> const &source) {
std::array<T, N - std::abs (K)> tmp;
for (std::size_t i (0); i < N; ++i) {
std::size_t j (i + K);
tmp[std::min (i, j)] = source[i][j];
}
return tmp;
}
}
I2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8Y3N0ZGxpYj4KCm5hbWVzcGFjZSBzZWhuIHsKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBzdGQ6OnNpemVfdCBOPgogICAgdXNpbmcgbWF0cml4ID0gc3RkOjphcnJheTxzdGQ6OmFycmF5PFQsIE4+LCBOPjsKICAgIAogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHN0ZDo6c2l6ZV90IE4+CiAgICBtYXRyaXg8VCwgTj4gZmxpcHVkIChtYXRyaXg8VCwgTj4gY29uc3QgJik7CiAgICAKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBzdGQ6OnNpemVfdCBOLCBpbnQgSz4KICAgIHN0ZDo6YXJyYXk8VCwgTiAtIHN0ZDo6YWJzIChLKT4gZGlhZyAobWF0cml4PFQsIE4+IGNvbnN0ICYpOwp9CgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgTj4Kc3RkOjphcnJheTxpbnQsIDIgKiBOIC0gMT4gc3VtX2RpYWdzIChzZWhuOjptYXRyaXg8VCwgTj4gY29uc3QgJik7CgppbnQgbWFpbiAoKSB7CiAgICBzdGQ6OnNpemVfdCBjb25zdCBzaXplICgzKTsKICAgIHNlaG46Om1hdHJpeDxpbnQsIHNpemU+IG0geyB7CiAgICAgICAgICAgMSwgICAyLCAgIDMsCiAgICAgICAgICAxMCwgIDIwLCAgMzAsCiAgICAgICAgIDEwMCwgMjAwLCAzMDAKICAgIH0gfTsKICAgIAogICAgZm9yIChhdXRvIGNvbnN0ICZyb3cgOiBtKSB7CiAgICAgICAgZm9yIChhdXRvIGNvbnN0ICZpdGVtIDogcm93KQogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgaXRlbSA8PCAnXHQnOwogICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogICAgCiAgICBmb3IgKGF1dG8gY29uc3QgJnMgOiBzdW1fZGlhZ3MgKG0pKQogICAgICAgIHN0ZDo6Y291dCA8PCBzIDw8ICdcdCc7CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKICAgIAogICAgYXV0byBmIChzZWhuOjpmbGlwdWQgKG0pKTsKICAgIAogICAgZm9yIChhdXRvIGNvbnN0ICZyb3cgOiBmKSB7CiAgICAgICAgZm9yIChhdXRvIGNvbnN0ICZpdGVtIDogcm93KQogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgaXRlbSA8PCAnXHQnOwogICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogICAgCiAgICBmb3IgKGF1dG8gY29uc3QgJnMgOiBzdW1fZGlhZ3MgKGYpKQogICAgICAgIHN0ZDo6Y291dCA8PCBzIDw8ICdcdCc7CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKICAgIAogICAgcmV0dXJuIDA7Cn0KCiNpbmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUgPG51bWVyaWM+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KCnRlbXBsYXRlIDx0eXBlbmFtZSBULCBzdGQ6OnNpemVfdCBOLCBpbnQgSz4KdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8SyA8IHN0YXRpY19jYXN0PGludD4gKE4pIC0gMT46OnR5cGUKICAgIHN1bV9kaWFnc19pbXBsIChzZWhuOjptYXRyaXg8VCwgTj4gY29uc3QgJiwgc3RkOjphcnJheTxpbnQsIDIgKiBOIC0gMT4gJik7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgTiwgaW50IEs+CnR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPEsgPT0gc3RhdGljX2Nhc3Q8aW50PiAoTikgLSAxPjo6dHlwZQogICAgc3VtX2RpYWdzX2ltcGwgKHNlaG46Om1hdHJpeDxULCBOPiBjb25zdCAmLCBzdGQ6OmFycmF5PGludCwgMiAqIE4gLSAxPiAmKTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCBzdGQ6OnNpemVfdCBOPgpzdGQ6OmFycmF5PGludCwgMiAqIE4gLSAxPiBzdW1fZGlhZ3MgKHNlaG46Om1hdHJpeDxULCBOPiBjb25zdCAmc291cmNlKSB7CiAgICBzdGQ6OmFycmF5PGludCwgMiAqIE4gLSAxPiBzdW1zOwogICAgc3VtX2RpYWdzX2ltcGw8VCwgTiwgLU4gKyAxPiAoc291cmNlLCBzdW1zKTsKICAgIHJldHVybiBzdW1zOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgTiwgaW50IEs+CnR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPEsgPCBzdGF0aWNfY2FzdDxpbnQ+IChOKSAtIDE+Ojp0eXBlCiAgICBzdW1fZGlhZ3NfaW1wbCAoc2Vobjo6bWF0cml4PFQsIE4+IGNvbnN0ICZtYXRyaXgsIHN0ZDo6YXJyYXk8aW50LCAyICogTiAtIDE+ICZzdW1zKSB7CiAgICAgICAgYXV0byBkaWFnID0gc2Vobjo6ZGlhZzxULCBOLCBLPiAobWF0cml4KTsKICAgICAgICBzdW1zW04gLSAxICsgS10gPSBzdGQ6OmFjY3VtdWxhdGUgKHN0ZDo6YmVnaW4gKGRpYWcpLCBzdGQ6OmVuZCAoZGlhZyksIFR7fSk7CiAgICAgICAgc3VtX2RpYWdzX2ltcGw8VCwgTiwgSyArIDE+IChtYXRyaXgsIHN1bXMpOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgTiwgaW50IEs+CnR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPEsgPT0gc3RhdGljX2Nhc3Q8aW50PiAoTikgLSAxPjo6dHlwZQogICAgc3VtX2RpYWdzX2ltcGwgKHNlaG46Om1hdHJpeDxULCBOPiBjb25zdCAmbWF0cml4LCBzdGQ6OmFycmF5PGludCwgMiAqIE4gLSAxPiAmc3VtcykgewogICAgICAgIGF1dG8gZGlhZyA9IHNlaG46OmRpYWc8VCwgTiwgSz4gKG1hdHJpeCk7CiAgICAgICAgc3Vtc1tOIC0gMSArIEtdID0gc3RkOjphY2N1bXVsYXRlIChzdGQ6OmJlZ2luIChkaWFnKSwgc3RkOjplbmQgKGRpYWcpLCBUe30pOwp9CgojaW5jbHVkZSA8dXRpbGl0eT4KCm5hbWVzcGFjZSBzZWhuIHsKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBzdGQ6OnNpemVfdCBOPgogICAgbWF0cml4PFQsIE4+IGZsaXB1ZCAobWF0cml4PFQsIE4+IGNvbnN0ICZzb3VyY2UpIHsKICAgICAgICBtYXRyaXg8VCwgTj4gY2xvbmUgKHNvdXJjZSk7CiAgICAgICAgCiAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpICgwKTsgaSA8IE4gLyAyOyArK2kpCiAgICAgICAgICAgIHN0ZDo6c3dhcCAoY2xvbmVbaV0sIGNsb25lW04gLSAxIC0gaV0pOwogICAgICAgIAogICAgICAgIHJldHVybiBjbG9uZTsKICAgIH0KCgogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHN0ZDo6c2l6ZV90IE4sIGludCBLPgogICAgc3RkOjphcnJheTxULCBOIC0gc3RkOjphYnMgKEspPiBkaWFnIChtYXRyaXg8VCwgTj4gY29uc3QgJnNvdXJjZSkgewogICAgICAgIHN0ZDo6YXJyYXk8VCwgTiAtIHN0ZDo6YWJzIChLKT4gdG1wOwogICAgICAgIAogICAgICAgIGZvciAoc3RkOjpzaXplX3QgaSAoMCk7IGkgPCBOOyArK2kpIHsKICAgICAgICAgICAgc3RkOjpzaXplX3QgaiAoaSArIEspOwogICAgICAgICAgICB0bXBbc3RkOjptaW4gKGksIGopXSA9IHNvdXJjZVtpXVtqXTsKICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgIHJldHVybiB0bXA7CiAgICB9Cn0=