Дело вот в чем. Написал я программку решения задачек со спичками. Вводишь пример неправильный, она пытается его решить путем подстановок.
Программка рабочая, но как мне кажется, получилась она у меня слишком уж громоздкой. Как вы думаете, можно ли упростить решение задачи, или есть другое, более изящное ее решение?
Если что-то непонятно в коде, спрашивайте!
__author__ = 'AlehinAlSerg' """ Программа решает задачки со спичками, путем последовательных подстановок цифр. """ ADD = ["0", "1", "3", "5", "6", "9", "-"] # цифры заменяемые путеем добавления спички от донора DEL = ["6", "7", "8", "9", "+"] # цифры заменяемые путеем убирания спички к реципиенту SELF = ["2", "3", "5", "6", "9", "0"] # цифры, заменяющие сами себя k = 0 def zamena_add(x): # Возможные подстановки при добавлении спички if x == "0": return ["8", ] elif x == "1": return ["7", ] elif x == "3": return ["9", ] elif x == "5": return ["6", "9"] elif x == "6": return ["8", ] elif x == "9": return ["8", ] elif x == "-": return ["+", ] def zamena_del(y): # Возможные подстановки при удалении спички if y == "6": return ["5", ] elif y == "7": return ["1", ] elif y == "8": return ["0", "6"] elif y == "9": return ["3", "5"] elif y == "+": return ["-", ] def zamena_self(z): # Возможные подстановки при перестановки спички внутри цифры if z == "0": return ["6", "9"] if z == "2": return ["3", ] elif z == "3": return ["2", "5"] elif z == "5": return ["3", ] elif z == "6": return ["0", "9"] elif z == "9": return ["0", "6"] stroka = "" sch = -1 primer = input("""Напишите любой пример с использованием знаков '+' и '-', и если есть решение, то я его найду """) print(primer + "!!!") primer1 = "" if not eval(primer): print("Пример неправильный, будем искать решение") # Поиск решения через самозаменяющиеся цифры: for i in primer: sch += 1 if i in SELF: spisok_zamen = zamena_self(i) for zamena in spisok_zamen: primer1 = primer[:sch] + zamena + primer[sch + 1:] try: if eval(primer1): # Проверяем, есть ли решение, если есть, то выводим его на экран. print("Решение найдено!", primer1) stroka = "_" * len(primer1) stroka1 = stroka[:sch] + zamena + stroka[sch + 1:] print("Была сделана замена:") print(primer) print(stroka1) print("@@@@@@@@@@") except SyntaxError: continue # Поиск решения дерез доноров и реципиентов: sch = -1 for k in primer: sch += 1 if k in ADD: # Ищем цифру в списке добавления спички. Если не нашли, значит решения нет. spisok_zamen = zamena_add(k) for zamena in spisok_zamen: primer1 = primer[:sch] + zamena + primer[sch + 1:] nomersimvolazamena = sch simvolzamena = zamena primer2 = primer[:sch] + "!" + primer[sch + 1:] sc = -1 for j in primer2: sc += 1 if j in DEL: # Если нашли цифру из списка "ADD", то ищем цифру, из которой можно спичку извлечь. spisok_zamen = zamena_del(j) for zamena in spisok_zamen: primer3 = primer2[:sc] + zamena + primer2[sc + 1:] primer4 = primer3[:nomersimvolazamena] + simvolzamena + primer3[nomersimvolazamena + 1:] try: if eval(primer4): # Проверяем, есть ли решение, если есть, то выводим его на экран. print("Решение найдено!") stroka = "_" * len(primer4) stroka1 = stroka[:sc] + zamena + stroka[sc + 1:] stroka2 = stroka1[:nomersimvolazamena] + simvolzamena + stroka1[ nomersimvolazamena + 1:] print("Были сделаны следующие перестановки:") print(primer) print(stroka2) print("@@@@@@@@@@") except SyntaxError: continue [code python]
