4-problem sprint
A big step up. Three of four problems passed every hidden test, including the sliding window that failed last time. The task-ordering problem passed 5 of 10 because it does not detect cycles.
This went backwards. You cleared the first three problems in 22 minutes, then spent 39 on the hard one and submitted in the last two minutes without re-reading the brief. Fast is not the same as well-paced.
Empty inputs are handled now, which is real progress. The gap that remains is the case the brief explicitly named: a dependency cycle should return an empty list, and yours returns a partial order instead.
Still the weakest dimension and barely moved. Single-letter names in the topological sort make it hard to follow, and using pop() on a list gives you depth-first behaviour where the brief implied no particular order — accidental rather than chosen.
Almost the mirror image of your first round. You banked the first three problems quickly and correctly, which is exactly the lesson from last time. Then you spent 39 of 70 minutes on the hard problem and submitted without checking it against the one requirement the brief called out. The last five minutes are worth more spent re-reading the brief than writing more code.
All hidden tests passed, in half the runs you needed last time.
Nothing to add. This is a solved pattern for you.
All 9 hidden tests passed. Sorting each word as the bucket key is the standard approach and you got there directly.
For very long words a character-count key avoids the sort, but at these input sizes your version is the right call.
All 8 hidden tests passed, including the large inputs that timed out last round. You recognised the two-pointer shape this time.
This is the clearest improvement in the round. The window logic is correct and the single pass is what the hidden tests were checking for.
The topological sort itself is correct and 5 of 10 hidden tests passed.
Every failing test contains a dependency cycle. Your function returns a partial ordering instead of the empty list the brief asks for.
After the loop, compare len(out) to len(tasks). If they differ, a cycle exists and you return []. That is two lines and it was worth half the marks on this problem.
