// https://godbolt.org/z/hYTv6f9eo
#include <ranges>
#include <array>
#include <string>
#include <iostream>
#include <string_view>
using namespace std::literals; using namespace std;
// Funktion für die Ausgabe von allem Möglichen
template <typename OBJ>
void print(OBJ&& obj, int level = 0) {
if constexpr(std::ranges::input_range<OBJ>) { // range
cout << '[';
for (const auto& elem : obj) print(elem, level+1);
cout << ']';
} else if constexpr(requires (OBJ tpl){ std::get<0>(tpl);}) { // tuple/pair
cout << "(";
print(get<0>(obj), level+1); print(get<1>(obj), level+1);
cout << ")";
} else cout << obj; // element
if (level == 0) cout << '\n';
}
int main() {
using namespace std::views; // ausnahmsweise für die Kürze
auto const nums = array{0, 0, 1, 1, 2, 2};
auto const animals = array{"cat"s, "dog"s};
print(iota(0, 5) | chunk(2)); // Ausgabe: [[01][23][4]]
print(nums | chunk_by(equal_to{})); // Ausgabe: [[00][11][22]]
print(iota(0, 5) | slide(3)); // Ausgabe: [[012][123][234]]
print(iota(0, 10) | stride(3)); // Ausgabe: [0369]
print(repeat(8) |take(5)); // Ausgabe: [88888]
print(zip_transform(plus{}, nums, nums)); // Ausgabe: [002244]
print(zip(iota(0, 3), iota(1, 4))); // Ausgabe: [(01)(12)(23)]
print(iota(0, 4) | adjacent<2>); // Ausgabe: [(01)(12)(23)]
print(iota(0, 4) | pairwise); // Ausgabe: [(01)(12)(23)]
print(iota(0, 4) | adjacent_transform<2>(plus{})); // Ausgabe: [135]
print(iota(0, 4) | pairwise_transform(plus{})); // Ausgabe: [135]
print(animals | join_with( '+' )); // Ausgabe: [cat+dog]
print(cartesian_product(iota(0, 2), "AZ"s)); // Ausgabe: [(0A)(0Z)(1A)(1Z)]
print(enumerate("APL"s)); // Ausgabe: [(0A)(1P)(2L)]
return 0;
}