Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Uploaded CROC test case #16

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 появится в той же папке.
1 change: 1 addition & 0 deletions get_result.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
python new_test.py
53 changes: 53 additions & 0 deletions new_test.py
Original file line number Diff line number Diff line change
@@ -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))