Coder Social home page Coder Social logo

goit-pycore-hw-03's Introduction

Тема 4. Домашня робота. Робота з датою, часом та розширена робота з рядками

Навички, які ви отримаєте в результаті виконання завдань:

  • Розраховувати кількість днів між заданою та поточною датами.
  • Генерувати набір унікальних випадкових чисел у межах заданих параметрів.
  • Нормалізувати телефонні номери до стандартого формату.
  • Виводити список днів народжень колег на тиждень уперед.

Формат здачі:

  • Розмістіть файли з розв'язанням у репозиторії goit-algo-hw-03, та прикріпіть лінки до них у відповідь на домашнє завдання.
  • Прикріпіть файл репозиторію у форматi zip у відповідь на домашнє завдання.

Технiчний опис завдання

Завдання 1

Створіть функцію get_days_from_today(date), яка розраховує кількість днів між заданою датою і поточною датою.

Вимоги до завдання:

  1. Функція приймає один параметр: date — рядок, що представляє дату у форматі 'РРРР-ММ-ДД' (наприклад, '2020-10-09').
  2. Функція повертає ціле число, яке вказує на кількість днів від заданої дати до поточної. Якщо задана дата пізніша за поточну, результат має бути від'ємним.
  3. У розрахунках необхідно враховувати лише дні, ігноруючи час (години, хвилини, секунди).
  4. Для роботи з датами слід використовувати модуль datetime Python.

Рекомендації для виконання:

  1. Імпортуйте модуль datetime.
  2. Перетворіть рядок дати у форматі 'РРРР-ММ-ДД' у об'єкт datetime.
  3. Отримайте поточну дату, використовуючи datetime.today().
  4. Розрахуйте різницю між поточною датою та заданою датою.
  5. Поверніть різницю у днях як ціле число.

Критерії оцінювання:

  1. Коректність роботи функції: функція повинна точно обраховувати кількість днів між датами.
  2. Обробка винятків: функція має впоратися з неправильним форматом вхідних даних.
  3. Читабельність коду: код повинен бути чистим і добре документованим.

Приклад:

Якщо сьогодні 5 травня 2021 року, виклик get_days_from_today("2021-10-09") повинен повернути 157, оскільки 9 жовтня 2021 року є на 157 днів пізніше від 5 травня 2021 року.

Завдання 2

Щоб виграти головний приз лотереї, необхідний збіг кількох номерів на лотерейному квитку з числами, що випали випадковим чином і в певному діапазоні під час чергового тиражу. Наприклад, необхідно вгадати шість чисел від 1 до 49 чи п'ять чисел від 1 до 36 тощо.

Вам необхідно написати функцію get_numbers_ticket(min, max, quantity), яка допоможе генерувати набір унікальних випадкових чисел для таких лотерей. Вона буде повертати випадковий набір чисел у межах заданих параметрів, причому всі випадкові числа в наборі повинні бути унікальні.

Вимоги до завдання:

  1. Параметри функції: min - мінімальне можливе число у наборі (не менше 1). max - максимальне можливе число у наборі (не більше 1000). quantity - кількість чисел, які потрібно вибрати (значення між min і max).
  2. Функція генерує вказану кількість унікальних чисел у заданому діапазоні.
  3. Функція повертає список випадково вибраних, відсортованих чисел. Числа в наборі не повинні повторюватися. Якщо параметри не відповідають заданим обмеженням, функція повертає пустий список.

Рекомендації для виконання:

  1. Переконайтеся, що вхідні параметри відповідають заданим обмеженням.
  2. Використовуйте модуль random для генерації випадкових чисел.
  3. Використовуйте множину або інший механізм для забезпечення унікальності чисел.
  4. Пам'ятайте, що функція get_numbers_ticket повертає відсортований список унікальних чисел.

Критерії оцінювання:

  1. Валідність вхідних даних: функція повинна перевіряти коректність параметрів.
  2. Унікальність результату: усі числа у видачі повинні бути унікальними.
  3. Відповідність вимогам: результат має бути у вигляді відсортованого списку.
  4. Читабельність коду: код має бути чистим і добре документованим.

Приклад:

Припустимо, вам потрібно вибрати 6 унікальних чисел для лотерейного квитка, де числа повинні бути у діапазоні від 1 до 49. Ви можете використати вашу функцію так:

lottery_numbers = get_numbers_ticket(1, 49, 6)
print("Ваші лотерейні числа:", lottery_numbers)

Цей код викликає функцію get_numbers_ticket з параметрами min=1, max=49 та quantity=6. В результаті ви отримаєте список з 6 випадковими, унікальними та відсортованими числами, наприклад, [4, 15, 23, 28, 37, 45]. Кожен раз при виклику функції ви отримуватимете різний набір чисел.

Завдання 3

У вашій компанії ведеться активна маркетингова кампанія за допомогою SMS-розсилок. Для цього ви збираєте телефонні номери клієнтів із бази даних, але часто стикаєтеся з тим, що номери записані у різних форматах. Наприклад:

" +38(050)123-32-34"
" 0503451234"
"(050)8889900"
"38050-111-22-22"
"38050 111 22 11 "

Ваш сервіс розсилок може ефективно відправляти повідомлення лише тоді, коли номери телефонів представлені у коректному форматі. Тому вам необхідна функція, яка автоматично нормалізує номери телефонів до потрібного формату, видаляючи всі зайві символи та додаючи міжнародний код країни, якщо потрібно.

Розробіть функцію normalize_phone(phone_number), що нормалізує телефонні номери до стандартного формату, залишаючи тільки цифри та символ '+' на початку. Функція приймає один аргумент - рядок з телефонним номером у будь-якому форматі та перетворює його на стандартний формат, залишаючи тільки цифри та символ '+'. Якщо номер не містить міжнародного коду, функція автоматично додає код '+38' (для України). Це гарантує, що всі номери будуть придатними для відправлення SMS.

Вимоги до завдання:

  1. Параметр функції phone_number - це рядок з телефонним номером у різноманітних форматах.
  2. Функція видаляє всі символи, крім цифр та символу '+'.
  3. Якщо міжнародний код відсутній, функція додає код '+38'. Це враховує випадки, коли номер починається з '380' (додається лише '+') та коли номер починається без коду (додається '+38').
  4. Функція повертає нормалізований телефонний номер у вигляді рядка.

Рекомендації для виконання:

  1. Використовуйте модуль re для регулярних виразів для видалення непотрібних символів.
  2. Перевірте, чи номер починається з '+', і виправте префікс згідно з вказівками.
  3. Видаліть всі символи, крім цифр та '+', з номера телефону.
  4. На забувайте повертати нормалізований номер телефону з функції.

Критерії оцінювання:

  1. Коректність роботи функції: функція має правильно обробляти різні формати номерів, враховуючи наявність або відсутність міжнародного коду.
  2. Читабельність коду: код має бути чистим, добре організованим і добре документованим.
  3. Правильне використання регулярних виразів для видалення зайвих символів та форматування номера.

Приклад використання:

raw_numbers = [
"067\\t123 4567",
"(095) 234-5678\\n",
"+380 44 123 4567",
"380501234567",
" +38(050)123-32-34",
" 0503451234",
"(050)8889900",
"38050-111-22-22",
"38050 111 22 11 ",
]

sanitized_numbers = [normalize_phone(num) for num in raw_numbers]
print("Нормалізовані номери телефонів для SMS-розсилки:", sanitized_numbers)

У результаті ви повинні отримати список номерів у стандартному форматі, готових до використання у SMS-розсилці.

Нормалізовані номери телефонів для SMS-розсилки: ['+380671234567', '+380952345678', '+380441234567', '+380501234567', '+380501233234', '+380503451234', '+380508889900', '+380501112222', '+380501112211']

Завдання 4

У межах вашої організації, ви відповідаєте за організацію привітань колег з днем народження. Щоб оптимізувати цей процес, вам потрібно створити функцію get_upcoming_birthdays, яка допоможе вам визначати, кого з колег потрібно привітати. Функція повинна повернути список всіх у кого день народження вперед на 7 днів включаючи поточний день.

У вашому розпорядженні є список users, кожен елемент якого містить інформацію про ім'я користувача та його день народження. Оскільки дні народження колег можуть припадати на вихідні, ваша функція також повинна враховувати це та переносити дату привітання на наступний робочий день, якщо необхідно.

Вимоги до завдання:

  1. Параметр функції users - це список словників, де кожен словник містить ключі name (ім'я користувача, рядок) та birthday (день народження, рядок у форматі 'рік.місяць.дата').
  2. Функція має визначати, чиї дні народження випадають вперед на 7 днів включаючи поточний день. Якщо день народження припадає на вихідний, дата привітання переноситься на наступний понеділок.
  3. Функція повертає список словників, де кожен словник містить інформацію про користувача (ключ name) та дату привітання (ключ congratulation_date, дані якого у форматі рядка 'рік.місяць.дата').

Рекомендації для виконання:

  1. Припускаємо, що ви отримали список users, де кожен словник містить name (ім'я користувача) та birthday (дата народження у форматі рядка 'рік.місяць.дата'). Ви повинні перетворити дати народження з рядків у об'єкти datetime. Конвертуйте дату народження із рядка у datetime об'єкт - datetime.strptime(user["birthday"], "%Y.%m.%d").date(). Оскільки потрібна лише дата (без часу), використовуйте .date() для отримання тільки дати.
  2. Визначте поточну дату системи за допомогою datetime.today().date().
  3. Пройдіться по списку users та аналізуйте дати народження кожного користувача (for user in users:).
  4. Перевірте, чи вже минув день народження в цьому році (if birthday_this_year < today). Якщо так, розгляньте дату на наступний рік.
  5. Визначте різницю між днем народження та поточним днем для визначення днів народження на наступний тиждень.
  6. Перевірте, чи день народження припадає на вихідний. Якщо так, перенесіть дату привітання на наступний понеділок.
  7. Створіть структуру даних, яка зберігатиме ім'я користувача та відповідну дату привітання, якщо день народження відбувається протягом наступного тижня.
  8. Виведіть зібрані дані у вигляді списку словників з іменами користувачів та датами привітань.

Критерії оцінювання:

  1. Актуальність та коректність визначення днів народження на 7 днів вперед.
  2. Правильність обробки випадків, коли дні народження припадають на вихідні.
  3. Читабельність та структурованість коду.

Приклад:

Припустимо, у вас є список users:

users = [
{"name": "John Doe", "birthday": "1985.01.23"},
{"name": "Jane Smith", "birthday": "1990.01.27"}
]

Використання функції get_upcoming_birthdays:

upcoming_birthdays = get_upcoming_birthdays(users)
print("Список привітань на цьому тижні:", upcoming_birthdays)

Якщо сьогодні 2024.01.22 результатом може бути:

[
{'name': 'John Doe', 'congratulation_date': '2024.01.23'},
{'name': 'Jane Smith', 'congratulation_date': '2024.01.29'}
]

Цей список містить інформацію про те, кого і коли потрібно привітати з днем народження.

goit-pycore-hw-03's People

Contributors

ynazymko12 avatar

Stargazers

 avatar  avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.