正しいフラグでだけコンパイルできます。
初心者向けヒント1: C++の機能
chal.cppでは、C++の様々な言語機能やライブラリ機能を利用しています。constexprキーワードは、変数や関数をコンパイル時に計算できることを表します。static_assertキーワードは、条件が成立するかを確認し、成立しない場合はコンパイルエラーを起こします。chal.cppではその機能をフラグチェッカーとして利用しています。templateキーワードは、関数や型について、型引数や非型引数を抽象化できます。std::index_sequence型は、size_t型の要素のシーケンスを型レベルで表します。std::make_index_sequence型を使うと、0 から始まる指定要素数のシーケンスを作成できます。std::integer_sequence型は、型引数で指定する型の要素のシーケンスを型レベルで表します。chal.cppではstd::uint8_t型のシーケンスを利用しています。template関数中にあるstd::size_t... Iやstd::index_sequence<I...>は、パラメーターパックという機能を使う記法です。関数中でF(I)...のように記述して、パラメーターパックを展開して利用します。[](std::size_t i) { return input_string_view[i]; }のような構文は、C++ のラムダ式を表します。chal.cppでは、my_make_sequence_t型のF型引数として使用しています。decltypeキーワードは、値の型を取得します。chal.cppでは、std::integer_sequence型の値から型を復元するために利用しています。std::is_same_v変数は、2 つの型引数が同一であるかを表します。chal.cppでは、フラグチェッカーの正解判定に利用しています。
- 必要に応じて、より詳細な内容を調べてみると良いでしょう。
初心者向けヒント2: 問題へのアプローチ
convolve_t型やconvolve_impl関数、convolve_element関数が、どのような計算を行っているのかを理解することから始めると良いでしょう。特に、convolve_t型の 2 つの型引数A、Bのシーケンス長と、convolve_t型そのもののシーケンス長の関係が重要です。odd_random_sequence_t型のシーケンスの各要素が何になるかを調べてみましょう。IDE の機能を使うと簡単かもしれません。