diff --git a/README.md b/README.md index 55fc8e7..e10a2a9 100644 --- a/README.md +++ b/README.md @@ -41,8 +41,24 @@ a30b4d51-11b4-49b2-b356-466e92a66df7 Иванов Иван Иванович 16.0 Примеры входного и выходного файлов приложены к настоящему техническому заданию. -## Автор решения +## Автор решения: Мальцева И.С. -## Описание реализации +## Описание реализации: +Открываем файл report.txt для чтения данных, открываем файл result.txt для записи результатов. +Считываем первую строку из файла report.txt, содержащую недельную норму списания, и преобразуем её в число. +Читаем все оставшиеся строки из файла и разбиваем каждую строку на части по пробелам, добавляя их в список. +Создаем два словаря: один для хранения общего времени списаний каждого сотрудника (hours), другой для хранения фамилии и инициалов сотрудников (fio). +Проходим по каждой строке из файла и преобразуем элементы строки в строки. +Если фамилия сотрудника уже есть в словаре fio, добавляем к текущему значению количество списанных часов, если фамилии нет, создаем новую запись в словаре. +Формируем строку с фамилией и инициалами для словаря fio. +Проходим по ключам словаря hours, где сначала проверяем, превышает ли количество списанных часов норму более чем на 10% и добавляем запись с положительным знаком и количеством часов в список answer, затем проверяем, меньше ли количество списанных часов нормы более чем на 10% и добавляем запись с отрицательным знаком и количеством часов в список answer. +Сортируем список answer сначала по длине подстроки со знаком (чтобы сначала шли отрицательные значения), затем по фамилии с инициалами в алфавитном порядке. +Проходим по списку answer и записываем результаты в файл result.txt в требуемом формате. +Закрываем файлы report.txt и result.txt для завершения работы с ними. -## Инструкция по сборке и запуску решения +## Инструкция по сборке и запуску решения: +Убедитесь, что у вас установлен Python 3, создайте файл report.txt в той же директории, где будет находиться файл с решением - solution.py. +Требования к формату данных в файле report.txt: + в первой строке файла указывается недельная норма списания на одного сотрудника (из расчета дневной нормы списания, равной 8 часам; например, 40 для пятидневной рабочей недели); + во всех последующих строках файла указывается перечень списаний сотрудников в формате отчета “TSR-3”. +Откройте и запустите файл solution.py в удобной для Вас среде разработки. diff --git a/solution.py b/solution.py new file mode 100644 index 0000000..26603db --- /dev/null +++ b/solution.py @@ -0,0 +1,42 @@ +# открытие файлов для чтения и записи +rep = open("report.txt", 'r') +res = open("result.txt", 'w') + +file = [] # для хранения строк из файла +line = [] # для хранения отдельной строки +answer = [] # для хранения конечного результата + +x = float(rep.readline()) # недельная норма списания + +for i in rep: # чтение строк файла и добавление их в список + file.append(i.split(' ')) # разбиение строки по пробелам + +# словари для хранения данных сотрудников +hours = {} # общее время списаний для каждого сотрудника +fio = {} # фамилия и инициалы сотрудника + +# обработка каждой строки из списка file +for i in range(len(file)): + line = list(map(str, file[i])) + if line[0] in hours: + hours[line[0]] += float(line[-1]) # если сотрудник уже есть в словаре, добавляем его часы + else: + hours[line[0]] = float(line[-1]) # если сотрудника нет в словаре, создаем новую запись + fio[line[0]] = line[1] + ' ' + line[2][0] + '.' + line[3][0] + '.' # разбиение строки на фамилию и инициалы + +# определение дизбаланса списаний +for i in hours.keys(): + if hours[i] - x > x * 0.1: + answer.append((fio[i], ' +', hours[i] - x)) # превышение нормы более чем на 10% + elif hours[i] - x < - x * 0.1: + answer.append((fio[i], ' ', hours[i] - x)) # недостача нормы более чем на 10% + +answer.sort(key=lambda x: (len(x[1]), x[0])) # сортировка результатов и формирование требуемого вывода + +# запись результатов в файл +for i in answer: + res.write(i[0] + i[1] + str(i[2]) + '\n') + +# закрытие файлов +rep.close() +res.close()