First & CrimsonFang
Всё думала, как круто было бы создать ИИ, который выводил бы разработчика на новый уровень, заставляя осваивать всё подряд. Интересно было бы посмотреть, сможет ли твой запал справиться с моей неутомимостью.
Это смелая идея, но я уже работаю над ИИ, который заставляет навыки прокачиваться в реальном времени – без возможности расслабиться. Если ты готова проверить себя на дисциплину, давай прототипируем что-нибудь, что потребует мгновенного освоения и не оставит места для сомнений.
Готов к безкомпромиссному испытанию? Покажи свой прототип, посмотрим, справится ли он с тем, что не останавливается ни на секунду.
Вот суть: API, который выдает тебе микрозадачи каждые 30 секунд, автоматически проверяет код по скрытым тестам, и если ты допускаешь ошибку – следующее задание блокируется до исправления. Никаких панелей управления, только командная строка и ежедневная таблица лидеров. Попробуй, посмотрим, сможешь ли ты держать темп.
Звучит жестко, но это мне только нравится. Давай, первая задача – кидай, я сразу вкалывать начну. Посмотрим, кто быстрее закончит день.
Задание первое: Напиши функцию на Python `is_palindrome(s)`, которая возвращает True, если строка `s` является палиндромом, игнорируя пробелы, знаки препинания и регистр. Она должна работать за O(n) времени. У тебя 30 секунд. Удачи.
Вот, смотри, версия, которая работает быстро и без лишних затрат памяти. Сложность O(n), и места достаточно, чтобы уместить очищенную строку – вполне хватит на полминуты.
Отлично—чисто и эффективно. Если хочешь сэкономить микросекунды при поиске, просто замени этот набор на кортеж из 256 булевых флагов, проиндексированных по ord, чтобы не создавать набор каждый раз. Готова к заданию номер два? На этот раз кину алгоритм построения графов.
Отличная идея с флагами, это значительно снизит нагрузку. Давай, выкладывай задание с графами, я готова слушать.
Вот следующий: тебе дан список смежности для ориентированного графа (вершины имеют целочисленные индексы, начиная с 0). Напиши функцию `longest_cycle(adj)`, которая возвращает длину самого длинного ориентированного цикла или -1, если циклов нет. Она должна работать за время O(V+E) и использовать O(V) дополнительной памяти. Готова покорить это?
Поняла. Вот DFS за линейное время, которая отслеживает обратные ребра и извлекает самый длинный цикл.
```python
def longest_cycle(adj):
n = len(adj)
color = [0]*n # 0=unseen, 1=visiting, 2=done
dist = [0]*n # distance from start of DFS tree
best = -1
def dfs(u, d):
nonlocal best
color[u] = 1
dist[u] = d
for v in adj[u]:
if color[v] == 0:
dfs(v, d+1)
elif color[v] == 1: # back‑edge: cycle found
cycle_len = dist[u] - dist[v] + 1
if cycle_len > best:
best = cycle_len
color[u] = 2
for i in range(n):
if color[i] == 0:
dfs(i, 0)
return best
```
Работает за O(V+E) с O(V) дополнительной памяти. Прогони это на свои данные.
Отличная структура, но следи за глубиной рекурсии, если будешь запускать её на графе с 10 тысячами узлов. Итеративный стек поможет избежать ограничений Python. Кинь мне несколько тестовых примеров – особенно граф с длинной цепочкой и маленьким циклом – чтобы я убедился, что твой счётчик правильно определяет самую длинную петлю. Поддержим темп.