Загрузка данных
import random
def parse_grades(raw_data):
grades = []
for row in raw_data:
parts = row.split("|")
if len(parts) != 2:
raise ValueError("Используй формат: предмет | оценка")
subject = parts[0].strip()
grade_text = parts[1].strip()
if not subject:
raise ValueError("Название предмета не может быть пустым")
if not grade_text.isdigit():
raise ValueError("Оценка должна быть целым числом от 2 до 5")
grade = int(grade_text)
if grade < 2 or grade > 5:
raise ValueError("Оценка должна быть от 2 до 5")
grades.append((subject, grade))
if not grades:
raise ValueError("Нужно добавить хотя бы одну запись")
return grades
def count_grades(grades):
counts = {}
for subject, grade in grades:
counts[grade] = counts.get(grade, 0) + 1
return counts
def calculate_average(grades):
total = 0
for subject, grade in grades:
total += grade
return total / len(grades)
def find_best_subject(grades):
best = grades[0]
for item in grades:
if item[1] > best[1]:
best = item
return best
def find_worst_subject(grades):
worst = grades[0]
for item in grades:
if item[1] < worst[1]:
worst = item
return worst
template = [
"Математика | 5",
"Русский | 4",
"Физика | 5",
"История | 3",
"Математика | 4",
"Английский | 5",
"Физика | 4",
"Химия | 3",
"Русский | 5",
"История | 4"
]
while True:
mode = input("1 — случайные данные, 2 — свой ввод, 3 — шаблон: ").strip()
if mode in ("1", "2", "3"):
break
print("Выбери 1, 2 или 3.")
if mode == "1":
subjects = ["Математика", "Русский", "Физика", "История"]
raw_data = [
random.choice(subjects) + " | " + str(random.randint(2, 5))
for _ in range(10)
]
elif mode == "2":
while True:
try:
n = int(input("Количество записей: ").strip())
if n > 0:
break
print("Количество должно быть больше нуля.")
except ValueError:
print("Введи целое число.")
raw_data = []
for i in range(n):
while True:
row = input("Предмет | оценка: ").strip()
try:
parse_grades([row])
raw_data.append(row)
break
except ValueError as error:
print(error)
raw_data = [row for row in raw_data]
elif mode == "3":
raw_data = template[:]
grades = parse_grades(raw_data)
print("\n=== ШКОЛЬНЫЙ ЖУРНАЛ ===")
print("Средний балл:", round(calculate_average(grades), 2))
print("Лучшая оценка:", find_best_subject(grades))
print("Худшая оценка:", find_worst_subject(grades))
print("Частота оценок:", count_grades(grades))
import random
import time
def read_integer(prompt, minimum=None):
while True:
try:
value = int(input(prompt).strip())
if minimum is not None and value < minimum:
print("Число должно быть не меньше", minimum)
continue
return value
except ValueError:
print("Введи целое число.")
def find_pairs_naive(prices, X):
pairs = []
seen = set()
for i in range(len(prices)):
for j in range(i + 1, len(prices)):
if abs(prices[i] - prices[j]) == X:
pair = (min(prices[i], prices[j]), max(prices[i], prices[j]))
if pair not in seen:
seen.add(pair)
pairs.append(pair)
return pairs
def find_pairs_optimized(prices, X):
price_set = set(prices)
pairs = set()
if X == 0:
counts = {}
for price in prices:
counts[price] = counts.get(price, 0) + 1
for price, count in counts.items():
if count >= 2:
pairs.add((price, price))
else:
for price in price_set:
if price + X in price_set:
pairs.add((price, price + X))
return sorted(pairs)
template = [100, 150, 200, 250, 250, 260, 350, 300]
while True:
mode = input("1 — случайные данные, 2 — свой ввод, 3 — шаблон: ").strip()
if mode in ("1", "2", "3"):
break
print("Выбери 1, 2 или 3.")
if mode == "1":
n = read_integer("Количество цен: ", 1)
prices = [random.randint(50, 1000) for _ in range(n)]
X = read_integer("Разница X (неотрицательное число): ", 0)
elif mode == "2":
while True:
try:
prices = [int(item) for item in input("Цены через пробел: ").split()]
if not prices:
print("Введи хотя бы одну цену.")
continue
break
except ValueError:
print("Цены должны быть целыми числами, разделёнными пробелами.")
X = read_integer("Разница X (неотрицательное число): ", 0)
else:
prices = template[:]
X = 50
start = time.perf_counter()
pairs1 = find_pairs_naive(prices, X)
time1 = time.perf_counter() - start
start = time.perf_counter()
pairs2 = find_pairs_optimized(prices, X)
time2 = time.perf_counter() - start
print("\n=== УНИКАЛЬНЫЕ ПАРЫ ЦЕН ===")
print("Цены:", prices)
print("Разница X:", X)
print("Наивный алгоритм:", sorted(pairs1))
print("Оптимизированный алгоритм:", pairs2)
print(f"Время наивного: {time1:.8f} сек.")
print(f"Время оптимизированного: {time2:.8f} сек.")
print("Сложность наивного: O(N²).")
print("Сложность оптимизированного: O(N) в среднем.")
import random
import time
def read_integer(prompt, minimum=None):
while True:
try:
value = int(input(prompt).strip())
if minimum is not None and value < minimum:
print("Число должно быть не меньше", minimum)
continue
return value
except ValueError:
print("Введи целое число.")
def decay(n, step, max_steps, path):
path.append(n)
if n < 10 or step >= max_steps:
return step
product = 1
for digit in str(n):
product *= int(digit)
return decay(product, step + 1, max_steps, path)
def decay_loop(n, max_steps, path):
step = 0
while n >= 10 and step < max_steps:
path.append(n)
product = 1
for digit in str(n):
product *= int(digit)
n = product
step += 1
path.append(n)
return step
while True:
mode = input("1 — случайные данные, 2 — свой ввод, 3 — шаблон: ").strip()
if mode in ("1", "2", "3"):
break
print("Выбери 1, 2 или 3.")
if mode == "1":
n = random.randint(10, 99999)
limit = random.randint(5, 20)
elif mode == "2":
n = read_integer("Введите неотрицательное целое число: ", 0)
limit = read_integer("Лимит шагов: ", 0)
else:
n = 39
limit = 10
path_rec = []
start = time.perf_counter()
steps_rec = decay(n, 0, limit, path_rec)
time_rec = time.perf_counter() - start
path_loop = []
start = time.perf_counter()
steps_loop = decay_loop(n, limit, path_loop)
time_loop = time.perf_counter() - start
print("\n=== МОЛЕКУЛЯРНЫЙ РАСПАД ===")
print("Рекурсия:", " -> ".join(map(str, path_rec)))
print("Количество шагов:", steps_rec)
print("Цикл:", " -> ".join(map(str, path_loop)))
print("Количество шагов:", steps_loop)
print(f"Время рекурсии: {time_rec:.8f} сек.")
print(f"Время цикла: {time_loop:.8f} сек.")
if steps_rec == steps_loop and path_rec == path_loop:
print("Проверка: результаты совпадают.")
else:
print("Проверка: результаты различаются.")
import random
def get_digits(noise):
for char in noise:
if char.isdigit():
yield char
template = "x7#b99!aL2@pQ5__%z1"
while True:
mode = input("1 — случайные данные, 2 — свой ввод, 3 — шаблон: ").strip()
if mode in ("1", "2", "3"):
break
print("Выбери 1, 2 или 3.")
if mode == "1":
chars = "abcXYZ0123456789!#@%"
noise = "".join(random.choice(chars) for _ in range(30))
elif mode == "2":
noise = input("Введите зашумлённую строку: ")
else:
noise = template
print("\n=== ДЕШИФРОВКА ===")
print("Исходный сигнал:", noise)
print("Найденные цифры:", "".join(get_digits(noise)))