diff --git a/README.md b/README.md index 55fc8e7..71e6dca 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,9 @@ a30b4d51-11b4-49b2-b356-466e92a66df7 Иванов Иван Иванович 16.0 Примеры входного и выходного файлов приложены к настоящему техническому заданию. ## Автор решения - +Бадыков Ильмир Ильдусович ## Описание реализации - +Программа считывает файл result.txt в директории, в которой исполняется код файла new_test.exe. Далее создается словарь, связывающий id с именем в нужном формате, и словарь, выполняющий роль "таблицы" с колонками для id сотрудника и его часами работы. Часы суммируются, группируются по id. Получается таблица с id и суммой часов за неделю. Часы сравниваются с недельной нормой. Далее создается словарь для соответствия id и разницей между часами работы и недельной нормой. В него поадают сотрудники, чья разность проходит проверку на отклонение в 10 процентов. Затем создается список с будущими строчками выходного файла. Выполняется сортировка по всем требованиям. После чего элементы списка объединяются в строчный тип и записываются в выходной файл, который сохраняется в той же директории. + Подробное пошаговое описание приложено в файле new_test.py в виде комментариев. ## Инструкция по сборке и запуску решения +Поместить файлы new_test.exe, report.txt, get_result.bat в одну папку. Открыть файл get_result.bat. Файл result.txt появится в той же папке. \ No newline at end of file diff --git a/get_result.bat b/get_result.bat new file mode 100644 index 0000000..a73b929 --- /dev/null +++ b/get_result.bat @@ -0,0 +1 @@ +python new_test.py \ No newline at end of file diff --git a/new_test.py b/new_test.py new file mode 100644 index 0000000..307436d --- /dev/null +++ b/new_test.py @@ -0,0 +1,53 @@ +import os +'''Запишем в переменную путь к директории, в которой запускается программа для того, чтобы считывать предварительно помещенный в нее входной файл и поместить выходной''' +path = os.path.dirname(os.path.realpath(__file__)).replace('\\', '\\\\') +'''Открываем входной файл и записываем информацию построчно в список''' +with open(path + '\\\\report.txt', encoding='UTF-8') as file: + report = [line.strip('\n') for line in file] +'''Запишем в переменную величину недельной нормы (первую строчку входного файла) в часах''' +weekly_norm = int(report[0]) +split_list = [] + +'''Разобъем оставшуюся часть файла в виде вложенных списков, каждый из которых будет соответствовать колонке исходной "таблицы" входного файла"''' +for i in report[1:]: + split_list.append(i.split()) +'''Создадим словарь соответсвия уникального номера сотрудника и его имени в формате, требуемом для вывода''' +id_name_dict = {i[0]: f'{i[1]} {i[2][0]}. {i[3][0]}.' for i in split_list} + +report_dict = {} +'''Сгруппируем сумму часов работы по уникальному номеру, тем самым получим "таблицу", связывающую уникальный номер сотрудника и сумму его часов работы за неделю''' +for i in split_list: + if i[0] not in report_dict: + report_dict[i[0]] = float(i[-1]) + else: + report_dict[i[0]] += float(i[-1]) + +'''Создадим словарь, в котором заменим "столбец" времени работы на столбец разницы этого времени и недельной нормы. В него мы будем добавлять только тех сотрудников, +разница которых проходит проверку на отклонение в 10 процентов +''' +result_id_dict = {} + +for i in report_dict: + if report_dict[i]/weekly_norm > 1.1 or report_dict[i]/weekly_norm < 0.9: + result_id_dict[i] = report_dict[i] - weekly_norm + + +'''Создадим два результирующих списка для тех, чья разница отрицательная, и для тех, чья положительная''' +result_name_difference_minus = [] +result_name_difference_plus = [] +'''Заполним их строками требуемого формата, пробежавшись по словарю соответствия уникального номера и разницы''' +for i in result_id_dict: + if result_id_dict[i] < 0: + result_name_difference_minus.append(f'{id_name_dict[i]} {result_id_dict[i]}') + if result_id_dict[i] >= 0: + result_name_difference_plus.append(f'{id_name_dict[i]} +{result_id_dict[i]}') +'''Осортируем каждый из списков по алфавиту (в данном случае получится по ФИО) и сложим два списка один за другим, чтобы сначала шли сотрудники с отрицательной разницей''' +result_name_difference_plus = sorted(result_name_difference_plus) +result_name_difference_minus = sorted(result_name_difference_minus) + +result_name_difference = result_name_difference_minus + result_name_difference_plus + + +'''Сформируем выходной файл''' +with open(path + '\\\\result.txt', 'w') as file: + file.write('\n'.join(result_name_difference))