22 - python & all web labs
This commit is contained in:
@@ -1,37 +1,75 @@
|
||||
print("task: 6r\nВставка + и - между цифрами для получения числа N")
|
||||
# task: Счастливый билет
|
||||
# Дано шестизначное число и число N. Между цифрами можно вставлять +, -, ничего.
|
||||
# Нужно вывести все выражения, равные N, либо сообщение об отсутствии решений.
|
||||
|
||||
import itertools
|
||||
|
||||
|
||||
def generate(s, pos, expr, target, results):
|
||||
if pos == len(s):
|
||||
try:
|
||||
if eval(expr) == target:
|
||||
results.append(expr + "=" + str(target))
|
||||
except:
|
||||
pass
|
||||
return
|
||||
generate(s, pos + 1, expr + "+" + s[pos], target, results)
|
||||
generate(s, pos + 1, expr + "-" + s[pos], target, results)
|
||||
generate(s, pos + 1, expr + s[pos], target, results)
|
||||
def generate_expressions(digits):
|
||||
ops = ["+", "-", ""]
|
||||
for comb in itertools.product(ops, repeat=5):
|
||||
expr = digits[0]
|
||||
for i in range(5):
|
||||
expr += comb[i] + digits[i + 1]
|
||||
yield expr
|
||||
|
||||
|
||||
def safe_eval(expr):
|
||||
try:
|
||||
return eval(expr)
|
||||
except:
|
||||
return None
|
||||
|
||||
|
||||
def solve(ticket, target):
|
||||
results = []
|
||||
digits = list(ticket)
|
||||
for expr in generate_expressions(digits):
|
||||
val = safe_eval(expr)
|
||||
if val == target:
|
||||
results.append(f"{expr}={target}")
|
||||
return results
|
||||
|
||||
|
||||
def is_valid_ticket(ticket):
|
||||
return ticket.isdigit() and len(ticket) == 6 and int(ticket) > 0
|
||||
|
||||
|
||||
def is_valid_target(target):
|
||||
return target.isdigit() and 0 < int(target) < 10**9
|
||||
|
||||
|
||||
while True:
|
||||
print("\n1 - решить\n0 - выход")
|
||||
try:
|
||||
c = input("Выбор: ")
|
||||
if c == "1":
|
||||
s, target = input("Введите число и N: ").split()
|
||||
target = int(target)
|
||||
results = []
|
||||
generate(s, 1, s[0], target, results)
|
||||
with open("result.txt", "w") as f:
|
||||
if results:
|
||||
for r in results:
|
||||
print(r)
|
||||
f.write(r + "\n")
|
||||
else:
|
||||
print("Решение не существует")
|
||||
f.write("Решение не существует")
|
||||
elif c == "0":
|
||||
break
|
||||
except:
|
||||
print("Ошибка ввода")
|
||||
print("\nВыберите действие:")
|
||||
print("1 - Ввести данные")
|
||||
print("2 - Выход")
|
||||
|
||||
choice = input("Ваш выбор: ").strip()
|
||||
|
||||
if choice == "2":
|
||||
print("Выход из программы.")
|
||||
break
|
||||
elif choice == "1":
|
||||
ticket = input("Введите шестизначный номер билета: ").strip()
|
||||
target = input("Введите число N (0 < N < 1e9): ").strip()
|
||||
|
||||
if not is_valid_ticket(ticket):
|
||||
print("Ошибка: билет должен быть шестизначным натуральным числом.")
|
||||
continue
|
||||
|
||||
if not is_valid_target(target):
|
||||
print("Ошибка: N должно быть натуральным числом (0 < N < 1e9).")
|
||||
continue
|
||||
|
||||
target = int(target)
|
||||
solutions = solve(ticket, target)
|
||||
|
||||
if solutions:
|
||||
print("\nНайденные решения:")
|
||||
for s in solutions:
|
||||
print(s)
|
||||
else:
|
||||
print("Решение не существует.")
|
||||
|
||||
else:
|
||||
print("Некорректный выбор. Попробуйте снова.")
|
||||
|
||||
Reference in New Issue
Block a user