Автоматический решатель 11 задачи
Собственно, название говорит само за себя. Представляю вам автоматический решатель 11 задачи, которая про графы. Указание исходных данных и получение данных из программы я сделал максимально простым. Все модификации должны производиться над строчками после if __name__ == '__main__':
. Перейдём к туториалу:
Указание исходных данных
Предположим, у нас следующий граф:
Для указания всех исходных данных нужно изменять следующую переменную:
PATHS = [
]
Соответственно, самый первый путь (который возвращает 0) это дорожка от A до B, используя метод draw(), возвращая цифру 0. В коде это будет переменная Path('A', 'draw' 'B', 0)
. Последнюю цифру указывать необязательно, но она нужна, чтобы вы не запутались.
После заполнения всех путей, минимум входных данных готов:
Получившийся код
if __name__ == '__main__':
SETTINGS = Settings()
PATHS = [
Path('A', 'draw', 'B', 0),
Path('B', 'draw', 'C', 1),
Path('B', 'cull', 'B', 2),
Path('B', 'paste', 'D', 3),
Path('C', 'draw', 'D', 4),
Path('D', 'paste', 'E', 5),
Path('E', 'cull', 'F', 6),
Path('E', 'paste', 'B', 7),
Path('F', 'cull', 'C', 8)
]
Graph(PATHS).generate_graph_code(filename='code.py', settings=SETTINGS)
Теперь можно пробовать запустить код
Запуск
Для запуска нужен лишь питон версии 3.8-3.12. Запускать просто командой python CoverageAnalyzer.py
Получение выходных данных
Рядом с файлом CoverageAnalyzer.py будет лежать созданный файл code.py, содержащий код для решения вашей 11 задачи. Откройте файл любым редактором, выделите весь код (Ctrl+A), вставьте (Ctrl+V) в поле для задачи на kispython
Пример выходного файла
class MealyError(Exception):
pass
class Graph:
__slots__ = ("state",)
def __init__(self):
self.state = "A"
def paste(self):
match self.state:
case "B":
self.state = "D"
return 3
case "D":
self.state = "E"
return 5
case "E":
self.state = "B"
return 7
case _:
raise MealyError("paste")
def draw(self):
match self.state:
case "A":
self.state = "B"
return 0
case "B":
self.state = "C"
return 1
case "C":
self.state = "D"
return 4
case _:
raise MealyError("draw")
def cull(self):
match self.state:
case "B":
self.state = "B"
return 2
case "E":
self.state = "F"
return 6
case "F":
self.state = "C"
return 8
case _:
raise MealyError("cull")
def ignore(call):
try:
call()
except MealyError:
return
def main():
return Graph()
def test():
g = main()
g.state = 'A'
assert g.draw() == 0
g = main()
g.state = 'B'
assert g.draw() == 1
g = main()
g.state = 'B'
assert g.cull() == 2
g = main()
g.state = 'B'
assert g.paste() == 3
g = main()
g.state = 'C'
assert g.draw() == 4
g = main()
g.state = 'D'
assert g.paste() == 5
g = main()
g.state = 'E'
assert g.cull() == 6
g = main()
g.state = 'E'
assert g.paste() == 7
g = main()
g.state = 'F'
assert g.cull() == 8
g = main()
g.state = 'A'
ignore(g.paste)
g = main()
g.state = 'D'
ignore(g.draw)
g = main()
g.state = 'A'
ignore(g.cull)
Редактирование выходных данных
Если вы сильно ссыкуете боитесь получить страйк от КИСа, можно немного повеселиться и поменять различные настройки. Да-да, они есть, и они рабочие, иначе строчек типо code.write(f"\n{ind(1)}{settings.tests_graph_name}.{settings.state_variable} = '{mealy_exception_source.name}'")
прост не существовало.
Чтобы редактировать настройки, после строчки SETTINGS = Settings()
можно менять различные настройки генерации кода. Например, строчка settings.class_name
позволяет менять название класса графа. Например если указать settings.class_name = 'D'
, код
...
class Graph:
__slots__ = ("state",)
...
заменится на
...
class D:
__slots__ = ("state",)
...
Большинство кода генерится рандомно, поэтому при каждом запуске скрипта файл code.py будет меняться. Когда вносите изменения в файл code.py, не забывайте, его переименовывать, так как программа перезаписывает его без спросу
Примечания
- Комментариев к настройкам не будет. По крайней мере мне их лень делать, может быть, после парочки донатов лень пропадёт
- Если меня сильно попросят, может сделаю и автоматический решатель 12 задачи
- Рекомендуется скачивать с гитхаб. Файл в посте, скорее всего, обновляться не будет
Изменения
- 05.12.2024: Дичайшая ошибка, за которую мне стыдно. В функции
tests()
была постоянно строчкаg = main()
, которая на самом деле не нужна в принципе (только в начале), из-за чего возникало “вы превысили когнитивную сложность” из-за присвоений. Пофикшено - 05.28.2024: Решатель удалён из общего доступа. Перенесён в чат-бот
Донаты:
- Карта 2200 7001 4018 6148 (Тинькофф, СБП)
- Номер телефона: Через кумыс