Advertisement
Galebickosikasa

Untitled

May 31st, 2021
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.96 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cmath>
  3. #include <iostream>
  4. #include <map>
  5. #include <string>
  6. #include <vector>
  7. #include <set>
  8. #include <unordered_map>
  9. #include <queue>
  10.  
  11. #include "test_runner.h"
  12.  
  13. using namespace std;
  14.  
  15. void super_tests ();
  16.  
  17. enum class Gender {
  18. FEMALE,
  19. MALE
  20. };
  21.  
  22. struct Person {
  23. int age;
  24. Gender gender;
  25. bool is_employed;
  26. };
  27.  
  28.  
  29. template <typename InputIt>
  30. int ComputeMedianAge(InputIt range_begin, InputIt range_end) {
  31. vector<typename iterator_traits<InputIt>::value_type> range_copy(
  32. range_begin,
  33. range_end
  34. );
  35. auto middle = begin(range_copy) + range_copy.size() / 2;
  36. nth_element(
  37. begin(range_copy), middle, end(range_copy),
  38. [](const Person& lhs, const Person& rhs) {
  39. return lhs.age < rhs.age;
  40. }
  41. );
  42. return middle->age;
  43. }
  44.  
  45. bool operator==(const Person& lhs, const Person& rhs) {
  46. return lhs.age == rhs.age
  47. && lhs.gender == rhs.gender
  48. && lhs.is_employed == rhs.is_employed;
  49. }
  50.  
  51. ostream& operator<<(ostream& stream, const Person& person) {
  52. return stream << "Person(age=" << person.age
  53. << ", gender=" << static_cast<int>(person.gender)
  54. << ", is_employed=" << boolalpha << person.is_employed << ")";
  55. }
  56.  
  57. struct AgeStats {
  58. int total;
  59. int females;
  60. int males;
  61. int employed_females;
  62. int unemployed_females;
  63. int employed_males;
  64. int unemployed_males;
  65. };
  66.  
  67. vector<Person> ReadPersons(istream& in_stream = cin) {
  68. int person_count;
  69. in_stream >> person_count;
  70. vector<Person> persons;
  71. persons.reserve(person_count);
  72. for (int i = 0; i < person_count; ++i) {
  73. int age, gender, is_employed;
  74. in_stream >> age >> gender >> is_employed;
  75. Person person{
  76. age,
  77. static_cast<Gender>(gender),
  78. is_employed == 1
  79. };
  80. persons.push_back(person);
  81. }
  82. return persons;
  83. }
  84.  
  85. AgeStats ComputeStats(vector<Person> persons) {
  86. auto females_end = partition(
  87. begin(persons), end(persons),
  88. [](const Person& p) {
  89. return p.gender == Gender::FEMALE;
  90. }
  91. );
  92. auto employed_females_end = partition(
  93. begin(persons), females_end,
  94. [](const Person& p) {
  95. return p.is_employed;
  96. }
  97. );
  98. auto employed_males_end = partition(
  99. females_end, end(persons),
  100. [](const Person& p) {
  101. return p.is_employed;
  102. }
  103. );
  104.  
  105. return {
  106. ComputeMedianAge(begin(persons), end(persons)),
  107. ComputeMedianAge(begin(persons), females_end),
  108. ComputeMedianAge(females_end, end(persons)),
  109. ComputeMedianAge(begin(persons), employed_females_end),
  110. ComputeMedianAge(employed_females_end, females_end),
  111. ComputeMedianAge(females_end, employed_males_end),
  112. ComputeMedianAge(employed_males_end, end(persons))
  113. };
  114. }
  115.  
  116. void PrintStats(const AgeStats& stats,
  117. ostream& out_stream = cout) {
  118. out_stream << "Median age = "
  119. << stats.total << endl
  120. << "Median age for females = "
  121. << stats.females << endl
  122. << "Median age for males = "
  123. << stats.males << endl
  124. << "Median age for employed females = "
  125. << stats.employed_females << endl
  126. << "Median age for unemployed females = "
  127. << stats.unemployed_females << endl
  128. << "Median age for employed males = "
  129. << stats.employed_males << endl
  130. << "Median age for unemployed males = "
  131. << stats.unemployed_males << endl;
  132. }
  133.  
  134. void super_tests_median () {
  135. stringstream ss ("23 \n"
  136. "1 1 1\n"
  137. "2 1 1\n"
  138. "3 1 1\n"
  139. "4 1 1\n"
  140. "5 1 0\n"
  141. "6 1 0\n"
  142. "7 1 0\n"
  143. "8 1 0\n"
  144. "9 1 0\n"
  145. "10 1 0\n"
  146. "11 0 1\n"
  147. "12 0 1\n"
  148. "13 0 1\n"
  149. "14 0 1\n"
  150. "15 0 1\n"
  151. "16 1 0 \n"
  152. "17 1 0 \n"
  153. "18 1 0 \n"
  154. "19 1 0 \n"
  155. "20 1 0 \n"
  156. "21 1 0 \n"
  157. "22 1 0 \n"
  158. "23 1 0 ");
  159.  
  160. auto persons = ReadPersons (ss);
  161. auto females_end = partition(
  162. begin(persons), end(persons),
  163. [](const Person& p) {
  164. return p.gender == Gender::FEMALE;
  165. }
  166. );
  167. auto employed_females_end = partition(
  168. begin(persons), females_end,
  169. [](const Person& p) {
  170. return p.is_employed;
  171. }
  172. );
  173. auto employed_males_end = partition(
  174. females_end, end(persons),
  175. [](const Person& p) {
  176. return p.is_employed;
  177. }
  178. );
  179. ASSERT_EQUAL(ComputeMedianAge(begin(persons), end(persons)), 12);
  180. ASSERT_EQUAL(ComputeMedianAge(begin(persons), females_end), 13);
  181. ASSERT_EQUAL(ComputeMedianAge(females_end, end(persons)), 10);
  182. ASSERT_EQUAL(ComputeMedianAge(begin(persons), employed_females_end), 13);
  183. ASSERT_EQUAL(ComputeMedianAge(employed_females_end, females_end), 0);
  184. ASSERT_EQUAL(ComputeMedianAge(females_end, employed_males_end), 3);
  185. ASSERT_EQUAL(ComputeMedianAge(employed_males_end, end(persons)), 17);
  186. }
  187.  
  188. void super_tests_all () {
  189. stringstream ss ("23 \n"
  190. "1 1 1\n"
  191. "2 1 1\n"
  192. "3 1 1\n"
  193. "4 1 1\n"
  194. "5 1 0\n"
  195. "6 1 0\n"
  196. "7 1 0\n"
  197. "8 1 0\n"
  198. "9 1 0\n"
  199. "10 1 0\n"
  200. "11 0 1\n"
  201. "12 0 1\n"
  202. "13 0 1\n"
  203. "14 0 1\n"
  204. "15 0 1\n"
  205. "16 1 0 \n"
  206. "17 1 0 \n"
  207. "18 1 0 \n"
  208. "19 1 0 \n"
  209. "20 1 0 \n"
  210. "21 1 0 \n"
  211. "22 1 0 \n"
  212. "23 1 0 ");
  213. auto stats = ComputeStats (ReadPersons (ss));
  214. ASSERT_EQUAL(stats.total, 12);
  215. ASSERT_EQUAL(stats.females, 13);
  216. ASSERT_EQUAL(stats.males, 10);
  217. ASSERT_EQUAL(stats.employed_females, 13);
  218. ASSERT_EQUAL(stats.unemployed_females, 0);
  219. ASSERT_EQUAL(stats.employed_males, 3);
  220. ASSERT_EQUAL(stats.unemployed_males, 17);
  221. }
  222.  
  223. int main() {
  224. TestRunner tr;
  225. RUN_TEST(tr, super_tests_median);
  226. RUN_TEST(tr, super_tests_all);
  227. }
  228.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement