Форум сайта python.su
0
Всем доброго времени суток! Кого заинтересует данный вопрос, буду рад получить ответ!
Дело вот в чем. Написал я программку решения задачек со спичками. Вводишь пример неправильный, она пытается его решить путем подстановок.
Программка рабочая, но как мне кажется, получилась она у меня слишком уж громоздкой. Как вы думаете, можно ли упростить решение задачи, или есть другое, более изящное ее решение?
Если что-то непонятно в коде, спрашивайте!
__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]
Отредактировано AlehinAlSerg (Янв. 15, 2016 01:58:36)
Офлайн
857
А что за игра? Опиши словами.
Офлайн
221
От множественных if можно избавить создав словарь значений.
AlehinAlSerg
def zamena_add(x): # Возможные подстановки при добавлении спички if x == “0”: return elif x == “1”: return elif x == “3”: return elif x == “5”: return elif x == “6”: return elif x == “9”: return elif x == “-”: return
def zamena_add(x): return {'0': ['8'], '1': ['7'], .... '-': ['+']}[x]
Отредактировано JOHN_16 (Янв. 15, 2016 04:45:20)
Офлайн
186
Строчка:
except SyntaxError:
Отредактировано Rodegast (Янв. 15, 2016 10:09:54)
Офлайн
0
У вас есть массивные куски кода которые по сути своей дублируются. Напрашивается создание функции, сократит код в 2 раза.Класс, спасибо за подсказку!
Офлайн
0
А что за игра? Опиши словами.
Отредактировано AlehinAlSerg (Янв. 17, 2016 01:25:01)
Офлайн
857
AlehinAlSergТам куча разных задач.
Вот ссылка.
Офлайн
0
Там куча разных задач.
Если даже словами задачу описать не можешь, то код тем более не напишешь.
Отредактировано AlehinAlSerg (Янв. 17, 2016 03:35:25)
Офлайн
857
AlehinAlSergИз девятки можно сделать любую цифру, кроме восьмёрки. ;)
Например из девятки можно сделать шестерку.
http://www.spichca.ru/
Исправьте равенство 84+8=16
Уберите 3 спички так, чтобы равенство стало верным.
Отредактировано py.user.next (Янв. 17, 2016 03:56:22)
Офлайн
0
http://www.spichca.ru/24 - 8 = 16
Исправьте равенство 84+8=16
Уберите 3 спички так, чтобы равенство стало верным.
Из девятки можно сделать любую цифру, кроме восьмёрки.Я написал, что программа решает задачки только с одной спичкой.
Отредактировано AlehinAlSerg (Янв. 18, 2016 00:29:40)
Офлайн