Advertisement
khaze1

Задача о задачах 2/2

Oct 8th, 2023
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.13 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3. #include <string>
  4. #include <tuple>
  5. #include <vector>
  6.  
  7. using namespace std;
  8.  
  9. // Перечислимый тип для статуса задачи
  10. enum class TaskStatus {
  11.     NEW,          // новая
  12.     IN_PROGRESS,  // в разработке
  13.     TESTING,      // на тестировании
  14.     DONE          // завершена
  15. };
  16.  
  17. // Объявляем тип-синоним для map<TaskStatus, int>,
  18. // позволяющего хранить количество задач каждого статуса
  19. using TasksInfo = map<TaskStatus, int>;
  20.  
  21. TaskStatus GetNextStatus(TaskStatus status){
  22.     TaskStatus next_status;
  23.  
  24.     switch(status){
  25.  
  26.     case TaskStatus::NEW:
  27.         next_status = TaskStatus::IN_PROGRESS;
  28.         break;
  29.     case TaskStatus::IN_PROGRESS:
  30.         next_status = TaskStatus::TESTING;
  31.         break;
  32.     case TaskStatus::TESTING:
  33.         next_status = TaskStatus::DONE;
  34.         break;
  35.     default:
  36.         next_status = TaskStatus::DONE;
  37.         break;
  38.     }
  39.     return next_status;
  40. }
  41.  
  42.  
  43. class TeamTasks {
  44.    
  45. public:
  46. map<string, TasksInfo> person_tasks_info_;
  47.     // Получить статистику по статусам задач конкретного разработчика
  48.     const TasksInfo& GetPersonTasksInfo(const string& person) const{
  49.         auto ptr = person_tasks_info_.find(person);
  50.         //if (ptr == person_tasks_info_.end()) return;
  51.         return ptr->second;
  52.     }
  53.  
  54.     // Добавить новую задачу (в статусе NEW) для конкретного разработчитка
  55.     void AddNewTask(const string& person){
  56.         ++person_tasks_info_[person][TaskStatus::NEW];
  57.     };
  58.     // task_count == 40
  59.     // new 2 -> 0 -> 0 -> 0    
  60.             //   2 -> 0 -> 0    
  61.     // Обновить статусы по данному количеству задач конкретного разработчика,
  62.     // подробности см. ниже
  63.     tuple<TasksInfo, TasksInfo> PerformPersonTasks(const string& person, int task_count){
  64.         TasksInfo updated_tasks, untouched_tasks;
  65.         if (person_tasks_info_.count(person) == 0) return {updated_tasks, untouched_tasks};
  66.  
  67.         for (auto [status, count] : person_tasks_info_[person]){
  68.             if (status == TaskStatus::DONE){
  69.                 continue;;
  70.             }
  71.             if (task_count == 0){
  72.                 untouched_tasks[status] = count;
  73.             }
  74.             else if (count <= task_count){
  75.                 updated_tasks[GetNextStatus(status)] = count;
  76.                 task_count -= count;
  77.             }
  78.             else{
  79.                 updated_tasks[GetNextStatus(status)] = task_count;
  80.                 untouched_tasks[status] = count - task_count;
  81.                 task_count = 0;
  82.             }
  83.         }
  84.         person_tasks_info_[person][TaskStatus::NEW] = untouched_tasks[TaskStatus::NEW];
  85.         for (auto [status, count] : updated_tasks){
  86.             TaskStatus next_status = GetNextStatus(status);
  87.             person_tasks_info_[person][status] += updated_tasks[status] - updated_tasks[next_status];
  88.             if (person_tasks_info_[person][status] == 0){
  89.                 person_tasks_info_[person].erase(status);
  90.             }
  91.         }
  92.         return {updated_tasks, untouched_tasks};
  93.     }
  94. };
  95.  
  96. // Принимаем словарь по значению, чтобы иметь возможность
  97. // обращаться к отсутствующим ключам с помощью [] и получать 0,
  98. // не меняя при этом исходный словарь.
  99. void PrintTasksInfo(TasksInfo tasks_info) {
  100.     cout << tasks_info[TaskStatus::NEW] << " new tasks"s
  101.          << ", "s << tasks_info[TaskStatus::IN_PROGRESS] << " tasks in progress"s
  102.          << ", "s << tasks_info[TaskStatus::TESTING] << " tasks are being tested"s
  103.          << ", "s << tasks_info[TaskStatus::DONE] << " tasks are done"s << endl;
  104. }
  105.  
  106. int main() {
  107.     TeamTasks tasks;
  108.    
  109.     TasksInfo updated_tasks, untouched_tasks;
  110.  
  111.     tasks.person_tasks_info_["Ilia"s][TaskStatus::NEW] = 1;
  112.     //tasks.person_tasks_info_["Ilia"s][TaskStatus::IN_PROGRESS] = 2;
  113.     //tasks.person_tasks_info_["Ilia"s][TaskStatus::TESTING] = 4;
  114.     tasks.person_tasks_info_["Ilia"s][TaskStatus::DONE] = 1;
  115.     PrintTasksInfo(tasks.GetPersonTasksInfo("Ilia"s));
  116.  
  117. /*
  118.     tie(updated_tasks, untouched_tasks) = tasks.PerformPersonTasks("Ivan"s, 2);
  119.     cout << "Updated Ivan's tasks: "s;
  120.     PrintTasksInfo(updated_tasks);
  121.     cout << "Untouched Ivan's tasks: "s;
  122.     PrintTasksInfo(untouched_tasks);
  123.  
  124.     tie(updated_tasks, untouched_tasks) = tasks.PerformPersonTasks("Ivan"s, 100);
  125.     cout << "Updated Ivan's tasks: "s;
  126.     PrintTasksInfo(updated_tasks);
  127.     cout << "Untouched Ivan's tasks: "s;
  128.     PrintTasksInfo(untouched_tasks);
  129. */
  130.     tie(updated_tasks, untouched_tasks) = tasks.PerformPersonTasks("Ilia"s, 1000);
  131.     cout << "Updated Ilia's tasks: "s;
  132.     PrintTasksInfo(updated_tasks);
  133.     cout << "Untouched Ilia's tasks: "s;
  134.     PrintTasksInfo(untouched_tasks);
  135.  
  136.     PrintTasksInfo(tasks.GetPersonTasksInfo("Ilia"s));
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement