Skip to content

Instantly share code, notes, and snippets.

@Ruthenus
Created January 23, 2025 07:33
Show Gist options
  • Save Ruthenus/63d013593373e3609f289b0c6896f7bb to your computer and use it in GitHub Desktop.
Save Ruthenus/63d013593373e3609f289b0c6896f7bb to your computer and use it in GitHub Desktop.
Week 6 Homework in IT STEP Academy (list tasks)
import random
import time
# ПОЧАТОК КОДУ ЗАДАЧІ
print("\tЗАВДАННЯ 2\n")
# Створити список із 20 випадкових чисел. Вивести всі елементи масиву
# з парними індексами.
# Список із 20 випадкових чисел з плаваючою комою в інтервалі [0.0; 1.0)
random_numbers = [random.random() for _ in range(20)]
# Друкуємо всі елементи з парними індексами в сформованому списку:
print([random_numbers[i] for i in range(0, len(random_numbers), 2)])
print("–" * 80 + "\n")
# КІНЕЦЬ КОДУ ЗАДАЧІ
# ПОЧАТОК КОДУ ЗАДАЧІ
print("\tЗАВДАННЯ 3\n")
# Написати програму, яка пропонує користувачу ввести число і потім
# підраховує, скільки разів це число зустрічається у списку зі
# 100 випадкових елементів.
try:
integer = int(input("Введіть ціле число: "))
exponent = int(input("Будь ласка, задайте експоненту вибірки: "))
random_numbers = [random.randint(1, 10**exponent) for _ in range(100)]
# Що швидше – списковий метод або алгоритм лінійного пошуку?
t1_start = time.perf_counter_ns()
# Повертає значення (у наносекундах) лічильника продуктивності,
# тобто годинника із найвищою доступною роздільною здатністю для
# вимірювання короткої тривалості.
counter_1 = random_numbers.count(integer)
# https://docs.python.org/3/library/time.html
t1_stop = time.perf_counter_ns()
t1 = t1_stop - t1_start
# https://gist.github.com/sunmeat/9ae09598faf549c7d98f5d175550964d
t2_start = time.perf_counter_ns()
counter_2 = sum(1 for number in random_numbers if number == integer)
t2_stop = time.perf_counter_ns()
t2 = t2_stop - t2_start
if counter_1 == counter_2:
counter = counter_1
print(f"\nЧисло {integer} зустрічається {counter} р. серед", end=" ")
print(f"100 випадкових цілих чисел від 1 до {10 ** exponent}.")
print(f"Методи: count() за {t1} нс, лінійний пошук за {t2} нс.")
else:
print("Errare humanum est...")
except (ValueError, TypeError):
print("Число не теє!")
print("–" * 80 + "\n")
# КІНЕЦЬ КОДУ ЗАДАЧІ
# ПОЧАТОК КОДУ ЗАДАЧІ
print("\tЗАВДАННЯ 4\n")
# Створити список із 200 випадкових чисел у діапазоні від 0 до 200.
# Визначити кількість однозначних, двозначних і тризначних чисел
# у відсотковому співвідношенні.
size = 200 # тризначне число!
random_numbers = [random.randint(0, size) for _ in range(size)]
one_digit = len([m for m in random_numbers if 0 <= m <= 9]) / size * 100
two_digit = len([m for m in random_numbers if 10 <= m <= 99]) / size * 100
three_digit = len([m for m in random_numbers if 100 <= m <= 999]) / size * 100
print("ВІДПОВІДЬ: ")
print(f"\t{one_digit:.1f}% однозначні числа,")
print(f"\t{two_digit:.1f}% двозначні числа,")
print(f"\t{three_digit:.1f}% тризначні числа.")
print(f"ПЕРЕВІРКА: усіх чисел {one_digit + two_digit + three_digit}%.")
print("–" * 80 + "\n")
# КІНЕЦЬ КОДУ ЗАДАЧІ
# ПОЧАТОК КОДУ ЗАДАЧІ
print("\tЗАВДАННЯ 5\n")
# Дано 2 списки розміром M і N відповідно. Необхідно переписати
# у третій список спільні елементи перших двох списків без повторень.
time_start = time.perf_counter()
# Формування довільним чином списків розмірами M і N:
M = 10_000_000
m_elements = [random.randint(-1000*M, 1000*M) for _ in range(M)] # M ** 2
N = 50_000_000
n_elements = [random.randint(-1000*N, 1000*N) for _ in range(N)] # N ** 2
# Відсортуємо обидва списки вбудованим методом:
m_elements.sort()
n_elements.sort()
# Ініціалізація третього списку для спільних елементів без повторень
c_elements = []
# Для пошуку спільних елементів застосуємо метод подвійного вказівника!
# https://www.kaggle.com/code/liamhealy/python-algorithms-two-pointer
# Ініціалізація вказівників
i, j = 0, 0
# Доки хоча б один з вказівників не досягне кінця свого списку:
while i < len(m_elements) and j < len(n_elements):
if m_elements[i] == n_elements[j]:
# уникаючи додавання повторюваних елементів у третій список
if not c_elements or c_elements[-1] != m_elements[i]:
c_elements.append(m_elements[i])
i += 1
j += 1
elif m_elements[i] < n_elements[j]:
i += 1
else:
j += 1
time_stop = time.perf_counter()
duration = time_stop - time_start
# print(c_elements)
print("Кількість спільних елементів: ", len(c_elements))
# 4936 для randint(-1000*M(N), 1000*M(N)), M = 10_000_000, N = 50_000_000
# 0 для randint(-M(N)**2, M(N)**2), M = 10_000_000, N = 50_000_000
print("Тривалість обчислень, с:", round(duration, 3)) # 82.996 71.559
print("–" * 80 + "\n")
# КІНЕЦЬ КОДУ ЗАДАЧІ
# ПОЧАТОК КОДУ ЗАДАЧІ
print("\tЗАВДАННЯ 6\n")
# Реалізувати програму-лотерею. Програма загадує 5 випадкових
# унікальних чисел у діапазоні від 1 до 42, але не показує їх на екран.
# Користувач намагається їх вгадати – вводить свої 5 чисел із
# клавіатури. Призначити призи за збіги.
print('"Лото-Забава" – фабрика лотерейних мільйонерів! Почнемо!')
winning_ticket = random.sample(range(1, 43), k=5)
# Повертає список довжиною k унікальних елементів, вибраних з
# послідовності популяції. Використовується для випадкової вибірки без
# заміни. https://docs.python.org/3/library/random.html
lottery_ticket = [] # купили лотерейний квиток
print("Введіть 5 чисел з Вашого лотерейного квитка: ")
while len(lottery_ticket) < 5:
try:
number = int(input("\t$? "))
if number < 1 or number > 42:
print("Цієї неділі розігруємо числа від 1 до 42!")
elif number in lottery_ticket:
print("Уважніше! Це число вже було!")
else:
lottery_ticket.append(number)
except ValueError:
print("Помилка! Спробуйте ще раз!")
# Шукати співпадіння в списках з 5 елементів можна так:
matches = sum(1 for num in lottery_ticket if num in winning_ticket)
# Переглянули призовий фонд
if matches == 5:
print("Джек-пот! Сто тисяч гривень! Вітаємо абсолютного переможця!")
elif matches == 4:
print("Унікально! Ви вгадали чотири числа! Десять тисяч гривень Ваші!")
elif matches == 3:
print("Неймовірно! Співпало три числа! Ваш приз – одна тисяча гривень!")
else:
print("Зустрінемося наступної неділі!")
# print(winning_ticket)
print("–" * 80 + "\n")
# КІНЕЦЬ КОДУ ЗАДАЧІ
# ПОЧАТОК КОДУ ЗАДАЧІ
print("\tЗАВДАННЯ 7\n")
# Створити список рядків на 3999 елементів. Заповнити його римськими
# числами від 1 до 3999, показати на екрані всі елементи.
roman_list = [] # ініціалізація списку римських чисел розміром size
size = 3999
# Список характерних римських чисел у порядку спадання
roman_numerals = ["M", "CM", "D", "CD", "C", "XC", "L", "XL",
"X", "IX", "V", "IV", "I"]
# Відповідний список індо-арабських чисел
arabic_numerals = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
for arabic_number in range(1, size+1):
roman_number = "" # рядок для збереження римського числа
i = 0 # індекс для перебору списків характерних чисел
while arabic_number > 0:
for _ in range(arabic_number // arabic_numerals[i]):
roman_number += roman_numerals[i]
arabic_number -= arabic_numerals[i]
i += 1
roman_list.append(roman_number)
print(roman_list)
print("–" * 80 + "\n")
# КІНЕЦЬ КОДУ ЗАДАЧІ
# ПОЧАТОК КОДУ ЗАДАЧІ
print("\tЗАВДАННЯ 8\n")
# Ввести число в діапазоні від 0 до 1000000. Озвучити його словами.
# Наприклад, при введенні числа 25 вивести на екран «двадцять п’ять».
print("Увага! Спроба синтезу літературної української мови!")
number = int(input("Будь ласка, введіть ціле число від 0 до 1_000_000: "))
print()
# Передбачимо порожні елементи, щоб полегшити сприймання індексу:
thousands = ['', 'одна тисяча', 'дві тисячі', 'три тисячі',
'чотири тисячі', 'тисяч']
hundreds = ['', 'сто', 'двісті', 'триста', 'чотириста', 'п’ятсот',
'шістсот', 'сімсот', 'вісімсот', 'дев’ятсот']
tens = ['', '', 'двадцять', 'тридцять', 'сорок', 'п’ятдесят', 'шістдесят',
'сімдесят', 'вісімдесят', 'дев’яносто']
teens = ['десять', 'одинадцять', 'дванадцять', 'тринадцять',
'чотирнадцять', 'п’ятнадцять', 'шістнадцять', 'сімнадцять',
'вісімнадцять', 'дев’ятнадцять']
ones = ['', 'один', 'два', 'три', 'чотири', 'п’ять', 'шість', 'сім',
'вісім', 'дев’ять']
# Розгляньмо крайні випадки:
if number == 0:
print("Нуль! Синонім – зеро!")
elif number == 1_000_000:
print("Мільйон! Тисяча тисяч!")
elif number > 1_000_000 or number < 0:
print("Спробуйте ще раз ввести число в прийнятному діапазоні.")
numeral = [] # наш майбутній числівник
thousand = "" # змінна з царини української граматики!
# Обробляємо сотки тисяч, коли вони є:
if 100_000 <= number < 1_000_000:
numeral.append(hundreds[number//100_000])
number = number % 100_000
thousand = thousands[-1]
# Обробляємо десятки тисяч, які були чи утворилися, та й не тільки їх:
if 10_000 <= number < 100_000:
quotient = number // 1_000
if 10 <= quotient < 20:
numeral.append(teens[quotient-10]) # числівники-тінейджери!
if 20 <= quotient < 100:
numeral.append(tens[quotient//10])
number = number % 10_000 # і знову до наступної умови if
thousand = thousands[-1]
# Обробляємо тисячі
if 1000 <= number < 10_000:
quotient = number // 1000
if 1 <= quotient <= 4: # найцікавіші сходи if-elif-else у цій програмі
thousand = thousands[quotient]
else:
numeral.append(ones[quotient])
thousand = thousands[-1]
number = number % 1000
# if thousand == thousand[-1]:
numeral.append(thousand)
# Обробляємо сотні, десятки та одиниці:
if 100 <= number < 1000:
numeral.append(hundreds[number//100])
number = number % 100
if 20 <= number < 100:
numeral.append(tens[number//10])
number = number % 10
if 10 <= number < 20:
numeral.append(teens[number-10])
if 0 < number < 10:
numeral.append(ones[number])
if len(numeral) > 1:
numeral[-1] += "!"
numeral = " ".join(numeral).strip()
print(numeral.capitalize())
print("–" * 80 + "\n")
# КІНЕЦЬ КОДУ ЗАДАЧІ
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment