Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 15, 2016 01:51:19

AlehinAlSerg
Зарегистрирован: 2015-08-13
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Есть ли более изящное решение задачи:?

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

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

__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)

Офлайн

#2 Янв. 15, 2016 04:06:51

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Есть ли более изящное решение задачи:?

А что за игра? Опиши словами.



Офлайн

#3 Янв. 15, 2016 04:18:07

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Есть ли более изящное решение задачи:?

От множественных 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 раза.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Отредактировано JOHN_16 (Янв. 15, 2016 04:45:20)

Офлайн

#4 Янв. 15, 2016 10:08:57

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Есть ли более изящное решение задачи:?

Строчка:

except SyntaxError:
повеселила



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Янв. 15, 2016 10:09:54)

Офлайн

#5 Янв. 17, 2016 01:15:41

AlehinAlSerg
Зарегистрирован: 2015-08-13
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Есть ли более изящное решение задачи:?

У вас есть массивные куски кода которые по сути своей дублируются. Напрашивается создание функции, сократит код в 2 раза.
Класс, спасибо за подсказку!
Я словарями значений еще не пользовался.

Офлайн

#6 Янв. 17, 2016 01:20:11

AlehinAlSerg
Зарегистрирован: 2015-08-13
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Есть ли более изящное решение задачи:?

А что за игра? Опиши словами.

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

Но моя программка решает задачки только с одной спичкой.

Отредактировано AlehinAlSerg (Янв. 17, 2016 01:25:01)

Офлайн

#7 Янв. 17, 2016 01:57:06

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Есть ли более изящное решение задачи:?

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



Офлайн

#8 Янв. 17, 2016 03:14:29

AlehinAlSerg
Зарегистрирован: 2015-08-13
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Есть ли более изящное решение задачи:?

Там куча разных задач.
Если даже словами задачу описать не можешь, то код тем более не напишешь.

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

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

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

Отредактировано AlehinAlSerg (Янв. 17, 2016 03:35:25)

Офлайн

#9 Янв. 17, 2016 03:53:23

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Есть ли более изящное решение задачи:?

AlehinAlSerg
Например из девятки можно сделать шестерку.
Из девятки можно сделать любую цифру, кроме восьмёрки. ;)
Да и восьмёрку можно, если спичку с другой цифры взять.

http://www.spichca.ru/
Исправьте равенство 84+8=16
Уберите 3 спички так, чтобы равенство стало верным.



Отредактировано py.user.next (Янв. 17, 2016 03:56:22)

Офлайн

#10 Янв. 17, 2016 23:57:35

AlehinAlSerg
Зарегистрирован: 2015-08-13
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Есть ли более изящное решение задачи:?

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

Есть идеи как улучшить или сократить код?

Отредактировано AlehinAlSerg (Янв. 18, 2016 00:29:40)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version