-
Notifications
You must be signed in to change notification settings - Fork 73
/
Copy path271.md
148 lines (109 loc) · 3.72 KB
/
271.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
141
142
143
144
145
146
147
148
<details open><summary>Info</summary><p>
* **Did you know that C++20 added support for floating point values as non-type template parameters?**
* https://wg21.link/P0127
</p></details><details open><summary>Example</summary><p>
```cpp
template<double Value> constexpr auto value = Value;
int main() {
std::cout << value<4.2>; // prints 4.2
}
```
> https://godbolt.org/z/4cfMPY686
</p></details><details open><summary>Puzzle</summary><p>
* **Can you implement function calc which adds values from `Vl1s...` multipled by all values from `Vls2...`?**
For example : Vl1s = { 1., 2. }, Vl2 { 3., 4.}; calc = (1. * 3. * 4.) + (2. * 3. * 4.)
```cpp
template<double... Values> struct values {};
template<double... Vl1s, double... Vl2s>
[[nodiscard]] consteval auto calc(values<Vl1s...>, values<Vl2s...>) // TODO
template<double Epsilon = 0.1>
[[nodiscard]] consteval auto eq(double a, double b) {
return std::fabs(a - b) < Epsilon;
}
static_assert(eq(1. * 2., calc(values<1.>{}, values<2.>{})));
static_assert(eq(2.*3.*4., calc(values<2.>{}, values<3., 4.>{})));
static_assert(eq(4.2 * 2. * 3. + .1 * 2. * 3., calc(values<4.2, .1>{}, values<2., 3.>{})));
static_assert(eq(1. * 4. * 5. + 2. * 4. * 5., calc(values<1., 2.>{}, values<4., 5.>{})));
```
> https://godbolt.org/z/7KhKaK8jT
</p></details><details><summary>Solutions</summary><p>
```cpp
template<double... Vl1s, double... Vl2s>
[[nodiscard]] consteval auto calc(values<Vl1s...>, values<Vl2s...>) {
constexpr auto mul = (Vl2s * ...);
return ((Vl1s * mul) + ...);
}
```
> https://godbolt.org/z/K7T9czezG
```cpp
template <double... List1, double... List2>
[[nodiscard]] consteval auto calc(values<List1...>, values<List2...>) {
return (0 + ... + (List1 * (1 * ... * List2)));
}
```
> https://godbolt.org/z/fGsjTMnab
```cpp
template<double... Values> struct values {};
template<double... Vl1s, double... Vl2s>
[[nodiscard]] consteval auto calc(values<Vl1s...>, values<Vl2s...>) {
return ((Vl1s * (Vl2s * ...)) + ...);
}
template<double Epsilon = 0.1>
[[nodiscard]] consteval auto eq(double a, double b) {
return std::fabs(a - b) < Epsilon;
}
```
> https://godbolt.org/z/71KaKc4fM
```cpp
template<double... Values> struct values {};
template<double... Vl1s, double... Vl2s>
[[nodiscard]] consteval auto calc(values<Vl1s...>, values<Vl2s...>) {
constexpr auto c = (Vl2s * ...);
return ((Vl1s * c) + ...);
}
template<double Epsilon = 0.1>
[[nodiscard]] consteval auto eq(double a, double b) {
return std::fabs(a - b) < Epsilon;
}
```
> https://godbolt.org/z/s6r8xKEe6
```cpp
template<double... Values> struct values {};
template<double... Vl1s, double... Vl2s>
[[nodiscard]] consteval auto calc(values<Vl1s...>, values<Vl2s...>) {
return (Vl1s + ...) * (Vl2s * ...);
}
template<double Epsilon = 0.1>
[[nodiscard]] consteval auto eq(double a, double b) {
return std::fabs(a - b) < Epsilon;
}
```
> https://godbolt.org/z/nE79Ya6z3
```cpp
template<double... Values> struct values{};
template<double Vl1, double... Vl2s>
[[nodiscard]] consteval auto mult(){
return (Vl1 * ... * Vl2s);
}
template<double... Vl1s, double... Vl2s>
[[nodiscard]] consteval auto calc(values<Vl1s...>, values<Vl2s...>){
return (... + mult<Vl1s, Vl2s...>());
}
template<double Epsilon = 0.1>
[[nodiscard]] consteval auto eq(double a, double b) {
return std::fabs(a - b) < Epsilon;
}
```
> https://godbolt.org/z/KfPefTPbd
```cp
template<double... Values> struct values {};
template<double... Vl1s, double... Vl2s>
[[nodiscard]] consteval auto calc(values<Vl1s...>, values<Vl2s...>){
return (0.0 + ... + (Vl1s * (Vl2s * ... )));
}
template<double Epsilon = 0.1>
[[nodiscard]] consteval auto eq(double a, double b) {
return std::fabs(a - b) < Epsilon;
}
```
> https://godbolt.org/z/M5Y5dnfvY