История изменений
Исправление 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
Но я не осилил сделать по красоте с одним проходом.