C ++ 11/14/17を使い始めるために、the problem described in this videoをブルートフォースで実行するプログラムを書くことにしました（数秒ごとに進行状況を更新します）：

Divide the numbers [0, 31] into two sets A and B such that

- \$\sum_A {a} = \sum_B{b}\$
- \$\sum_A {a^2} = \sum_B{b^2}\$
- \$\sum_A {a^3} = \sum_B{b^3}\$
- \$\sum_A {a^4} = \sum_B{b^4}\$

このコードをC ++ 14っぽくするにはどうすればよいですか？私の目標は、コードを数学的に賢くしたり、必ずしも高速にすることではありません。私は主に、この問題をブルートフォースで解決するために、妥当な数の最新のC ++標準機能を使用したいと考えていました。

```
#include <vector>
#include <iostream>
#include <numeric>
#include <chrono>
#include <iomanip>
#include <cstdlib>
int main() {
uint32_t split {0};
uint32_t print_mask { 2048 };
auto lastPrintTime = std::chrono::system_clock::now();
auto const SLOWER_THRESHOLD = std::chrono::seconds(5) ;
auto const FASTER_THRESHOLD = std::chrono::seconds(10) ;
while (split < std::numeric_limits<uint32_t>::max()) {
if (split % print_mask == 0) {
double progress_percentage { (split/(double)std::numeric_limits<uint32_t>::max()) * 100.0 };
std::cout << "Currently checking " << std::setw(20) << std::setfill(' ') << split << ", " << std::fixed << progress_percentage << '%' << std::endl;
auto now = std::chrono::system_clock::now();
auto diff = std::chrono::duration_cast<std::chrono::seconds>(now - lastPrintTime);
lastPrintTime = now;
if (diff < SLOWER_THRESHOLD) print_mask *= 2;
if (diff > FASTER_THRESHOLD && print_mask > 10) print_mask /= 2;
}
std::vector<int> va;
std::vector<int> vb;
uint32_t mask {1};
for (int i=0; i<32; i++) {
((mask & split) != 0 ? va : vb).push_back(i);
mask = mask << 1;
}
int sum_a;
int sum_b;
sum_a = std::accumulate(va.begin(), va.end(), 0, [](auto x, auto y){return x + y;});
sum_b = std::accumulate(vb.begin(), vb.end(), 0, [](auto x, auto y){return x + y;});
if (sum_a != sum_b) goto next;
sum_a = std::accumulate(va.begin(), va.end(), 0, [](auto x, auto y){return x + y*y;});
sum_b = std::accumulate(vb.begin(), vb.end(), 0, [](auto x, auto y){return x + y*y;});
if (sum_a != sum_b) goto next;
sum_a = std::accumulate(va.begin(), va.end(), 0, [](auto x, auto y){return x + y*y*y;});
sum_b = std::accumulate(vb.begin(), vb.end(), 0, [](auto x, auto y){return x + y*y*y;});
if (sum_a != sum_b) goto next;
sum_a = std::accumulate(va.begin(), va.end(), 0, [](auto x, auto y){return x + y*y*y*y;});
sum_b = std::accumulate(vb.begin(), vb.end(), 0, [](auto x, auto y){return x + y*y*y*y;});
if (sum_a != sum_b) goto next;
std::cout << "A = " << sum_a << " = [";
for (auto v: va) {
std::cout << v << ", ";
}
std::cout << ']' << std::endl << "B = " << sum_b << " = [";
for (auto v: vb) {
std::cout << v << ", ";
}
std::cout << ']' << std::endl;
break;
next:
split++;
}
puts("Win");
return EXIT_SUCCESS;
}
```

特にベクターの印刷方法に不満があります。`ostream_iterators`

に関するコード例をいくつか見ましたが、これらは私にはさらに悪いように見えました。