Skip to content

Commit 5c6adce

Browse files
committed
Start of chapter 9 code
1 parent e8f2416 commit 5c6adce

File tree

1 file changed

+76
-1
lines changed

1 file changed

+76
-1
lines changed

Chapter9/main.cpp

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,79 @@
1-
int main()
1+
#include <algorithm>
2+
#include <cassert>
3+
#include <execution>
4+
#include <iostream>
5+
#include <iterator>
6+
#include <map>
7+
#include <numeric>
8+
#include <ranges>
9+
#include <utility>
10+
#include <vector>
11+
12+
// Listing 9.1 Make the first few triangle numbers
13+
std::vector<int> make_triangle_numbers(int count)
14+
{
15+
std::vector<int> numbers(count);
16+
std::iota(numbers.begin(), numbers.end(), 1);
17+
std::partial_sum(numbers.begin(), numbers.end(), numbers.begin());
18+
return numbers;
19+
}
20+
21+
// Listing 9.2 and 9.3 Test our triangle numbers
22+
void check_properties()
23+
{
24+
const int count = 20;
25+
const auto triangle_numbers = make_triangle_numbers(count);
26+
std::vector<int> diffs(count);
27+
std::adjacent_difference(triangle_numbers.begin(), triangle_numbers.end(), diffs.begin());
28+
std::vector<int> numbers(count);
29+
std::iota(numbers.begin(), numbers.end(), 1);
30+
assert(numbers == diffs);
31+
std::adjacent_difference(diffs.begin(), diffs.end(), diffs.begin());
32+
assert(std::all_of(diffs.begin(), diffs.end(), [](int x) { return x == 1; }));
33+
// parallel request
34+
assert(std::count(std::execution::par, diffs.begin(), diffs.end(), 1) == count);
35+
36+
// Check closed form n * (n+1)/2 // TODO an algo rather than an old skool for loop?
37+
for (size_t i=0; i< triangle_numbers.size(); ++i)
38+
{
39+
const int n = i + 1;
40+
assert(triangle_numbers[i] == n*(n+1)/2);
41+
}
42+
}
43+
44+
void demo_further_properties()
245
{
46+
const int count = 20;
47+
const auto triangle_numbers = make_triangle_numbers(count);
48+
std::vector<char> odd_or_even;
49+
std::ranges::transform(triangle_numbers,
50+
std::back_inserter(odd_or_even),
51+
[](int i) { return i % 2 ? '.' : '*'; });
52+
std::ranges::copy(odd_or_even, std::ostream_iterator<char>(std::cout, ""));
53+
std::cout << '\n';
54+
55+
std::map<int, int> last_digits;
56+
//for (int number: triangle_numbers)
57+
//{
58+
// ++last_digits[number % 10];
59+
//}
60+
std::generate_n(std::inserter(last_digits, last_digits.begin()),
61+
10, // how many digits
62+
[n=0, triangle_numbers]() mutable // TODO can I do a const & in the capture... is trasnfrom clearer?
63+
{
64+
auto key_value = std::make_pair(n, std::count_if(triangle_numbers.begin(), triangle_numbers.end(), [n](int i) { return i % 10 == n; }));
65+
++n;
66+
return key_value;
67+
}
68+
);
69+
for (const auto& [key, value] : last_digits)
70+
{
71+
std::cout << key << " : " << value << '\n';
72+
}
73+
}
374

75+
int main()
76+
{
77+
check_properties();
78+
demo_further_properties();
479
}

0 commit comments

Comments
 (0)