Skip to content

Instantly share code, notes, and snippets.

@Ruthenus
Created January 31, 2025 22:25
Show Gist options
  • Save Ruthenus/ac32fe7c4101adaba6ecf57d5d7094fd to your computer and use it in GitHub Desktop.
Save Ruthenus/ac32fe7c4101adaba6ecf57d5d7094fd to your computer and use it in GitHub Desktop.
Week 7 Homework in IT STEP Academy (functions tasks)
import os
os.system("cls")
# ПОЧАТОК КОДУ ЗАДАЧІ
print("\tЗАВДАННЯ 2\n")
# Написати функцію draw_rectangle, яка виводить на екран прямокутник.
# Функція приймає такі параметри: ширина, висота, символ рамки,
# символ заповнення. У функції мають бути параметри за замовчуванням.
def draw_rectangle(width, height, border="#", fill="*_"):
"""Виводить на екран прямокутник, заповнений символами за шаблоном."""
if width < 2 or height < 2:
print("У прямокутника ширина та висота – не менше 2. Виправте!")
return
for row in range(height):
if row == 0 or row == height - 1:
print(border * width)
else:
fill_area = ""
for i in range(width - 2):
fill_area += fill[(i) % len(fill)]
print(border + fill_area + border)
draw_rectangle(29, 11)
print("–" * 80 + "\n")
# КІНЕЦЬ КОДУ ЗАДАЧІ
# ПОЧАТОК КОДУ ЗАДАЧІ
print("\tЗАВДАННЯ 3\n")
# Написати функцію, яка перевіряє, чи є передане їй число простим
# (і повертає True або False). Число називається простим, якщо воно
# ділиться без залишку тільки на себе і на одиницю.
def the_prime_number(natural: int) -> bool:
"""Перевірка простоти числа – чи це правда, чи ні. Аргумент – ціле число
(натуральне!), очікуваний результат – булеве значення."""
assert isinstance(natural, int), "Введене число має бути цілим."
# твердження про належність до класу цілих та невід'ємних чисел.
assert natural >= 0, "Просте число за визначенням не може бути від'ємним."
if natural <= 1: # або нуль, або одиниця, коли assert без помилок
return False
for divisor in range(2, int(natural**0.5) + 1):
if natural % divisor == 0:
return False
return True
# https://oeis.org/A000668
mersenne_primes = [3, 7, 31, 127, 8191, 131071, 524287, 2147483647]
for prime in mersenne_primes:
print(the_prime_number(prime))
try:
number = int(input("Число просте? Введіть для перевірки: "))
if the_prime_number(number):
print(f"Це правда! Число {number} – просте.")
else:
print(f"Брехня!!! Число {number} не просте, хіба не видно?!")
except ValueError: # якщо число дробове, не доходить до AssertionError
print("Ви в чомусь помиляєтеся.")
# Невипадково ввів з клавіатури прості числа 82589933 та 999999000001.
print("–" * 80 + "\n")
# КІНЕЦЬ КОДУ ЗАДАЧІ
# ПОЧАТОК КОДУ ЗАДАЧІ
print("\tЗАВДАННЯ 6\n")
# Написати функцію, що показує на екрані мінімум і максимум
# (значення та індекс) серед елементів переданого їй списку.
def print_minimax_in_list(list_with_numbers):
"""Виводить на екран мінімум та максимум серед чисел списку."""
minimum = min(list_with_numbers)
maximum = max(list_with_numbers)
min_indexes = [] # для індексів однакових мінімальних значень
# https://acode.com.ua/function-enumerate-python/
for index, value in enumerate(list_with_numbers):
if value == minimum:
min_indexes.append(index)
max_indexes = [] # для індексів однакових максимальних значень
for index, value in enumerate(list_with_numbers):
if value == maximum:
max_indexes.append(index)
print(f"Мінімальне значення: {minimum}, індекс(и): {min_indexes}")
print(f"Максимальне значення: {maximum}, індекс(и): {max_indexes}")
print_minimax_in_list([31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31])
print("–" * 80 + "\n")
# КІНЕЦЬ КОДУ ЗАДАЧІ
# ПОЧАТОК КОДУ ЗАДАЧІ
print("\tЗАВДАННЯ 7\n")
# Написати функцію, яка приймає дві дати (тобто функція приймає шість
# параметрів) і обчислює різницю в днях між цими датами.
def period(day_1, month_1, year_1, day_2, month_2, year_2):
"""Обчислює період у днях між двома датами."""
def is_leap_year(year):
"""Допоміжна функція для визначення, чи рік є високосний."""
return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0
# Кількість днів за місяцями звичайного року
days_in_month = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
def is_correct_date(day, month, year):
"""Допоміжна функція для перевірки правильності дати."""
if day < 1 or month < 1 or month > 12:
return False
if month == 2 and is_leap_year(year):
return day <= 29
return day <= days_in_month[month-1]
# Якщо одна з дат неправильна, ініціюємо повідомлення про помилку!
if not is_correct_date(day_1, month_1, year_1) or \
not is_correct_date(day_2, month_2, year_2):
raise ValueError("Помилка в даті!")
def day_in_year(day, month, year):
"""Допоміжна функція для обчислення кількості днів з початку року."""
days = sum(days_in_month[:month-1]) + day
# просумували дні в попередніх місяцях
if month > 2 and is_leap_year(year):
days += 1
return days
# Тіло основної функції
period_in_days = 0
if year_1 > year_2: # у такому разі функція range() не працюватиме
day_1, month_1, year_1, day_2, month_2, year_2 = \
day_2, month_2, year_2, day_1, month_1, year_1
for year in range(year_1, year_2):
period_in_days += 366 if is_leap_year(year) else 365
period_in_days += day_in_year(day_2, month_2, year_2) - \
day_in_year(day_1, month_1, year_1)
return abs(period_in_days)
# Тестування функції period()
try:
days_and_nights = period(31, 1, 2025, 24, 2, 2022)
print(f"Різниця в днях між цими датами: {days_and_nights}")
except ValueError as error:
print(error)
print("–" * 80 + "\n")
# КІНЕЦЬ КОДУ ЗАДАЧІ
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment