-
Notifications
You must be signed in to change notification settings - Fork 73
/
Copy path241.md
140 lines (113 loc) · 3.07 KB
/
241.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
<details open><summary>Info</summary><p>
* **Did you know about different ways of accessing C-style arrays by index?**
* http://eel.is/c++draft/dcl.array#def:array
</p></details><details open><summary>Example</summary><p>
```cpp
int main() {
constexpr int array[] = {1, 2, 3};
assert(2[array] == array[2]);
assert(*(array+1) == array[1]);
}
```
> https://godbolt.org/z/5PnPzWvW8
</p></details><details open><summary>Puzzle</summary><p>
* **Can you implement `sum_n` which sums the first N numbers from the array using an altenative access syntax?**
```cpp
template<auto N>
/*TODO*/ auto sum_n(auto);
int main() {
using namespace boost::ut;
"sum_n"_test = [] {
should("return 0 for empty array") = [] {
constexpr int array[] = {};
expect(constant<0 == sum_n<0>(array)>);
};
should("sum N first parameters") = [] {
constexpr int array[] = {1, 2, 3};
expect(constant<0 == sum_n<0>(array)>);
expect(constant<1 == sum_n<1>(array)>);
expect(constant<3 == sum_n<2>(array)>);
expect(constant<6 == sum_n<3>(array)>);
};
};
}
```
> https://godbolt.org/z/5dMrTzGo7
</p></details><details><summary>Solutions</summary><p>
```cpp
template <auto N> constexpr auto sum_n(auto a) {
std::decay_t<decltype(0 [a])> sum{};
for (auto i = 0; i < N; ++i) {
sum += i[a];
}
return sum;
}
```
> https://cpp-tip-of-the-week.godbolt.org/z/51fY56zdc
```cpp
template<auto N>
constexpr auto sum_n(auto arr) {
return [&] <auto... Nth_of> (std::integer_sequence<int, Nth_of...>) {
return (0 + ... + Nth_of[arr]);
}(std::make_integer_sequence<int, N>{});
}
```
> https://godbolt.org/z/K9rcenjME
```cpp
template<auto N>
[[nodiscard]] constexpr auto sum_n(const auto array) {
return [array]<auto... Is>(std::index_sequence<Is...>) {
return (Is[array] + ... + 0);
}(std::make_index_sequence<N>{});
}
```
> https://godbolt.org/z/cjo8MovY8
```cpp
template<auto N>
auto constexpr sum_n(auto arr) {
double sum = 0;
for(uint32_t i=0; i<N; i++)
sum += *(arr+i);
return sum;
}
```
> https://godbolt.org/z/Y6GxMMjx6
```cpp
template <auto I >
auto constexpr get_i(auto const & array)
{
if constexpr (I % 3 == 0 )
return array[I];
else if constexpr (I % 3 == 1)
return I[array];
else
return *(array + I );
}
template<auto N>
auto constexpr sum_n(auto const & array)
{
return [&]<std::size_t ... Is>( std::index_sequence <Is...> const & )
{
return (get_i<Is>(array) + ... + 0 );
}(std::make_index_sequence<N>());
}
```
> https://godbolt.org/z/cx4nfGhvz
```cpp
template <auto N>
constexpr auto sum_n(const auto& array) {
return [&]<auto... Ith_index_of>(std::index_sequence<Ith_index_of...>) {
return (0 + ... + Ith_index_of[array]);
}(std::make_index_sequence<N>{});
}
```
> https://godbolt.org/z/d3Gcaq7Pn
```cpp
template<auto N>
[[nodiscard]] constexpr auto sum_n(const auto array) {
return [array]<auto... Is>(std::index_sequence<Is...>) {
return (Is[array] + ... + 0);
}(std::make_index_sequence<N>{});
}
```
> https://godbolt.org/z/3nf6aKM4r