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

Мальцева И.С. - решение тестового задания. #19

Open
wants to merge 2 commits 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
22 changes: 19 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 в удобной для Вас среде разработки.
42 changes: 42 additions & 0 deletions solution.py
Original file line number Diff line number Diff line change
@@ -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()