Как найти ближайшего сотрудника?

Какой алгоритм можно использовать для написания программы, которая определяет самого молодого сотрудника организации, если день его рождения совпадает с ближайшими семью днями от текущей даты? Программа должна принимать на вход текущее число в формате DD.MM.YYYY, количество сотрудников и их данные (имя, фамилию и дату рождения), а также выводить имя и фамилию самого молодого сотрудника или текст "Дни рождения не планируются", если сотрудников с ближайшими днями рождения нет.
  • 24 сентября 2024 г. 16:03
Ответы на вопрос 3
Для решения задачи определения самого молодого сотрудника с ближайшим днем рождения можно использовать следующий алгоритм:

1. **Считывание текущей даты**: Программа должна принимать текущую дату в формате `DD.MM.YYYY` и преобразовывать её в объект `datetime`.
  
2. **Считывание данных о сотрудниках**: Программа должна считывать данные о количестве сотрудников и для каждого из них считывать имя, фамилию и дату рождения.

3. **Преобразование дат рождения**: Программа должна преобразовать даты рождения сотрудников в объект `datetime`. При этом игнорируется год, так как нужно сравнивать только день и месяц.

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

5. **Поиск самого молодого сотрудника**: Из всех сотрудников, чьи дни рождения попадают в ближайшие семь дней, нужно найти самого молодого (т.е., у кого ближайший день рождения).

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

Вот пример реализации программы на Python:

```python
from datetime import datetime, timedelta

def find_youngest_employee(current_date_str, num_employees, employees_data):
    current_date = datetime.strptime(current_date_str, "%d.%m.%Y")
    
    # Определяем ближайшие 7 дней
    upcoming_birthdays = []
    for day_offset in range(7):
        date_to_check = current_date + timedelta(days=day_offset)
        upcoming_birthdays.append((date_to_check.month, date_to_check.day))
    
    youngest_employee = None
    min_days_to_birth = float('inf')
    
    for employee in employees_data:
        name, surname, birthday_str = employee
        birthday = datetime.strptime(birthday_str, "%d.%m.%Y")
        
        # Игнорируем год рождения
        birth_month_day = (birthday.month, birthday.day)
        
        # Проверяем, попадает ли день рождения в ближайшие 7 дней
        if birth_month_day in upcoming_birthdays:
            # Считаем, сколько дней осталось до дня рождения
            days_to_birth = (birthday.replace(year=current_date.year) - current_date).days
            if days_to_birth < 0:
                # Если день рождения уже прошел в этом году
                days_to_birth += 365
            
            # Проверяем, такой ли это самый молодой
            if days_to_birth < min_days_to_birth:
                min_days_to_birth = days_to_birth
                youngest_employee = (name, surname)
    
    if youngest_employee:
        return f"{youngest_employee[0]} {youngest_employee[1]}"
    else:
        return "Дни рождения не планируются"

# Пример ввода
current_date = "15.03.2023"
num_employees = 3
employees = [
    ("Ivan", "Petrov", "18.03.1990"),
    ("Anna", "Sidorova", "15.03.1995"),
    ("Max", "Ivanov", "20.03.1992")
]

# Вызов функции
result = find_youngest_employee(current_date, num_employees, employees)
print(result)
```

### Пояснения к коду:
- Функция `find_youngest_employee` принимает текущую дату, количество сотрудников и список данных о сотрудниках.
- Текущая дата преобразуется в объект `datetime`, и создается список `upcoming_birthdays` с ближайшими днями.
- Далее идет проверка для каждого сотрудника на совпадение дня рождения с ближайшими днями.
- Если находим подходящего сотрудника, сравниваем, является ли он самым молодым, и сохраняем его данные.
- В конце возвращается соответствующий результат.
# Проверяем, попадает ли день рождения в диапазон
if start_date <= birth_day_month <= end_date:
    birthdays.append((birth_day_month, name, surname))

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

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

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))
Похожие вопросы