Найти - Пользователи
Полная версия: Есть ли более изящное решение задачи:?
Начало » Python для новичков » Есть ли более изящное решение задачи:?
1
AlehinAlSerg
Всем доброго времени суток! Кого заинтересует данный вопрос, буду рад получить ответ!
Дело вот в чем. Написал я программку решения задачек со спичками. Вводишь пример неправильный, она пытается его решить путем подстановок.
Программка рабочая, но как мне кажется, получилась она у меня слишком уж громоздкой. Как вы думаете, можно ли упростить решение задачи, или есть другое, более изящное ее решение?

Если что-то непонятно в коде, спрашивайте!

__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]
py.user.next
А что за игра? Опиши словами.
JOHN_16
От множественных 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] 
У вас есть массивные куски кода которые по сути своей дублируются. Напрашивается создание функции, сократит код в 2 раза.
Rodegast
Строчка:
except SyntaxError:
повеселила
AlehinAlSerg
У вас есть массивные куски кода которые по сути своей дублируются. Напрашивается создание функции, сократит код в 2 раза.
Класс, спасибо за подсказку!
Я словарями значений еще не пользовался.
AlehinAlSerg
А что за игра? Опиши словами.

Вот ссылка.
http://www.spichca.ru/

Но моя программка решает задачки только с одной спичкой.
py.user.next
AlehinAlSerg
Вот ссылка.
Там куча разных задач.
Если даже словами задачу описать не можешь, то код тем более не напишешь.
AlehinAlSerg
Там куча разных задач.
Если даже словами задачу описать не можешь, то код тем более не напишешь.

Не думал, что кто-то не знает такой игры…

Из спичек составляется пример.
Допустим 1+6=12
Пример неверный. Если составить все цифры из спичек, то можно путем их перемещения “исправить” пример.
В данном случае надо взять спичку из шестерки, превратить ее в пятерку, а спичку эту приставить к единице, чтобы получилась семерка.
7+5=12
Примеров таких можно напридумывать очень много. Вот и вся игра.

Существует ограниченное число возможных перестановок, причем 2 видов. Когда меняются сразу две цифры. как в примере выше, или только одна. Например из девятки можно сделать шестерку. Программа перебирает все такие варианты и проверяет, является ли пример верным после каждой перестановки. Если является, то выводит на экран правильный пример и те цифры, которые были изменены.
py.user.next
AlehinAlSerg
Например из девятки можно сделать шестерку.
Из девятки можно сделать любую цифру, кроме восьмёрки. ;)
Да и восьмёрку можно, если спичку с другой цифры взять.

http://www.spichca.ru/
Исправьте равенство 84+8=16
Уберите 3 спички так, чтобы равенство стало верным.
AlehinAlSerg
http://www.spichca.ru/
Исправьте равенство 84+8=16
Уберите 3 спички так, чтобы равенство стало верным.
24 - 8 = 16
Из девятки можно сделать любую цифру, кроме восьмёрки.
Я написал, что программа решает задачки только с одной спичкой.

Есть идеи как улучшить или сократить код?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB