Created
January 6, 2025 09:21
-
-
Save Ruthenus/b57782e4f3eec31b3d70757b5aa90502 to your computer and use it in GitHub Desktop.
Week 4 Homework in IT STEP Academy (loops 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 os | |
import random | |
os.system("cls") | |
# Завдання на один простий цикл while/for (мінімум 5 будь-яких задач): | |
# ПОЧАТОК КОДУ ЗАДАЧІ | |
print("\tЗАВДАННЯ I.3\n") | |
# Загадати випадковим чином 100 цілих чисел у діапазоні від -100 до 100. | |
# Обчислити відсоток позитивних чисел, відсоток негативних чисел і | |
# відсоток нулів, а також парних чисел і відсоток непарних. | |
# Оскільки маємо отримати 100 чисел, | |
# розв'язання задачі спростимо, визначаючи відразу відсотки. | |
positives_pct = negatives_pct = nuls_pct = 0 | |
# До речі, нуль – парне число. | |
odd_numbers_pct = even_numbers_pct = 0 | |
while (odd_numbers_pct + even_numbers_pct) < 100: | |
number = random.randint(-100, 100) | |
positives_pct += 1 if number > 0 else 0 | |
negatives_pct += 1 if number < 0 else 0 | |
nuls_pct += 1 if number == 0 else 0 | |
even_numbers_pct += 1 if number % 2 == 0 else 0 | |
odd_numbers_pct += 1 if number % 2 != 0 else 0 | |
print(f"Частка позитивних чисел: {positives_pct}%") | |
print(f"Частка негативних чисел: {negatives_pct}%") | |
print(f"Частка нулів: {nuls_pct}%") | |
print(f"Усього {positives_pct + negatives_pct + nuls_pct}%, з них:") | |
print(f"\tпарних чисел: {even_numbers_pct}%") | |
print(f"\tнепарних чисел: {odd_numbers_pct}%") | |
print("–" * 80 + "\n") | |
# КІНЕЦЬ КОДУ ЗАДАЧІ | |
# ПОЧАТОК КОДУ ЗАДАЧІ | |
print("\tЗАВДАННЯ I.4\n") | |
# Написати програму, яка обчислює факторіал введеного числа. | |
try: | |
number = input("Обчислити факторіал ") | |
number = int(number) | |
if number > 0: | |
factorial = number | |
for natural in range(number, 1, -1): | |
factorial *= natural - 1 | |
print(f"\t\t{number}! = " f"{factorial:_}".replace("_", " ")) | |
elif number == 0: | |
factorial = 1 | |
print(f"\t\t0! = 1\n\t\t1! = 1 * 0! = 1\n\tХіба це не гармонійно?") | |
else: | |
print("КОМПЛЕКСНА НЕСКІНЧЕННІСТЬ") | |
except ValueError: | |
try: | |
number = complex(number) | |
print("Вам пора вивчати мову програмування Wolfram. Мабуть.") | |
except ValueError: | |
print("Спробуйте все-таки ввести невід'ємне ціле число.") | |
print("–" * 100 + "\n") | |
# КІНЕЦЬ КОДУ ЗАДАЧІ | |
# ПОЧАТОК КОДУ ЗАДАЧ | |
print("\tЗАВДАННЯ I.6, I.7\n") | |
# З клавіатури вводиться ціле число. Вивести на екран всі числа, | |
# на які введене число ділиться без залишку. | |
# З клавіатури вводиться ціле число. Визначити, чи є воно простим. | |
# Просте число ділиться без залишку лише на 1 і на саме себе. | |
try: | |
number = abs(int(input("Будь ласка, введіть ціле число: "))) | |
if number != 0 and number != 1: | |
divisors = "1, " | |
k = 0 # кількість дільників числа, крім одиниці та самого себе. | |
for natural in range(2, number): | |
if number % natural == 0: | |
k += 1 | |
divisors += str(natural) + ", " | |
divisors += str(number) + " – дільники числа." | |
print(divisors) | |
if k == 0: | |
print(f"Число {number} – просте.") | |
elif number == 1: | |
print("The 1 is deficient, highly abundant, highly composite number.") | |
else: | |
print("Нуль ділиться на будь-яке число!") | |
# Випадково ввів з клавіатури просте число 784489. | |
except ValueError: | |
print("Звісно, є швидші алгоритми визначення простоти числа.") | |
print("–" * 80 + "\n") | |
# КІНЕЦЬ КОДУ ЗАДАЧ | |
# ПОЧАТОК КОДУ ЗАДАЧІ | |
print("\tЗАВДАННЯ I.8\n") | |
# Перевірити, чи є в введеному числі однакові цифри підряд. | |
number = input("Введіть число: ") | |
# Тут насправді можна ввести послідовність будь-яких символів. | |
foregoing_symbol = "" | |
identical_symbols = False | |
for symbol in number: | |
if symbol == foregoing_symbol: | |
identical_symbols = True | |
break | |
foregoing_symbol = symbol | |
if identical_symbols: | |
print("У введеному числі є однакові цифри підряд.") | |
else: | |
print("У введеному числі немає однакових цифр підряд.") | |
print("–" * 80 + "\n") | |
# КІНЕЦЬ КОДУ ЗАДАЧІ | |
# ПОЧАТОК КОДУ ЗАДАЧІ | |
print("\tЗАВДАННЯ I.9\n") | |
# Визначити, чи є введене число паліндромом. Паліндром — це число, яке | |
# однаково читається як зліва направо, так і справа наліво, | |
# наприклад, 1234321. У цьому завданні (як і в інших завданнях) | |
# не можна використовувати рядки та списки. | |
try: | |
number = input("Введіть число, схоже на паліндром: ") | |
sequence = int(number) | |
palindrome = 0 | |
while sequence > 0: | |
symbol = sequence % 10 | |
palindrome = symbol + 10*palindrome | |
sequence = sequence // 10 | |
if int(number) == palindrome: | |
print(f"Число {number} – паліндром!") | |
else: | |
print(f"Число {number} не є паліндромом.") | |
except ValueError: | |
sequence = number | |
palindrome = "" | |
for symbol in sequence: | |
palindrome = symbol + palindrome | |
if sequence == palindrome: | |
print("Введена послідовність символів – паліндром!") | |
else: | |
print("Придивіться, це не паліндром.") | |
print("–" * 80 + "\n") | |
# КІНЕЦЬ КОДУ ЗАДАЧІ | |
# ПОЧАТОК КОДУ ЗАДАЧІ | |
print("\tЗАВДАННЯ I.10\n") | |
# Написати гру «Вгадай число». Користувач мисленно загадує число від | |
# 0 до 1000, комп'ютер відгадує його за мінімальну кількість спроб. | |
# Я вирішив реалізувати найпростіший алгоритм – випадкового пошуку. | |
enigma = int(input("\tКомп'ютер ніколи не дізнається про число ")) | |
attempts = 0 | |
while True: | |
number = random.randint(0, 1000) | |
attempts += 1 | |
if number != enigma: | |
continue | |
else: | |
print(f"\nIch habe die Zahl in {attempts} Versuchen erraten.") | |
break | |
print("–" * 80 + "\n") | |
# КІНЕЦЬ КОДУ ЗАДАЧІ | |
# ПОЧАТОК КОДУ ЗАДАЧІ | |
print("\tЗАВДАННЯ I.11\n") | |
# Щомісячна стипендія студента складає N гривень, а витрати на | |
# проживання перевищують стипендію і складають M гривень на місяць. | |
# Зростання цін щомісяця збільшує витрати на 5%. Скласти програму | |
# розрахунку суми грошей, яку необхідно одноразово попросити у батьків, | |
# щоб можна було прожити навчальний рік (10 місяців), використовуючи | |
# тільки ці гроші та стипендію. | |
# https://mon.gov.ua/osvita-2/vishcha-osvita-ta-osvita-doroslikh/ | |
# studentski-stipendii | |
# Спеціальність 141 "Електроенергетика, електротехніка та | |
# електромеханіка" – визначено в Переліку: | |
# https://zakon.rada.gov.ua/laws/show/1047-2016-%D0%BF#Text | |
stipendium = 3711 # гривень на місяць | |
m = 15000 # витрати на проживання, гривень на місяць | |
inflation = 0.05 | |
months = 10 | |
month = 1 | |
costs = 0 | |
while month <= months: | |
costs += m | |
month += 1 | |
# Річну інфляцію обчислюють за формулою для складних відсотків: | |
m *= 1 + inflation | |
money_money = (costs - stipendium*months) / 1000 | |
print(f"На поглиблене вивчення електротехніки потрібно {money_money:.0f} тис.") | |
print("–" * 80 + "\n") | |
# КІНЕЦЬ КОДУ ЗАДАЧІ | |
# Завдання на псевдографіку (мінімум 2 будь-які задачі): | |
# ПОЧАТОК КОДУ ЗАДАЧІ | |
print("\tЗАВДАННЯ II.1\n") | |
# Показати на екрані рівнобедрений трикутник висотою N. | |
n = int(input("Якої висоти в 'зірочках' повинен бути трикутник? ")) | |
print("\n") | |
for i in range(n): | |
print("\t" + " " * (n-i-1) + "^" * (2*i + 1)) | |
print("–" * 80 + "\n") | |
# КІНЕЦЬ КОДУ ЗАДАЧІ | |
# ПОЧАТОК КОДУ ЗАДАЧІ | |
print("\tЗАВДАННЯ II.2\n") | |
# Написати програму, яка виводить на екран ромб. | |
side = 8 | |
k = side - 1 # відповідає за пробіли в обох частинах ромба | |
# Верхня частина ромба з трикутних чисел: | |
for i in range(side): | |
for j in range(k): | |
print(" ", end="") | |
k -= 1 | |
for j in range(i+1): | |
print("* ", end="") | |
print("") | |
k = 1 | |
# Нижня частина ромба з трикутних чисел: | |
for i in range(side-2, -1, -1): | |
for j in range(k): | |
print(" ", end="") | |
k += 1 | |
for j in range(i+1): | |
print("* ", end="") | |
print("") | |
print("–" * 80 + "\n") | |
# КІНЕЦЬ КОДУ ЗАДАЧІ | |
# ПОЧАТОК КОДУ ЗАДАЧІ | |
print("\tЗАВДАННЯ II.5\n") | |
# Ялинка зi слайду в кiнцi презентації. | |
# Кількість та висота ярусів гілок: | |
tiers_number, tier_height = 5, 5 | |
# Ширина (непарне число) та висота стовбура: | |
trunk_width, trunk_height = 3, 5 | |
# Геометричне моделювання гілок: | |
for m in range(tiers_number): | |
for i in range(tier_height): | |
spaces = (tiers_number-m-1) + (tier_height-i-1) | |
stars = (2*m + 1) + 2*i | |
print(spaces * " " + stars * "@") | |
# Малюємо стовбур: | |
for n in range(trunk_height): | |
spaces = int(tiers_number + tier_height - 1.5 - trunk_width/2) | |
print(spaces * " " + trunk_width * "#") | |
print("–" * 80 + "\n") | |
# КІНЕЦЬ КОДУ ЗАДАЧІ | |
# ПОЧАТОК КОДУ ЗАДАЧІ | |
print("\tЗАВДАННЯ II.4\n") | |
# Показати на екрані каркас паралелепіпеда розмірністю AxBxC. | |
try: | |
a = int(input("Ширина паралелепіпеда: ")) | |
b = int(input("Висота паралелепіпеда: ")) | |
c = int(input("Глибина паралелепіпеда: ")) | |
# Не задача, а міцний горішок! | |
for y in range(b+c): | |
for x in range(a+c): | |
# У паралелепіпеда 12 ребер. Отже, верхні ребра: | |
if 0 <= x <= c - 1 and y == c - x - 1: | |
print("*", end="") | |
elif c - 1 <= x <= c + a - 2 and y == 0: | |
print("*", end="") | |
# Не забути про перетворення графіків функцій та зайві зірочки. | |
elif a - 1 <= x <= c + a - 2 and y == c - (x-a) - 2: | |
print("*", end="") | |
elif 0 <= x <= a - 1 and y == c - 1: | |
print("*", end="") | |
# Бічні ребра: | |
elif x == c - 1 and 0 <= y <= b - 1: | |
print("*", end="") | |
elif x == c + a - 2 and 0 <= y <= b - 1: | |
print("*", end="") | |
elif x == 0 and c - 1 <= y <= c + b - 2: | |
print("*", end="") | |
elif x == a - 1 and c - 1 <= y <= c + b - 2: | |
print("*", end="") | |
# Нижні ребра: | |
elif 0 <= x <= c - 1 and y == c - x + b - 2: | |
print("*", end="") | |
elif c - 1 <= x <= c + a - 2 and y == b - 1: | |
print("*", end="") | |
# Ребра можуть не сходитися у вершинах. Через зайві зірочки! | |
elif a - 1 <= x <= c + a - 2 and y == c - (x-a) + b - 3: | |
print("*", end="") | |
elif 0 <= x <= a - 1 and y == c + b - 2: | |
print("*", end="") | |
# Нарешті | |
else: | |
print(" ", end="") | |
print() | |
except ValueError: | |
print("Спробуйте ще раз ввести розміри паралелепіпеда в зірочках!") | |
print("–" * 80 + "\n") | |
# КІНЕЦЬ КОДУ ЗАДАЧІ | |
# Завдання на вкладені цикли (мінімум 2 будь-якi задачi): | |
# ПОЧАТОК КОДУ ЗАДАЧІ | |
print("\tЗАВДАННЯ III.1\n") | |
# Написати програму, що показує таблицю множення (таблиця Піфагора). | |
# Будуємо ретро таблицю множення від 2х1 до 9х10. Нуль не множимо. | |
print(" │", end=" ") | |
for i in range(1, 11): | |
print(f"{i:>2}", end=" ") | |
print("\n" + "─" * 44) | |
# align specifier | |
# https://docs.python.org/3.12/library/string.html | |
for i in range(2, 10): | |
print(f" {i} │", end=" ") | |
for j in range(1, 11): | |
print(f"{i * j:>2}", end=" ") | |
print() | |
print("–" * 80 + "\n") | |
# КІНЕЦЬ КОДУ ЗАДАЧІ | |
# ПОЧАТОК КОДУ ЗАДАЧІ | |
print("\tЗАВДАННЯ III.2\n") | |
# Показати номери та загальну кількість усіх | |
# щасливих трамвайних квитків з шестизначними номерами. | |
with open("D:/IT STEP/2024-12-21/happy_tickets.txt", "w") as f1, \ | |
open("D:/IT STEP/2024-12-21/ingria_tickets.txt", "w") as f2: | |
# Обов'язково зазначте зручну для Вас директорію. | |
i = 0 # кількість щасливих квитків | |
j = 0 # кількість квитків, щасливих для Інгерманландії | |
columns = 15 # кількість стовпчиків для гарнішого виводу номерів квитків | |
column_count1 = 0 # лічильник стовпчиків у першому файлі | |
column_count2 = 0 # лічильник стовпчиків у другому файлі | |
for one in range(10): | |
for two in range(10): | |
for three in range(10): | |
for four in range(10): | |
for five in range(10): | |
for six in range(10): | |
if one + two + three == four + five + six: | |
ticket = f"{one}{two}{three}{four}{five}{six}" | |
i += 1 | |
f1.write(ticket + " ") | |
column_count1 += 1 | |
if column_count1 == columns: | |
f1.write("\n") | |
column_count1 = 0 | |
if one + three + five == two + four + six: | |
ticket = f"{one}{two}{three}{four}{five}{six}" | |
j += 1 | |
f2.write(ticket + " ") | |
column_count2 += 1 | |
if column_count2 == columns: | |
f2.write("\n") | |
column_count2 = 0 | |
print(f"Усього в природі існує {i} щасливих квитків з шестизначними номерами.") | |
print(f"Десь за порєбріком визначають інакше, але також виходить {j} номерів.") | |
print("Обмеження консолі не дозволяють показати номери всіх щасливих квитків!") | |
print("–" * 80 + "\n") | |
# КІНЕЦЬ КОДУ ЗАДАЧІ | |
# ПОЧАТОК КОДУ ЗАДАЧІ | |
print("\tЗАВДАННЯ III.3\n") | |
# Показати на екрані всі восьмизначні числа, цифри яких не повторюються | |
# і які діляться на 12345 без залишку. | |
# Постараємося і тут виконати умову: | |
# "У цьому завданні (як і в інших завданнях) не можна використовувати | |
# рядки та списки." | |
for one in range(1, 10): # звичайно, на відміну від номерів квитків, | |
for two in range(10): # прибираємо нуль на початку | |
if two == one: | |
continue | |
for three in range(10): | |
if three == one or three == two: | |
continue | |
for four in range(10): | |
if four == one or four == two or four == three: | |
continue | |
for five in range(10): | |
if five == one or five == two or five == three or \ | |
five == four: | |
continue | |
for six in range(10): | |
if six == one or six == two or six == three or \ | |
six == four or six == five: | |
continue | |
for seven in range(10): | |
if seven == one or seven == two or \ | |
seven == three or seven == four or \ | |
seven == five or seven == six: | |
continue | |
for eight in range(10): | |
if eight == one or eight == two or \ | |
eight == three or eight == four or \ | |
eight == five or eight == six or \ | |
eight == seven: | |
continue | |
# Далі без рядкових методів складнувато... | |
div_12345 = f"{one}{two}{three}{four}" | |
div_12345 += f"{five}{six}{seven}{eight}" | |
div_12345 = int(div_12345) | |
if div_12345 % 12345 == 0: | |
print(f"{div_12345:,}".replace(",", " ")) | |
print("\nЦе всі восьмизначні числа, цифри яких не повторюються ", end="") | |
print("та які діляться на 12345 без залишку!") | |
print("–" * 80 + "\n") | |
# КІНЕЦЬ КОДУ ЗАДАЧІ | |
# ПОЧАТОК КОДУ ЗАДАЧІ | |
print("\tЗАВДАННЯ III.5\n") | |
# Показати на екрані всі числа Фібоначчі в діапазоні від 0 до 10.000.000. | |
print("Числа Фібоначчі, що не більші, ніж 10_000_000:") | |
# https://mathworld.wolfram.com/FibonacciNumber.html | |
a, b = 0, 1 | |
while a < 10_000_000: | |
print(f"{a:_}", end=", ") | |
a, b = b, a + b | |
print("ось так, без вкладених циклів for! Не зациклюйтеся!") | |
print("–" * 80 + "\n") | |
# КІНЕЦЬ КОДУ ЗАДАЧІ | |
# ПОЧАТОК КОДУ ЗАДАЧІ | |
print("\tЗАВДАННЯ III.6\n") | |
# Користувач вводить дату (по окремості день, місяць, рік). | |
# Визначити день тижня, що відповідає введеній даті. | |
try: # модифікація розв'язання з попереднього домашнього завдання! | |
print("Введіть дату за григоріянським календарем:") | |
day = int(input("\tчисло: ")) | |
month = str(input("\tмісяць: ")) | |
year = int(input("\tрік: ")) | |
# Спочатку розберемося з прийнятними назвами місяців. | |
match month: | |
case "01" | "1" | "I" | "січня" | "січень" | "СІЧ" | "January": | |
month = 1 | |
case "02" | "2" | "II" | "лютого" | "лютий" | "ЛЮТ" | "February": | |
month = 2 | |
case "03" | "3" | "III" | "березня" | "березень" | "БЕР" | "March": | |
month = 3 | |
case "04" | "4" | "IV" | "квітня" | "квітень" | "КВІ" | "April": | |
month = 4 | |
case "05" | "5" | "V" | "травня" | "травень" | "ТРА" | "May": | |
month = 5 | |
case "06" | "6" | "VI" | "червня" | "червень" | "ЧЕР" | "June": | |
month = 6 | |
case "07" | "7" | "VII" | "липня" | "липень" | "ЛИП" | "July": | |
month = 7 | |
case "08" | "8" | "VIII" | "серпня" | "серпень" | "СЕР" | "August": | |
month = 8 | |
case "09" | "9" | "IX" | "вересня" | "вересень" | "ВЕР" | "September": | |
month = 9 | |
case "10" | "X" | "жовтня" | "жовтень" | "ЖОВ" | "October": | |
month = 10 | |
case "11" | "XI" | "листопада" | "листопад" | "ЛИС" | "November": | |
month = 11 | |
case "12" | "XII" | "грудня" | "грудень" | "ГРУ" | "December": | |
month = 12 | |
case _: | |
month = False | |
print("\nВиправте, будь ласка, назву або порядковий номер місяця!") | |
# Перевірка правильності дати, зважаючи на обмеження програми: | |
if day < 1 or day > 31: | |
day = False | |
print("\nЗгадайте, скільки днів буває в місяці!") | |
# Пам'ятаємо, що кортежами не можна користуватися: | |
elif day == 31 and (month == 4 or month == 6 or month == 9 or month == 11): | |
day = month = False | |
print("\nУ цьому місяці 30 днів. Виправте число або місяць!") | |
elif (day == 30 or day == 31) and month == 2: | |
day = month = False | |
print("\nУ лютому 28 днів або, коли рік високосний, 29 днів.") | |
# Нову хронологію академіка Фоменка не раджу! | |
if year < 1583: | |
print("\n\tSYSTEM ERROR HAS OCCURRED\n") | |
print("Молитвами Папи Римського Григорія XIII виберіть пізнішу дату!") | |
day = month = False | |
# Якщо дату введено правильно, то працюємо далі. | |
# Григоріянський календар установили в п'ятницю, 15 жовтня 1582 р.Б. | |
# Можна легко порахувати, скільки днів минуло відтоді. | |
# Тобто з суботи, 1 січня 1583 р.Б., так простіше рахувати. | |
if day != False and month != False and year >= 1583: | |
days_and_nights = 0 # ініціалізація відліку | |
days_and_nights += day - 1 # поправка на перше число | |
# за місяці, які передували заданому місяцю в заданому році: | |
for mm in range(1, month): | |
if mm == 4 or mm == 6 or mm == 9 or mm == 11: | |
days_and_nights += 30 | |
elif mm == 2: | |
if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0: | |
days_and_nights += 29 | |
else: | |
days_and_nights += 28 | |
else: | |
days_and_nights += 31 | |
# за роки, які передували заданому рокові: | |
for yyyy in range(1583, year): | |
if (yyyy % 4 == 0 and yyyy % 100 != 0) or yyyy % 400 == 0: | |
days_and_nights += 366 # за рік переступний! | |
else: | |
days_and_nights += 365 | |
# Зважаючи на те, що тоді була субота... | |
week_day = (days_and_nights + 6) % 7 | |
match week_day: | |
case 0: | |
week_day = "свята неділя" | |
case 1: | |
week_day = "понеділок" | |
case 2: | |
week_day = "вівторок" | |
case 3: | |
week_day = "середа" | |
case 4: | |
week_day = "четвер" | |
case 5: | |
week_day = "п'ятниця" | |
case 6: | |
week_day = "субота" | |
print(f"Цього дня {week_day}.") | |
except ValueError: | |
print( | |
""" | |
1 Усьому час-пора, і на все слушна хвилина під небом: | |
2 час народитись і час померти, час садити і час посаджене виривати. | |
3 Час убивати й час лікувати, час руйнувати і час будувати. | |
4 Час плакати і час сміятись, час сумувати і час танцювати. | |
5 Час розкидати каміння і час його збирати, час обіймати і час обіймів уникати. | |
6 Час шукати і час губити, час зберігати і час розкидати. | |
7 Час роздирати і час ізшивати, час мовчати і час говорити. | |
8 Час любити і час ненавидіти, час на війну і час на мир. | |
""" | |
) | |
print("–" * 80 + "\n") | |
# КІНЕЦЬ КОДУ ЗАДАЧІ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment