Skip to content

Instantly share code, notes, and snippets.

@Ruthenus
Created January 6, 2025 09:21
Show Gist options
  • Save Ruthenus/b57782e4f3eec31b3d70757b5aa90502 to your computer and use it in GitHub Desktop.
Save Ruthenus/b57782e4f3eec31b3d70757b5aa90502 to your computer and use it in GitHub Desktop.
Week 4 Homework in IT STEP Academy (loops tasks)
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