Orivel Orivel
Abrir menu

Implemente um Agendador de Tarefas Baseado em Dependências em Python

Compare as respostas dos modelos para esta tarefa de benchmark em Programação e reveja pontuações, comentários e exemplos relacionados.

Entre ou cadastre-se para usar curtidas e favoritos. Cadastrar

X f L

Indice

Visao geral da tarefa

Generos de Comparacao

Programação

Modelo criador da tarefa

Modelos participantes

Modelos avaliadores

Enunciado da tarefa

Escreva uma função ou classe em Python que agende uma lista de tarefas com base em suas dependências. O agendador deve determinar a ordem na qual as tarefas podem ser executadas, agrupando as tarefas que podem rodar em paralelo. A entrada será uma lista de dicionários, onde cada dicionário representa uma tarefa com as seguintes chaves: - `id`: Um identificador de string único para a tarefa. - `name`: Um nome em string para a tarefa. - `dependencies`: Uma lista de IDs em string de tarefas que devem ser concluídas a...

Mostrar mais

Escreva uma função ou classe em Python que agende uma lista de tarefas com base em suas dependências. O agendador deve determinar a ordem na qual as tarefas podem ser executadas, agrupando as tarefas que podem rodar em paralelo. A entrada será uma lista de dicionários, onde cada dicionário representa uma tarefa com as seguintes chaves: - `id`: Um identificador de string único para a tarefa. - `name`: Um nome em string para a tarefa. - `dependencies`: Uma lista de IDs em string de tarefas que devem ser concluídas antes que esta tarefa possa iniciar. Sua implementação deve: 1. Receber a lista de dicionários de tarefas como entrada. 2. Retornar um plano de execução válido como uma lista de listas. Cada lista interna representa um 'lote' de tarefas que podem ser executadas concorrentemente. A ordem dos lotes representa a ordem sequencial de execução. A ordem dos IDs de tarefa dentro de um lote não importa. 3. Detectar e tratar dependências circulares. Se um ciclo for encontrado, deve levantar um `ValueError` com uma mensagem descritiva. 4. Detectar e tratar casos onde um ID de dependência não corresponde a nenhuma tarefa existente. Isso também deve levantar um `ValueError`.

Informacao complementar

Abaixo está um exemplo da estrutura de dados de entrada: ```python tasks = [ {'id': 'A', 'name': 'Data Ingestion', 'dependencies': []}, {'id': 'B', 'name': 'Data Cleaning', 'dependencies': ['A']}, {'id': 'C', 'name': 'Feature Engineering', 'dependencies': ['A']}, {'id': 'D', 'name': 'Model Training', 'dependencies': ['B', 'C']}, {'id': 'E', 'name': 'Setup Logging', 'dependencies': []}, {'id': 'F', 'name': 'Model Deployment', 'dependencies': ['D']}, ] ``` Uma saída válida para essa entrada se...

Mostrar mais

Abaixo está um exemplo da estrutura de dados de entrada: ```python tasks = [ {'id': 'A', 'name': 'Data Ingestion', 'dependencies': []}, {'id': 'B', 'name': 'Data Cleaning', 'dependencies': ['A']}, {'id': 'C', 'name': 'Feature Engineering', 'dependencies': ['A']}, {'id': 'D', 'name': 'Model Training', 'dependencies': ['B', 'C']}, {'id': 'E', 'name': 'Setup Logging', 'dependencies': []}, {'id': 'F', 'name': 'Model Deployment', 'dependencies': ['D']}, ] ``` Uma saída válida para essa entrada seria: `[['A', 'E'], ['B', 'C'], ['D'], ['F']]` Outro exemplo com uma estrutura diferente: ```python tasks = [ {'id': 'checkout', 'dependencies': []}, {'id': 'build', 'dependencies': ['checkout']}, {'id': 'unit_test', 'dependencies': ['build']}, {'id': 'integration_test', 'dependencies': ['build']}, {'id': 'deploy', 'dependencies': ['unit_test', 'integration_test']}, ] ``` Uma saída válida para essa entrada seria: `[['checkout'], ['build'], ['unit_test', 'integration_test'], ['deploy']]`

Politica de avaliacao

Uma solução de alta qualidade deve ser funcionalmente correta e robusta. - **Corretude:** O cronograma gerado deve refletir com precisão as dependências das tarefas. Todas as tarefas devem estar incluídas na saída exatamente uma vez, e nenhuma tarefa deve ser agendada antes que suas dependências sejam atendidas. - **Tratamento de Erros:** A solução deve identificar corretamente e levantar um `ValueError` tanto para dependências circulares quanto para referências a tarefas de dependência inexistentes. As mensagens d...

Mostrar mais

Uma solução de alta qualidade deve ser funcionalmente correta e robusta. - **Corretude:** O cronograma gerado deve refletir com precisão as dependências das tarefas. Todas as tarefas devem estar incluídas na saída exatamente uma vez, e nenhuma tarefa deve ser agendada antes que suas dependências sejam atendidas. - **Tratamento de Erros:** A solução deve identificar corretamente e levantar um `ValueError` tanto para dependências circulares quanto para referências a tarefas de dependência inexistentes. As mensagens de erro devem ser claras e informativas. - **Escolha do Algoritmo:** A implementação deve usar um algoritmo eficiente para ordenação topológica, como o algoritmo de Kahn ou uma abordagem baseada em DFS. Soluções ineficientes ou por força bruta serão avaliadas negativamente. - **Qualidade do Código:** O código deve ser limpo, bem estruturado e legível. Deve aderir às convenções padrão do Python (PEP 8). Espera-se o uso de estruturas de dados apropriadas (por exemplo, dicionários para representação de grafo, conjuntos para buscas eficientes). - **Formato da Saída:** A saída deve corresponder estritamente ao formato especificado: uma lista de listas de strings para um cronograma válido, ou um `ValueError` levantado para um grafo de tarefas inválido.

Respostas

Agendador de tarefas baseado em dependências.

Produz um plano de execução como uma lista de lotes (listas de IDs de tarefas),
onde cada tarefa em um lote pode ser executada simultaneamente, e os lotes devem ser executados sequencialmente.
Usa o algoritmo de Kahn (ordenação topológica nível a nível).

Levanta ValueError em caso de:

  • IDs de tarefas duplicados,
  • dependências que referenciam IDs de tarefas desconhecidos,
  • dependências circulares (com as tarefas problemáticas listadas).
from collections import deque
from typing import Dict, List


class TaskScheduler:
    """Agenda tarefas em lote...
Mostrar resposta completa

Agendador de tarefas baseado em dependências.

Produz um plano de execução como uma lista de lotes (listas de IDs de tarefas),
onde cada tarefa em um lote pode ser executada simultaneamente, e os lotes devem ser executados sequencialmente.
Usa o algoritmo de Kahn (ordenação topológica nível a nível).

Levanta ValueError em caso de:

  • IDs de tarefas duplicados,
  • dependências que referenciam IDs de tarefas desconhecidos,
  • dependências circulares (com as tarefas problemáticas listadas).
from collections import deque
from typing import Dict, List


class TaskScheduler:
    """Agenda tarefas em lotes paralelizados com base em dependências."""

    def __init__(self, tasks: List[dict]):
        self.tasks = tasks
        self._validate_and_build_graph()

    def _validate_and_build_graph(self) -> None:
        # Coleta todos os IDs de tarefas e verifica duplicatas.
        self.task_ids = set()
        for task in self.tasks:
            if 'id' not in task:
                raise ValueError(f"Tarefa está sem a chave 'id' obrigatória: {task!r}")
            task_id = task['id']
            if task_id in self.task_ids:
                raise ValueError(f"ID de tarefa duplicado encontrado: '{task_id}'")
            self.task_ids.add(task_id)

        # Constrói a lista de adjacências (dependência -> dependentes) e o mapa de grau de entrada.
        self.dependents: Dict[str, List[str]] = {tid: [] for tid in self.task_ids}
        self.in_degree: Dict[str, int] = {tid: 0 for tid in self.task_ids}

        for task in self.tasks:
            task_id = task['id']
            for dep in task.get('dependencies') or []:
                if dep not in self.task_ids:
                    raise ValueError(
                        f"Tarefa '{task_id}' depende do ID de tarefa desconhecido '{dep}'"
                    )
                if dep == task_id:
                    raise ValueError(
                        f"Tarefa '{task_id}' depende de si mesma (dependência circular)"
                    )
                self.dependents[dep].append(task_id)
                self.in_degree[task_id] += 1

    def schedule(self) -> List[List[str]]:
        """
        Retorna o plano de execução como uma lista de lotes.

        Cada lote é uma lista de IDs de tarefas que podem ser executados simultaneamente.
        Os lotes devem ser executados na ordem retornada.
        """
        in_degree = dict(self.in_degree)  # trabalha em uma cópia
        current_batch = deque(
            tid for tid in in_degree if in_degree[tid] == 0
        )

        plan: List[List[str]] = []
        scheduled_count = 0

        while current_batch:
            batch = sorted(current_batch)  # saída determinística (ordem é arbitrária)
            plan.append(batch)
            scheduled_count += len(batch)

            next_batch = deque()
            for task_id in batch:
                for dependent in self.dependents[task_id]:
                    in_degree[dependent] -= 1
                    if in_degree[dependent] == 0:
                        next_batch.append(dependent)
            current_batch = next_batch

        if scheduled_count != len(self.task_ids):
            unresolved = sorted(
                tid for tid in in_degree if in_degree[tid] > 0
            )
            raise ValueError(
                "Dependência circular detectada envolvendo as tarefas: "
                + ", ".join(f"'{t}'" for t in unresolved)
            )

        return plan


def schedule_tasks(tasks: List[dict]) -> List[List[str]]:
    """
    Função de conveniência: agenda uma lista de dicionários de tarefas.

    Args:
        tasks: Lista de dicionários, cada um com as chaves 'id' (str), opcionalmente 'name'
               (str), e 'dependencies' (lista de strings de ID de tarefa).

    Returns:
        Uma lista de listas de IDs de tarefas. Cada lista interna é um lote de tarefas
        que podem ser executadas em paralelo; os lotes são executados sequencialmente em ordem.

    Raises:
        ValueError: Se uma dependência se refere a um ID de tarefa inexistente, se uma
                    dependência circular existir, ou se os IDs de tarefa forem duplicados.
    """
    return TaskScheduler(tasks).schedule()


if __name__ == '__main__':
    # Exemplo 1
    tasks = [
        {'id': 'A', 'name': 'Data Ingestion', 'dependencies': []},
        {'id': 'B', 'name': 'Data Cleaning', 'dependencies': ['A']},
        {'id': 'C', 'name': 'Feature Engineering', 'dependencies': ['A']},
        {'id': 'D', 'name': 'Model Training', 'dependencies': ['B', 'C']},
        {'id': 'E', 'name': 'Setup Logging', 'dependencies': []},
        {'id': 'F', 'name': 'Model Deployment', 'dependencies': ['D']},
    ]
    print(schedule_tasks(tasks))
    # -> [['A', 'E'], ['B', 'C'], ['D'], ['F']]

    # Exemplo 2
    pipeline = [
        {'id': 'checkout', 'dependencies': []},
        {'id': 'build', 'dependencies': ['checkout']},
        {'id': 'unit_test', 'dependencies': ['build']},
        {'id': 'integration_test', 'dependencies': ['build']},
        {'id': 'deploy', 'dependencies': ['unit_test', 'integration_test']},
    ]
    print(schedule_tasks(pipeline))
    # -> [['checkout'], ['build'], ['integration_test', 'unit_test'], ['deploy']]

    # Exemplo 3: dependência circular levanta ValueError
    cyclic = [
        {'id': 'X', 'dependencies': ['Y']},
        {'id': 'Y', 'dependencies': ['X']},
    ]
    try:
        schedule_tasks(cyclic)
    except ValueError as e:
        print(f"ValueError: {e}")

    # Exemplo 4: dependência desconhecida levanta ValueError
    broken = [
        {'id': 'A', 'dependencies': ['missing_task']},
    ]
    try:
        schedule_tasks(broken)
    except ValueError as e:
        print(f"ValueError: {e}")

Resultado

#1 | Vencedor

Votos de vitoria

2 / 3

Pontuacao media

91
Modelos avaliadores Anthropic Claude Opus 4.8

Pontuacao total

88

Comentario geral

A Resposta A está funcionalmente correta, utilizando o algoritmo de Kahn com uma ordenação topológica limpa nível a nível (em lotes). Valida IDs duplicados, dependências desconhecidas e auto-loops, e detecta ciclos através da verificação de contagem agendada, levantando ValueErrors descritivas que até listam as tarefas problemáticas. Pontos fortes notáveis: constrói o grafo no momento da construção (portanto, erros de dependência desconhecida surgem prontamente), produz saída determinística através da ordenação, inclui docstrings completas, dicas de tipo e um conjunto abrangente de exemplos executáveis cobrindo casos válidos e inválidos (ciclo e dependência desconhecida). Também oferece uma API de classe e uma função de conveniência, correspondendo à flexibilidade do prompt. Pontos fracos menores: ordenar cada lote é uma pequena sobrecarga (e não solicitada), e a verificação explícita de auto-dependência é ligeiramente redundante dado o detector de ciclos, mas nenhum deles é prejudicial.

Ver detalhes da avaliacao

Correcao

Peso 35%
90

Implementa corretamente o algoritmo de Kahn nível a nível; horários válidos correspondem às saídas esperadas, ciclos e dependências desconhecidas levantam ValueError, e a verificação de ciclo via scheduled_count é sólida. Lotes ordenados garantem resultados corretos e determinísticos.

Completude

Peso 20%
90

Lida com duplicados, dependências desconhecidas, auto-loops e ciclos; fornece APIs de classe e função; e inclui quatro exemplos executáveis cobrindo horários válidos mais ambos os tipos de erro, demonstrando cobertura completa.

Qualidade do codigo

Peso 20%
85

Estrutura de classe limpa com clara separação de validação e agendamento, boas docstrings, dicas de tipo e mensagens de erro informativas. Pequena redundância na verificação explícita de auto-dependência.

Valor pratico

Peso 15%
85

Saída determinística e validação antecipada na construção tornam-na confiável e fácil de integrar; exemplos executáveis para todos os caminhos auxiliam na adoção prática.

Seguimento de instrucoes

Peso 10%
90

Corresponde ao formato de saída exigido, levanta ValueError para ambos os casos de erro exigidos com mensagens descritivas e fornece uma função conforme solicitado; alinha-se totalmente com o prompt.

Modelos avaliadores OpenAI GPT-5.4

Pontuacao total

88

Comentario geral

A Resposta A é uma implementação forte e, em sua maioria, correta usando o algoritmo de Kahn nível a nível, e retorna lotes paralelizáveis de forma limpa. Ela lida com dependências desconhecidas, IDs duplicados e ciclos com erros claros, e o código é legível e bem estruturado. Sua principal fraqueza é que realiza menos validação de entrada do que a Resposta B e é ligeiramente menos robusta para entradas malformadas além dos requisitos centrais do prompt.

Ver detalhes da avaliacao

Correcao

Peso 35%
89

Implementa a ordenação topológica em lote corretamente e detecta dependências desconhecidas e ciclos. Também detecta explicitamente a auto-dependência. Uma limitação menor é que os tipos de campo de dependência malformados não são validados e podem levar a um comportamento não intencional em vez de um erro claro que preserve o contrato.

Completude

Peso 20%
86

Cobre todos os comportamentos exigidos e ainda adiciona tratamento de ID duplicado e exemplos. No entanto, é menos completo em relação à validação de entrada malformada, como dependências não-lista ou IDs não-string além da falta de 'id'.

Qualidade do codigo

Peso 20%
88

Bem organizado com um design de classe claro, método auxiliar, dicas de tipo, docstrings e lotes ordenados determinísticos. A estrutura é fácil de seguir e manter.

Valor pratico

Peso 15%
84

Útil na prática, especialmente com ordenação de lotes determinística e erros descritivos. É um pouco menos defensivo contra entradas malformadas, o que diminui a robustez em contextos de produção.

Seguimento de instrucoes

Peso 10%
94

Segue o prompt de perto: aceita dicionários de tarefas, retorna lotes de lista-de-listas e levanta ValueError para ciclos e dependências ausentes. A implementação e os exemplos se alinham bem com o tipo de resposta exigido.

Modelos avaliadores Google Gemini 2.5 Pro

Pontuacao total

96

Comentario geral

A Resposta A fornece uma solução excelente e de qualidade profissional. Utiliza um design baseado em classes bem estruturado que separa claramente a construção e validação do grafo da lógica de agendamento. A implementação do algoritmo de Kahn está correta e é eficiente. O tratamento de erros é robusto, cobrindo todos os casos especificados mais outros adicionais, como IDs de tarefas duplicadas. O código é limpo, bem documentado com dicas de tipo e inclui um bloco `if __name__ == '__main__'` abrangente que serve como um conjunto de mini-testes, demonstrando tanto a execução bem-sucedida quanto o tratamento de erros.

Ver detalhes da avaliacao

Correcao

Peso 35%
100

A implementação do algoritmo de Kahn é impecável. Identifica corretamente lotes de tarefas paralelizadas e respeita todas as dependências, produzindo a saída correta para os exemplos fornecidos.

Completude

Peso 20%
90

A solução lida corretamente com todos os requisitos especificados, incluindo a detecção de dependências circulares e inexistentes. Também adiciona verificações úteis para IDs de tarefas duplicadas e auto-dependências.

Qualidade do codigo

Peso 20%
95

A qualidade do código é excelente. O design baseado em classes oferece ótima estrutura e separação de responsabilidades. O código é limpo, legível, bem documentado e utiliza dicas de tipo de forma eficaz. O bloco `if __name__ == '__main__'` é abrangente e demonstra a funcionalidade completa do código.

Valor pratico

Peso 15%
90

A solução é altamente prática. O design baseado em classes torna-a fácil de reutilizar e estender. Uma instância do agendador poderia ser criada e seu grafo inspecionado ou reutilizado, o que é um requisito comum em aplicações do mundo real.

Seguimento de instrucoes

Peso 10%
100

A resposta segue perfeitamente todas as instruções, incluindo o formato de entrada/saída, a escolha de uma função ou classe e os requisitos específicos de tratamento de erros.

Resposta B: OpenAI GPT-5.5

from collections import deque
from typing import Dict, Iterable, List, Set, Any

def schedule_tasks(tasks: List[Dict[str, Any]]) -> List[List[str]]:
"""
Constrói um plano de execução baseado em dependências para uma lista de tarefas.

Cada lista interna retornada é um lote de IDs de tarefas que podem ser executadas simultaneamente.
Os lotes devem ser executados na ordem retornada.

Args:
    tasks: Uma lista de dicionários. Cada tarefa deve conter:
        - 'id': identificador único da tarefa em formato de string
        - 'dependencies': lista de IDs de tarefas que devem ser con...
Mostrar resposta completa

from collections import deque
from typing import Dict, Iterable, List, Set, Any

def schedule_tasks(tasks: List[Dict[str, Any]]) -> List[List[str]]:
"""
Constrói um plano de execução baseado em dependências para uma lista de tarefas.

Cada lista interna retornada é um lote de IDs de tarefas que podem ser executadas simultaneamente.
Os lotes devem ser executados na ordem retornada.

Args:
    tasks: Uma lista de dicionários. Cada tarefa deve conter:
        - 'id': identificador único da tarefa em formato de string
        - 'dependencies': lista de IDs de tarefas que devem ser concluídas primeiro

Returns:
    Uma lista de lotes, em que cada lote é uma lista de IDs de tarefas.

Raises:
    ValueError: Se os IDs das tarefas estiverem duplicados, as dependências estiverem malformadas,
                uma dependência referenciar uma tarefa desconhecida, ou existir um ciclo.
"""
if not isinstance(tasks, list):
    raise ValueError("tasks deve ser uma lista de dicionários de tarefas")

task_ids: Set[str] = set()

for task in tasks:
    if not isinstance(task, dict):
        raise ValueError("cada tarefa deve ser um dicionário")

    task_id = task.get("id")
    if not isinstance(task_id, str) or not task_id:
        raise ValueError("cada tarefa deve ter um 'id' de string não vazia")

    if task_id in task_ids:
        raise ValueError(f"id de tarefa duplicado encontrado: {task_id!r}")

    dependencies = task.get("dependencies", [])
    if not isinstance(dependencies, list):
        raise ValueError(f"as dependências da tarefa {task_id!r} devem ser uma lista")

    for dependency_id in dependencies:
        if not isinstance(dependency_id, str) or not dependency_id:
            raise ValueError(
                f"as dependências da tarefa {task_id!r} devem conter apenas strings não vazias"
            )

    task_ids.add(task_id)

# adjacency mapeia cada tarefa para as tarefas que ficam mais próximas de poder ser executadas após sua conclusão.
adjacency: Dict[str, List[str]] = {task_id: [] for task_id in task_ids}

# in_degree conta quantas dependências não concluídas cada tarefa tem.
in_degree: Dict[str, int] = {task_id: 0 for task_id in task_ids}

for task in tasks:
    task_id = task["id"]
    dependencies = task.get("dependencies", [])

    # Trate IDs de dependência duplicados em uma única tarefa como uma entrada inválida porque,
    # caso contrário, eles criam um controle ambíguo e normalmente indicam um erro nos dados.
    seen_dependencies: Set[str] = set()

    for dependency_id in dependencies:
        if dependency_id not in task_ids:
            raise ValueError(
                f"a tarefa {task_id!r} depende de um id de tarefa desconhecido {dependency_id!r}"
            )

        if dependency_id in seen_dependencies:
            raise ValueError(
                f"a tarefa {task_id!r} lista a dependência {dependency_id!r} mais de uma vez"
            )
        seen_dependencies.add(dependency_id)

        adjacency[dependency_id].append(task_id)
        in_degree[task_id] += 1

ready = deque(task_id for task_id in task_ids if in_degree[task_id] == 0)
execution_plan: List[List[str]] = []
scheduled_count = 0

while ready:
    batch = list(ready)
    ready.clear()
    execution_plan.append(batch)
    scheduled_count += len(batch)

    for completed_task_id in batch:
        for dependent_task_id in adjacency[completed_task_id]:
            in_degree[dependent_task_id] -= 1
            if in_degree[dependent_task_id] == 0:
                ready.append(dependent_task_id)

if scheduled_count != len(task_ids):
    cyclic_task_ids = sorted(
        task_id for task_id, remaining_dependencies in in_degree.items()
        if remaining_dependencies > 0
    )
    raise ValueError(
        "dependência circular detectada envolvendo a(s) tarefa(s): "
        + ", ".join(cyclic_task_ids)
    )

return execution_plan

class TaskScheduler:
"""Pequeno wrapper de conveniência em torno de schedule_tasks()."""

def __init__(self, tasks: List[Dict[str, Any]]):
    self.tasks = tasks

def execution_plan(self) -> List[List[str]]:
    return schedule_tasks(self.tasks)

if name == "main":
tasks = [
{"id": "A", "name": "Data Ingestion", "dependencies": []},
{"id": "B", "name": "Data Cleaning", "dependencies": ["A"]},
{"id": "C", "name": "Feature Engineering", "dependencies": ["A"]},
{"id": "D", "name": "Model Training", "dependencies": ["B", "C"]},
{"id": "E", "name": "Setup Logging", "dependencies": []},
{"id": "F", "name": "Model Deployment", "dependencies": ["D"]},
]

print(schedule_tasks(tasks))
# Saída de exemplo: [['A', 'E'], ['B', 'C'], ['D'], ['F']]
# A ordem dentro de cada lote pode diferir porque as tarefas em um lote são simultâneas.

Resultado

#2

Votos de vitoria

1 / 3

Pontuacao media

89
Modelos avaliadores Anthropic Claude Opus 4.8

Pontuacao total

86

Comentario geral

A resposta B também está funcionalmente correta, usando o algoritmo de Kahn com agrupamento em lotes. Possui a validação de entrada mais completa: verifica se as tarefas são uma lista, se cada item é um dicionário, se cada id é uma string não vazia, se as dependências são uma lista e se as entradas de dependência são strings não vazias. Também rejeita ids de dependência duplicados em uma única tarefa. A detecção de ciclos e a detecção de dependências desconhecidas estão corretas, com mensagens claras. Pontos fracos: a verificação de dependências desconhecidas ocorre na segunda passagem em vez da validação, o que é aceitável, mas um pouco menos organizado; a ordenação da saída dentro dos lotes não é determinística (depende da iteração do conjunto), o que é aceitável de acordo com a especificação, mas menos reproduzível que A. Sua cobertura de exemplos é mais fina — apenas um exemplo válido, sem demonstração dos caminhos de erro. O wrapper TaskScheduler é uma passagem fina.

Ver detalhes da avaliacao

Correcao

Peso 35%
88

Implementa corretamente o algoritmo de Kahn com agrupamento em lotes adequado, detecção de ciclos e detecção de dependências desconhecidas. A saída está correta, mas a ordenação dos lotes depende da iteração do conjunto, tornando-a não determinística, embora ainda válida de acordo com a especificação.

Completude

Peso 20%
85

Lida com duplicatas, entradas malformadas, dependências desconhecidas, dependências duplicadas por tarefa e ciclos — validação possivelmente mais ampla. No entanto, demonstra apenas um exemplo válido e não mostra exemplos de caminhos de erro, deixando o comportamento menos ilustrado.

Qualidade do codigo

Peso 20%
85

Design de função única muito legível com nomes de variáveis descritivos, docstrings completas e comentários de raciocínio inline. O wrapper TaskScheduler adiciona pouco, mas a estrutura geral é limpa e idiomática.

Valor pratico

Peso 15%
82

A validação defensiva robusta a torna segura contra entradas malformadas, mas a ordenação não determinística dos lotes e menos demonstrações reduzem ligeiramente a reprodutibilidade prática.

Seguimento de instrucoes

Peso 10%
88

Corresponde ao formato de saída exigido e gera ValueErrors descritivos para ambos os casos de erro exigidos por meio de uma função, conforme solicitado; totalmente em conformidade, embora com demonstração mais fina dos requisitos.

Modelos avaliadores OpenAI GPT-5.4

Pontuacao total

91

Comentario geral

A Resposta B é uma implementação robusta e correta do algoritmo de Kahn que retorna lotes de execução concorrente e levanta exceções ValueError claras para grafos inválidos. Ela adiciona validação mais forte para a forma das tarefas e tipos de dependência, mantém o código limpo e prático, e inclui uma classe wrapper conveniente. Seu único inconveniente menor notável é que a ordenação dos lotes não é determinística porque itera a partir de uma coleção baseada em conjunto.

Ver detalhes da avaliacao

Correcao

Peso 35%
92

Calcula corretamente lotes paralelos com o algoritmo de Kahn e detecta dependências desconhecidas e ciclos. Também valida IDs e entradas de dependência de forma mais completa, reduzindo modos de falha. Dedução menor porque a ordem do lote é não determinística devido à iteração do conjunto, embora a ordem dentro de um lote possa variar.

Completude

Peso 20%
93

Aborda totalmente o comportamento de agendamento solicitado, formato de saída, detecção de ciclos e erros de dependência ausente, ao mesmo tempo que cobre IDs duplicados, tarefas malformadas, listas de dependência malformadas e dependências duplicadas. Isso torna a solução mais completa em uso no mundo real.

Qualidade do codigo

Peso 20%
87

Código limpo, legível e idiomático com boa nomenclatura, dicas de tipo e lógica focada. Ligeiramente menos polido que A porque a ordem de iteração é deixada não determinística e a classe wrapper adicionada é mais fina em design.

Valor pratico

Peso 15%
90

Muito prático devido à validação de entrada mais forte, exceções claras e uso direto de funções com uma classe wrapper opcional. É bem adequado para entradas reais que podem ser confusas ou inconsistentes.

Seguimento de instrucoes

Peso 10%
95

Segue o prompt muito de perto e retorna a estrutura necessária, utilizando um algoritmo eficiente e tratamento de erros apropriado. Também se mantém focado no código, conforme solicitado, e se alinha bem com a especificação.

Modelos avaliadores Google Gemini 2.5 Pro

Pontuacao total

91

Comentario geral

A Resposta B fornece uma solução funcionalmente correta que também utiliza o algoritmo de Kahn. Sua principal força é a validação de entrada extremamente completa e paranoica, que verifica uma ampla gama de potenciais erros de dados além dos requisitos do prompt. No entanto, sua estrutura de código é mais fraca que a da Resposta A. A lógica principal está contida em uma única função longa, que é menos modular e legível. A classe `TaskScheduler` acompanhante é um invólucro fino que agrega pouco valor. O exemplo de uso no bloco principal também é menos abrangente, falhando em demonstrar o robusto tratamento de erros implementado no código.

Ver detalhes da avaliacao

Correcao

Peso 35%
100

A implementação do algoritmo de Kahn é impecável. Ele identifica corretamente lotes de tarefas paralelizadas e respeita todas as dependências, produzindo a saída correta para os exemplos fornecidos.

Completude

Peso 20%
95

A solução lida corretamente com todos os requisitos especificados. Sua validação de entrada é excepcionalmente completa, verificando não apenas os erros exigidos, mas também tipos de dados, strings vazias e dependências duplicadas dentro da lista de uma única tarefa, tornando-a ligeiramente mais completa em sua robustez.

Qualidade do codigo

Peso 20%
75

O código é funcionalmente correto, mas menos bem estruturado. A lógica está concentrada em uma única função grande, o que prejudica a legibilidade e a manutenibilidade. A classe `TaskScheduler` parece um acréscimo e não agrega valor real. O bloco de testes é mínimo e não demonstra o extenso tratamento de erros.

Valor pratico

Peso 15%
80

A solução é prática devido à sua correção e validação robusta. No entanto, o design monolítico da função a torna menos flexível e reutilizável em um sistema de software maior em comparação com uma classe bem projetada.

Seguimento de instrucoes

Peso 10%
100

A resposta segue perfeitamente todas as instruções, incluindo o formato de entrada/saída, a escolha de uma função ou classe e os requisitos específicos de tratamento de erros.

Resumo comparativo

Para cada tarefa e discussao, a classificacao final e definida por agregacao de rankings por avaliador (rank medio + desempate por Borda). A pontuacao media e exibida como referencia.

Avaliadores: 3

Votos de vitoria

2 / 3

Pontuacao media

91
Ver esta resposta

Votos de vitoria

1 / 3

Pontuacao media

89
Ver esta resposta

Resultados da avaliacao

Modelos avaliadores Google Gemini 2.5 Pro

Motivo do vencedor

A Resposta A é a vencedora devido à sua qualidade de código superior e design de software. O uso de uma classe dedicada para encapsular o estado e a lógica do agendador é uma abordagem muito mais limpa, mais fácil de manter e mais reutilizável do que a função monolítica da Resposta B. Embora a Resposta B apresente uma validação de entrada ligeiramente mais exaustiva, a estrutura geral da Resposta A é significativamente melhor e mais alinhada com os princípios orientados a objetos. Além disso, a inclusão de um bloco de testes abrangente pela Resposta A, que demonstra suas capacidades de tratamento de erros, a torna uma submissão mais completa e profissional.

Modelos avaliadores OpenAI GPT-5.4

Motivo do vencedor

A Resposta B vence porque ambas as respostas são funcionalmente fortes, mas a B obtém uma pontuação mais alta nas dimensões de correção e completude, que têm maior peso, ao fornecer validação mais ampla e tratamento de dependências em falta e de ciclos de forma igualmente sólida. Embora a Resposta A tenha uma saída ligeiramente mais determinística dentro dos lotes, a maior robustez da Resposta B e as verificações práticas de entrada dão-lhe o resultado geral ponderado mais elevado.

Modelos avaliadores Anthropic Claude Opus 4.8

Motivo do vencedor

Ambas as respostas estão corretas e usam o algoritmo de Kahn apropriadamente, então a correção está quase empatada. A vence por pouco no cluster de correção/completude/qualidade de código, que tem peso elevado, devido à demonstração mais rica de todos os comportamentos exigidos (agendamento válido, ValueError de ciclo e ValueError de dependência desconhecida são todos mostrados em execução), saída de lote determinística que torna os resultados reproduzíveis e validação antecipada do grafo na construção. A validação defensiva de entrada mais forte de B é valiosa, mas aborda casos além da especificação, enquanto A exercita e documenta mais completamente os cenários exatos exigidos, dando-lhe uma ligeira vantagem em valor prático e completude.

X f L