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 ()
2
45
{
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
+ }
3
74
75
+ int main ()
76
+ {
77
+ check_properties ();
78
+ demo_further_properties ();
4
79
}
0 commit comments