КИС: Автоматический решатель 11 задачи

Автоматический решатель 11 задачи

Собственно, название говорит само за себя. Представляю вам автоматический решатель 11 задачи, которая про графы. Указание исходных данных и получение данных из программы я сделал максимально простым. Все модификации должны производиться над строчками после if __name__ == '__main__':. Перейдём к туториалу:

Указание исходных данных

Предположим, у нас следующий граф:

GraphExample

Для указания всех исходных данных нужно изменять следующую переменную:

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(), которая на самом деле не нужна в принципе (только в начале), из-за чего возникало “вы превысили когнитивную сложность” из-за присвоений. Пофикшено

CoverageAnalyzer.py (v1.0, 11.0 КБ, GitHub)

Донаты:

  • Карта 2200 7001 4018 6148 (Тинькофф, СБП)
  • Номер телефона: Через кумыс
4 Likes