Created
January 23, 2025 07:33
-
-
Save Ruthenus/63d013593373e3609f289b0c6896f7bb to your computer and use it in GitHub Desktop.
Week 6 Homework in IT STEP Academy (list tasks)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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