Resposta A: OpenAI GPT-5.4
def resolve_dependencies(packages: dict[str, list[str]]) -> list[str]:
"""
Retorna uma ordem de instalação válida para o grafo de dependência de pacotes fornecido.
Regras:
- Toda dependência deve aparecer antes do pacote que depende dela.
- Levanta ValueError se uma dependência estiver faltando na entrada.
- Levanta ValueError se uma dependência circular for detectada.
"""
if not isinstance(packages, dict):
raise ValueError("packages deve ser um dicionário mapeando nomes de pacotes para listas de dependências")
visited = set() # Pacotes totalmente processados...
Mostrar resposta completa ▼
def resolve_dependencies(packages: dict[str, list[str]]) -> list[str]:
"""
Retorna uma ordem de instalação válida para o grafo de dependência de pacotes fornecido.
Regras:
- Toda dependência deve aparecer antes do pacote que depende dela.
- Levanta ValueError se uma dependência estiver faltando na entrada.
- Levanta ValueError se uma dependência circular for detectada.
"""
if not isinstance(packages, dict):
raise ValueError("packages deve ser um dicionário mapeando nomes de pacotes para listas de dependências")
visited = set() # Pacotes totalmente processados
visiting = set() # Pacotes atualmente na pilha DFS
order = []
path = []
def dfs(package: str) -> None:
if package in visited:
return
if package in visiting:
cycle_start = path.index(package)
cycle = path[cycle_start:] + [package]
raise ValueError(
"Dependência circular detectada: " + " -> ".join(cycle)
)
if package not in packages:
raise ValueError(f"Dependência faltando: '{package}' não é um pacote definido")
visiting.add(package)
path.append(package)
dependencies = packages[package]
if not isinstance(dependencies, list):
raise ValueError(f"Dependências para o pacote '{package}' devem ser uma lista")
for dep in dependencies:
if dep not in packages:
raise ValueError(
f"Dependência faltando: o pacote '{package}' depende do pacote indefinido '{dep}'"
)
dfs(dep)
path.pop()
visiting.remove(package)
visited.add(package)
order.append(package)
for package in packages:
dfs(package)
return order
Resultado
Votos de vitoria
1 / 3
Pontuacao media
Pontuacao total
Comentario geral
Implementa uma ordenação topológica correta baseada em DFS com deteção explícita de dependências circulares (através de um conjunto de pilha de recursão) e dependências em falta (tanto ao entrar na dfs como ao iterar as dependências). Produz uma ordem válida de dependência primeiro em componentes desconectados e lida com entrada vazia. As mensagens de erro são descritivas e incluem um caminho de ciclo. Pequenas desvantagens são algumas verificações redundantes (pacote não em pacotes em dfs é inalcançável dada a verificação de dependência anterior) e validação de entrada ligeiramente extra além dos requisitos, mas estas não prejudicam a correção.
Ver detalhes da avaliacao ▼
Correcao
Peso 35%Ordenação topológica DFS correta com deteção de ciclo de pilha de recursão; levanta corretamente ValueError para ciclos e para dependências não presentes na entrada; mantém o invariante dependência-antes-dependente.
Completude
Peso 20%Cobre todos os comportamentos especificados (ordem válida, erro de ciclo, erro de dependência em falta) e funciona para grafos vazios e desconectados; inclui mensagens descritivas.
Qualidade do codigo
Peso 20%Legível e bem estruturado com docstring e nomes de variáveis claros; pequena redundância (verificação de pacote em falta dentro de dfs mais verificação de dependência) e trabalho extra de caminho/índice, mas aceitável.
Valor pratico
Peso 15%Mais prático em uso real devido a verificações defensivas (por exemplo, tipo de lista de dependências) e mensagens de erro detalhadas, incluindo a cadeia de ciclo.
Seguimento de instrucoes
Peso 10%Cumpre a intenção da assinatura, não usa bibliotecas externas, levanta ValueError para ambos os casos de erro necessários com mensagens descritivas e retorna uma ordem válida.
Pontuacao total
Comentario geral
A Resposta A implementa uma ordenação topológica correta baseada em DFS com bom tratamento de erros. Detecta corretamente dependências circulares e ausentes. No entanto, há um bug subtil: a verificação de dependência ausente para um pacote que não está em `packages` é feita no início de `dfs`, mas a verificação `if package not in packages` ocorre antes da verificação `visiting`, o que significa que se um pacote ausente for alcançado de alguma forma, ele é levantado corretamente. Mais importante ainda, a verificação `if dep not in packages` dentro do loop é redundante com a verificação no topo de `dfs`, mas ambas estão presentes. O código também inclui validação extra (verificações isinstance) que adiciona robustez. O rastreamento de caminho para detecção de ciclo está correto. O código é limpo e bem documentado.
Ver detalhes da avaliacao ▼
Correcao
Peso 35%A Resposta A implementa corretamente a ordenação topológica com DFS, detecta dependências circulares com rastreamento de caminho e levanta ValueError para dependências ausentes. A lógica é sólida e lida corretamente com todos os três casos de exemplo. Redundância menor nas verificações de dependência ausente, mas sem bugs funcionais.
Completude
Peso 20%A Resposta A lida com todos os casos necessários: resolução válida, dependências circulares e dependências ausentes. Também adiciona validação extra para tipos de entrada. A docstring explica as regras claramente.
Qualidade do codigo
Peso 20%A Resposta A é legível e bem comentada. No entanto, tem alguma redundância: a dependência ausente é verificada tanto no início de dfs (para o próprio pacote) quanto dentro do loop (para as dependências). O uso de ambos os conjuntos `visited` e `visiting` mais uma lista `path` é ligeiramente mais complexo do que o necessário.
Valor pratico
Peso 15%A Resposta A fornece mensagens de erro claras com contexto (qual pacote depende de qual pacote indefinido e o caminho completo do ciclo). A validação extra isinstance adiciona alguma robustez para uso no mundo real.
Seguimento de instrucoes
Peso 10%A Resposta A segue todas as instruções: assinatura de função correta, levanta ValueError para dependências circulares e ausentes, sem importações externas e retorna uma ordem de instalação válida.
Pontuacao total
Comentario geral
A Resposta A fornece uma solução correta e robusta usando uma ordenação topológica padrão baseada em DFS. Seus pontos fortes incluem o gerenciamento claro do estado com os conjuntos `visited` e `visiting` e uma excelente mensagem de erro para dependências circulares que mostra o ciclo exato. No entanto, ela mistura a lógica de verificação de dependências ausentes com o algoritmo de ordenação, levando a verificações potencialmente redundantes e um código ligeiramente menos limpo em comparação com a realização da validação antecipadamente. Ela também inclui alguma verificação de tipo extra que, embora robusta, adiciona um pouco de verbosidade.
Ver detalhes da avaliacao ▼
Correcao
Peso 35%A solução é funcionalmente correta e lida com todos os casos especificados, incluindo grafos válidos, dependências circulares e dependências ausentes. A lógica DFS implementa corretamente uma ordenação topológica.
Completude
Peso 20%A resposta atende integralmente a todos os requisitos da solicitação. Ela retorna uma lista válida, levanta ValueError para as duas condições de erro especificadas e não usa bibliotecas externas.
Qualidade do codigo
Peso 20%O código é de boa qualidade, com nomes de variáveis claros e uma implementação DFS padrão. A mensagem de erro para ciclos é particularmente útil. No entanto, ela mistura a validação (verificações de dependências ausentes) dentro do algoritmo de ordenação, o que é um design ligeiramente menos limpo.
Valor pratico
Peso 15%A função é uma implementação prática e útil de um resolvedor de dependências. Ela poderia ser usada em cenários do mundo real. A mensagem de erro detalhada de ciclo adiciona um valor prático significativo para depuração.
Seguimento de instrucoes
Peso 10%A solução segue perfeitamente todas as instruções, incluindo a assinatura da função, os tipos de erro exigidos e a restrição de não usar bibliotecas externas.