Advertisement
Guest User

Untitled

a guest
Mar 21st, 2019
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.44 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <tuple>
  4. #include <string>
  5. #include <experimental/map>
  6. #include <utility>
  7.  
  8. using namespace std;
  9.  
  10. // Перечислимый тип для статуса задачи
  11. enum class TaskStatus {
  12.   NEW,          // новая
  13.   IN_PROGRESS,  // в разработке
  14.   TESTING,      // на тестировании
  15.   DONE          // завершена
  16. };
  17.  
  18. // Объявляем тип-синоним для map<TaskStatus, int>,
  19. // позволяющего хранить количество задач каждого статуса
  20. using TasksInfo = map<TaskStatus, int>;
  21.  
  22. class TeamTasks {
  23. public:
  24.   // Получить статистику по статусам задач конкретного разработчика
  25.   const TasksInfo& GetPersonTasksInfo(const string& person) const{
  26.     return TasksPerPerson.at(person);
  27.   }
  28.  
  29.   // Добавить новую задачу (в статусе NEW) для конкретного разработчитка
  30.   void AddNewTask(const string& person){
  31.     ++TasksPerPerson[person][TaskStatus::NEW];
  32.   }
  33.  
  34.   // Обновить статусы по данному количеству задач конкретного разработчика
  35.   tuple<TasksInfo, TasksInfo> PerformPersonTasks(
  36.       const string& person, int task_count){
  37.         TasksInfo Old = TasksPerPerson[person];
  38.         TasksInfo Updated = TasksPerPerson[person];
  39.         int not_done = Updated[TaskStatus::NEW] + Updated[TaskStatus::IN_PROGRESS] +
  40.                       Updated[TaskStatus::TESTING];
  41.         if(task_count > not_done){
  42.           task_count = not_done;
  43.         }
  44.         vector<pair<int,int>> changes(4);
  45.         for(int i = 0; i < 3; ++i){
  46.           if(Updated[TaskStatus(i)] > task_count){
  47.             Updated[TaskStatus(i)] -= task_count;
  48.             changes[i].second -= task_count;
  49.             changes[i+1].first += task_count;
  50.             Updated[TaskStatus(i+1)] += task_count;
  51.             break;
  52.           } else {
  53.             task_count -= Updated[TaskStatus(i)];
  54.             changes[i].second -= task_count;
  55.             changes[i+1].first += task_count;
  56.             Updated[TaskStatus(i)] = 0;
  57.             Updated[TaskStatus(i+1)] += task_count;
  58.           }
  59.         }
  60.         TasksInfo Untouched;
  61.         TasksInfo Touched;
  62.         for(int i = 0; i < 4; ++i){
  63.           int res = changes[i].first + changes[i].second;
  64.           if(res == 0){
  65.             Touched[TaskStatus(i)] = changes[i].first;
  66.             Untouched[TaskStatus(i)] = changes[i].first;
  67.           } else if(res < 0){
  68.             Untouched[TaskStatus(i)] = Updated[TaskStatus(i)];
  69.             Touched[TaskStatus(i)] = 0;
  70.           } else {
  71.             Untouched[TaskStatus(i)] = 0;
  72.             Touched[TaskStatus(i)] = Updated[TaskStatus(i)];
  73.           }
  74.         }
  75.  
  76.         for (auto *map : {&Touched, &Untouched, &Updated})
  77.           std::experimental::erase_if(*map, [](const auto &x){return x.second == 0;});
  78.  
  79.         TasksPerPerson[person] = Updated;
  80.  
  81.         return tie(Touched,Untouched); /*tie(Updated, Old);*/
  82.       }
  83. private:
  84.     map<string, TasksInfo> TasksPerPerson;
  85. };
  86.  
  87. void PrintTasksInfo(TasksInfo tasks_info) {
  88.   /*
  89.   cout << tasks_info[TaskStatus::NEW] << " new tasks" <<
  90.       ", " << tasks_info[TaskStatus::IN_PROGRESS] << " tasks in progress" <<
  91.       ", " << tasks_info[TaskStatus::TESTING] << " tasks are being tested" <<
  92.       ", " << tasks_info[TaskStatus::DONE] << " tasks are done" << endl;
  93.   */
  94.   string names[4] {"new","in_progress","testing","done"};
  95.  
  96.   for (const auto &it : tasks_info)
  97.     cout << names[int(it.first)] << "=" << it.second << " ";
  98.   cout << '\n';
  99. }
  100.  
  101. int main() {
  102.   TeamTasks tasks;
  103.   auto AddNewTasks = [&](string name, int count)
  104.   {
  105.     while (count-- > 0)
  106.       tasks.AddNewTask(name);
  107.     cout << "--------\n";
  108.   };
  109.   auto PerformPersonTasks = [&](string name, int count)
  110.   {
  111.     auto [a,b] = tasks.PerformPersonTasks(name, count);
  112.     PrintTasksInfo(a);
  113.     cout << "---\n";
  114.     PrintTasksInfo(b);
  115.     cout << "--------\n";
  116.   };
  117.   auto GetPersonTasksInfo = [&](string name)
  118.   {
  119.     PrintTasksInfo(tasks.GetPersonTasksInfo(name));
  120.     cout << "--------\n";
  121.   };
  122.  
  123.   AddNewTasks("Alice", 5);
  124.   PerformPersonTasks("Alice", 5);
  125.   PerformPersonTasks("Alice", 5);
  126.   PerformPersonTasks("Alice", 1);
  127.   AddNewTasks("Alice", 5);
  128.   PerformPersonTasks("Alice", 2);
  129.   GetPersonTasksInfo("Alice");
  130.   PerformPersonTasks("Alice", 4);
  131.   GetPersonTasksInfo("Alice");
  132.  
  133.   return 0;
  134.   for (int i = 0; i < 5; ++i) {
  135.     tasks.AddNewTask("Alice");
  136.   }
  137.   PrintTasksInfo(tasks.GetPersonTasksInfo("Alice"));
  138.  
  139.   TasksInfo updated_tasks, untouched_tasks;
  140.  
  141.   tie(updated_tasks, untouched_tasks) =
  142.       tasks.PerformPersonTasks("Alice", 5);
  143.   /*cout << "Updated Alice tasks: ";
  144.   PrintTasksInfo(updated_tasks);
  145.   cout << "Untouched Alice tasks: ";
  146.   PrintTasksInfo(untouched_tasks);*/
  147.   cout << "Result: ";
  148.   PrintTasksInfo(tasks.GetPersonTasksInfo("Alice"));
  149.  
  150.   tie(updated_tasks, untouched_tasks) =
  151.       tasks.PerformPersonTasks("Alice", 5);
  152.   /*cout << "Updated Ivan's tasks: ";
  153.   PrintTasksInfo(updated_tasks);
  154.   cout << "Untouched Ivan's tasks: ";
  155.   PrintTasksInfo(untouched_tasks);
  156.   cout << "Result: ";*/
  157.   PrintTasksInfo(tasks.GetPersonTasksInfo("Alice"));
  158.  
  159.   tie(updated_tasks, untouched_tasks) =
  160.       tasks.PerformPersonTasks("Alice", 1);
  161.   PrintTasksInfo(tasks.GetPersonTasksInfo("Alice"));
  162.   return 0;
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement