@csyleler

Как решить задачу на определения ближайшего др сотрудника?

Сотрудники организации Дан список сотрудников организации, в котором указаны их фамилии, имена и даты рождения. Напишите программу, которая определяет самого молодого сотрудника, празднующего свой день рождения в течение ближайших семи дней от текущей даты.

Формат входных данных На вход программе в первой строке подается текущая дата в формате DD.MM.YYYY, в следующей строке вводится натуральное число n — количество сотрудников, работающих в организации. В последующих n строках вводятся данные о каждом сотруднике: имя, фамилия и дата рождения, разделённые пробелом. Дата рождения указывается в формате DD.MM.YYYY.

Формат выходных данных Программа должна определить самого молодого сотрудника, празднующего свой день рождения в течение ближайших семи дней, и вывести его имя и фамилию, разделив пробелом. Если таких сотрудников нет, программа должна вывести текст:

Дни рождения не планируются Примечание 1. Гарантируется, что у всех сотрудников даты рождения различны.

Примечание 2. Например, для даты 01.11.2021 ближайшими семью днями являются:

02.11.2021, 03.11.2021, 04.11.2021, 05.11.2021, 06.11.2021, 07.11.2021, 08.11.2021 Написал 2 варианта 1 вариант

from datetime import datetime, timedelta

def find_youngest_birthday(employees, current_date):
    # Преобразуем текущую дату в объект datetime
    current_date = datetime.strptime(current_date, '%d.%m.%Y')
    
    # Инициализируем переменные для хранения самого молодого сотрудника и его даты рождения
    youngest_employee = None
    youngest_age = None
    youngest_birthday = None
    
    # Перебираем всех сотрудников
    for employee in employees:
        # Преобразуем дату рождения сотрудника в объект datetime
        birthday = datetime.strptime(employee['birthday'], '%d.%m.%Y')
        
        # Проверяем, празднует ли сотрудник свой день рождения в течение ближайших семи дней
        if (birthday.replace(year=current_date.year) - current_date).days >= 0 and (birthday.replace(year=current_date.year) - current_date).days <= 7:
            # Рассчитываем возраст сотрудника на момент текущей даты
            age = current_date.year - birthday.year
            if current_date.month < birthday.month or (current_date.month == birthday.month and current_date.day < birthday.day):
                age -= 1
            
            # Если это самый молодой сотрудник, то обновляем переменные
            if youngest_age is None or age < youngest_age:
                youngest_employee = employee
                youngest_age = age
                youngest_birthday = birthday
            elif age == youngest_age and birthday > youngest_birthday:
                youngest_employee = employee
                youngest_birthday = birthday
                
    # Если найден хотя бы один сотрудник, празднующий свой день рождения в течение ближайших семи дней, то возвращаем его имя и фамилию
    if youngest_employee:
        return f"{youngest_employee['name']} {youngest_employee['surname']}"
    else:
        # Иначе возвращаем текст "Дни рождения не планируются"
        return "Дни рождения не планируются"

# Читаем входные данные
current_date = input()
n = int(input())
employees = []
for _ in range(n):
    name, surname, birthday = input().split()
    employees.append({'name': name, 'surname': surname, 'birthday': birthday})

# Вызываем функцию и выводим результат
print(find_youngest_birthday(employees, current_date))

но при тесте 1
Test input: 
14.11.2021 
3 
Иван Петров 16.11.1995 
Петр Сергеев 14.11.1997 
Сергей Романов 17.11.1994

Test output: Петр Сергеев вместо Иван Петров

2 вариант

from datetime import datetime, timedelta

# Функция для парсинга даты из строки
def parse_date(date_str):
    return datetime.strptime(date_str, '%d.%m.%Y')

# Чтение текущей даты
current_date_str = input().strip()
current_date = parse_date(current_date_str)

# Определение диапазона дней
start_date = current_date + timedelta(days=1)
end_date = current_date + timedelta(days=7)

# Чтение количества сотрудников
n = int(input().strip())

# Список для хранения ближайших дней рождений
birthdays = []

# Обработка данных сотрудников
for _ in range(n):
    employee_data = input().strip()
    name, surname, birth_date_str = employee_data.split()
    birth_date = parse_date(birth_date_str)
    
    # Получаем день и месяц рождения, устанавливаем год на текущий
    birth_day_month = birth_date.replace(year=current_date.year)
    
    # Проверяем, попадает ли день рождения в диапазон
    if start_date <= birth_day_month <= end_date:
        birthdays.append((birth_day_month, name, surname))

# Если есть дни рождения, определяем самого молодого
if birthdays:
    # Сортировка по дате рождения
    birthdays.sort(key=lambda x: x[0])  # Сортируем по дате
    # Вывод имен самого молодого в диапазоне
    print(birthdays[0][1], birthdays[0][2])  # Молодой — это первый после сортировки
else:
    print("Дни рождения не планируются")

при тесте 4
10.11.2021 
5 
Иван Петров 11.11.1995 
Петр Сергеев 12.11.1992 
Сергей Романов 13.11.1996 
Роман Григорьев 14.11.1994 
Григорий Иванов 15.11.1995

`выводит Иван Петров вместо Сергея Романова
  • Вопрос задан
  • 119 просмотров
Пригласить эксперта
Ответы на вопрос 2
Vindicar
@Vindicar
RTFM!
# Проверяем, попадает ли день рождения в диапазон
if start_date <= birth_day_month <= end_date:
    birthdays.append((birth_day_month, name, surname))

А с какого перепуга ты в список birthdays добавляешь модифицированную дату birth_day_month вместо оригинальной birth_date?
Ответ написан
Комментировать
grantur5707
@grantur5707
Full Stack Web Developer
У тебя в первом варианте программы логика сравнения возраста работает некорректно - необходимо сравнивать день рождения и текущую дату, учитывая текущий год.
Во втором варианте программы осуществляется сортировка только по дате рождения, но не по возрасту.

Исправленный итоговый вариант:

from datetime import datetime, timedelta

def find_youngest_birthday(employees, current_date):
    current_date = datetime.strptime(current_date, '%d.%m.%Y')
    
    start_date = current_date + timedelta(days=1)
    end_date = current_date + timedelta(days=7)
    
    youngest_employee = None
    youngest_birthday = None
    youngest_age = None
    
    for employee in employees:
        birthday = datetime.strptime(employee['birthday'], '%d.%m.%Y')
        
        birthday_this_year = birthday.replace(year=current_date.year)
        
        if start_date <= birthday_this_year <= end_date:
            age = current_date.year - birthday.year
            if current_date.month < birthday.month or (current_date.month == birthday.month and current_date.day < birthday.day):
                age -= 1
            
            if youngest_employee is None or age < youngest_age:
                youngest_employee = employee
                youngest_age = age
                youngest_birthday = birthday_this_year
            elif age == youngest_age and birthday_this_year > youngest_birthday:
                youngest_employee = employee
                youngest_birthday = birthday_this_year

    if youngest_employee:
        return f"{youngest_employee['name']} {youngest_employee['surname']}"
    else:
        return "Дни рождения не планируются"

current_date = input()
n = int(input())
employees = []
for _ in range(n):
    name, surname, birthday = input().split()
    employees.append({'name': name, 'surname': surname, 'birthday': birthday})

print(find_youngest_birthday(employees, current_date))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы