LINUX.ORG.RU

История изменений

Исправление rtxtxtrx, (текущая версия) :

Решение из книжки с алгоритмами такое (и оно тож, ес-но, кривое):

def expand(s: str) -> set[str]:
    rv = set()

    def dfs(exp: str) -> None:
        closing_pos = exp.find("}")

        if closing_pos == -1:
            rv.add(exp)
            return

        opening_pos = exp.rfind("{", 0, closing_pos)

        before = exp[:opening_pos]
        after = exp[closing_pos + 1 :]

        for inside in exp[opening_pos + 1 : closing_pos].split(","):
            dfs(before + inside + after)

    dfs(s)

    return rv

Но я не осилил сделать по красоте с одним проходом. Ну собс-но задача довольно таки сложная. И ее спрашивали на собеседовании в FAANG раньше.

Я же использую эту функцию для генерации списка путей для сканера:

[
    {
        "name": "site backup",
        "path": "/{site,www,backup}.{zip,tar.{g,x}z}",
        "condition": "status_code == 200 && mime_type != 'text/html'",
    },
]

In [15]: expand("/{site,www,backup}.{zip,tar.{g,x}z}")
Out[15]: 
{'/backup.tar.gz',
 '/backup.tar.xz',
 '/backup.zip',
 '/site.tar.gz',
 '/site.tar.xz',
 '/site.zip',
 '/www.tar.gz',
 '/www.tar.xz',
 '/www.zip'}

Исправление rtxtxtrx, :

Решение из книжки с алгоритмами такое (и оно тож, ес-но, кривое):

def expand(s: str) -> set[str]:
    rv = set()

    def dfs(exp: str) -> None:
        closing_pos = exp.find("}")

        if closing_pos == -1:
            rv.add(exp)
            return

        opening_pos = exp.rfind("{", 0, closing_pos)

        before = exp[:opening_pos]
        after = exp[closing_pos + 1 :]

        for inside in exp[opening_pos + 1 : closing_pos].split(","):
            dfs(before + inside + after)

    dfs(s)

    return rv

Но я не осилил сделать по красоте с одним проходом. Ну собс-но задача довольно таки сложная. И ее спрашивали на собеседовании в FAANG раньше.

Исправление rtxtxtrx, :

Решение из книжки с алгоритмами такое (и оно тож, ес-но, кривое):

def expand(s: str) -> list[str]:
    rv = set()

    def dfs(exp: str) -> None:
        closing_pos = exp.find("}")

        if closing_pos == -1:
            rv.add(exp)
            return

        opening_pos = exp.rfind("{", 0, closing_pos)

        before = exp[:opening_pos]
        after = exp[closing_pos + 1 :]

        for inside in exp[opening_pos + 1 : closing_pos].split(","):
            dfs(before + inside + after)

    dfs(s)

    return rv

Но я не осилил сделать по красоте с одним проходом. Ну собс-но задача довольно таки сложная. И ее спрашивали на собеседовании в FAANG раньше.

Исправление rtxtxtrx, :

Решение из книжки с алгоритмами такое:

def expand(s: str) -> list[str]:
    rv = set()

    def dfs(exp: str) -> None:
        closing_pos = exp.find("}")

        if closing_pos == -1:
            rv.add(exp)
            return

        opening_pos = exp.rfind("{", 0, closing_pos)

        before = exp[:opening_pos]
        after = exp[closing_pos + 1 :]

        for inside in exp[opening_pos + 1 : closing_pos].split(","):
            dfs(before + inside + after)

    dfs(s)

    return rv

Но я не осилил сделать по красоте с одним проходом. Ну собс-но задача довольно таки сложная. И ее спрашивали на собеседовании в FAANG раньше.

Исправление rtxtxtrx, :

Решение из книжки с алгоритмами такое:

def expand(s: str) -> list[str]:
    rv = []

    def dfs(exp: str) -> None:
        closing_pos = exp.find("}")

        if closing_pos == -1:
            rv.append(exp)
            return

        opening_pos = exp.rfind("{", 0, closing_pos)

        before = exp[:opening_pos]
        after = exp[closing_pos + 1 :]

        for inside in exp[opening_pos + 1 : closing_pos].split(","):
            dfs(before + inside + after)

    dfs(s)

    return rv

Но я не осилил сделать по красоте с одним проходом. Ну собс-но задача довольно таки сложная. И ее спрашивали на собеседовании в FAANG раньше.

Исправление rtxtxtrx, :

Решение из книжки с алгоритмами такое:

def expand(s: str) -> list[str]:
    rv = []

    def dfs(exp: str) -> None:
        closing_pos = exp.find("}")

        if closing_pos == -1:
            rv.append(exp)
            return

        opening_pos = exp.rfind("{", 0, closing_pos)

        before = exp[:opening_pos]
        after = exp[closing_pos + 1 :]

        for inside in exp[opening_pos + 1 : closing_pos].split(","):
            dfs(before + inside + after)

    dfs(s)

    return rv

Но я не осилил сделать по красоте с одним проходом. Ну собс-но задача довольно таки сложная. И ее спрашивали на собеседовании раньше а FAANG.

Исходная версия rtxtxtrx, :

Решение из книжки с алгоритмами такое:

def expand(s: str) -> list[str]:
    rv = []

    def dfs(exp: str) -> None:
        closing_pos = exp.find("}")

        if closing_pos == -1:
            rv.append(exp)
            return

        opening_pos = exp.rfind("{", 0, closing_pos)

        before = exp[:opening_pos]
        after = exp[closing_pos + 1 :]

        for inside in exp[opening_pos + 1 : closing_pos].split(","):
            dfs(before + inside + after)

    dfs(s)

    return rv

Но я не осилил сделать по красоте с одним проходом.