Orivel Orivel
Ouvrir le menu

Fonction Python pour la résolution des dépendances de paquets

Comparez les réponses des modèles pour cette tâche de benchmark en Programmation et consultez scores, commentaires et exemples liés.

Connectez-vous ou inscrivez-vous pour utiliser les likes et favoris. Inscription

X f L

Sommaire

Vue d’ensemble de la tâche

Genres de comparaison

Programmation

Modèle créateur de la tâche

Modèles participants

Modèles évaluateurs

Consigne de la tâche

Écrivez une fonction Python nommée resolve_dependencies qui prend un dictionnaire de paquets et de leurs dépendances et renvoie un ordre d'installation valide. La fonction doit gérer correctement les dépendances circulaires et les dépendances sur des paquets non définis dans l'entrée.

Informations complémentaires

La fonction doit accepter un argument : un dictionnaire dont les clés sont des noms de paquets (chaînes) et les valeurs sont des listes de chaînes représentant leurs dépendances directes.

Signature de la fonction : def resolve_dependencies(packages: dict[str, list[str]]) -> list[str]:

Politique d’évaluation

Une bonne réponse doit être fonctionnellement correcte, robuste et bien rédigée. Les solutions les mieux notées produiront correctement un tri topologique valide pour toutes les entrées valides et, surtout, identifieront et lèveront correctement une ValueError à la fois pour les dépendances circulaires et pour les dépendances manquantes comme spécifié. Le code doit être efficace (par exemple, en utilisant un algorithme standard comme celui de Kahn ou un tri topologique basé sur DFS), lisible et respecter les conv...

Afficher plus

Une bonne réponse doit être fonctionnellement correcte, robuste et bien rédigée. Les solutions les mieux notées produiront correctement un tri topologique valide pour toutes les entrées valides et, surtout, identifieront et lèveront correctement une ValueError à la fois pour les dépendances circulaires et pour les dépendances manquantes comme spécifié. Le code doit être efficace (par exemple, en utilisant un algorithme standard comme celui de Kahn ou un tri topologique basé sur DFS), lisible et respecter les conventions Python courantes. Les messages d'erreur doivent être clairs et utiles. Les solutions qui échouent sur des cas limites (par exemple, un dictionnaire d'entrée vide, un graphe avec des composantes déconnectées) ou qui sont inutilement complexes seront notées plus bas.

Réponses

Réponse A: OpenAI GPT-5.4

def resolve_dependencies(packages: dict[str, list[str]]) -> list[str]:
"""
Retourne un ordre d'installation valide pour le graphe de dépendances de paquets donné.

Règles :
- Chaque dépendance doit apparaître avant le paquet qui en dépend.
- Lève une ValueError si une dépendance est manquante dans l'entrée.
- Lève une ValueError si une dépendance circulaire est détectée.
"""
if not isinstance(packages, dict):
    raise ValueError("packages doit être un dictionnaire mappant les noms de paquets à des listes de dépendances")

visited = set()      # Paquets entièrement traités...
Afficher la réponse complète

def resolve_dependencies(packages: dict[str, list[str]]) -> list[str]:
"""
Retourne un ordre d'installation valide pour le graphe de dépendances de paquets donné.

Règles :
- Chaque dépendance doit apparaître avant le paquet qui en dépend.
- Lève une ValueError si une dépendance est manquante dans l'entrée.
- Lève une ValueError si une dépendance circulaire est détectée.
"""
if not isinstance(packages, dict):
    raise ValueError("packages doit être un dictionnaire mappant les noms de paquets à des listes de dépendances")

visited = set()      # Paquets entièrement traités
visiting = set()     # Paquets actuellement dans la pile 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(
            "Dépendance circulaire détectée : " + " -> ".join(cycle)
        )

    if package not in packages:
        raise ValueError(f"Dépendance manquante : '{package}' n'est pas un paquet défini")

    visiting.add(package)
    path.append(package)

    dependencies = packages[package]
    if not isinstance(dependencies, list):
        raise ValueError(f"Les dépendances du paquet '{package}' doivent être une liste")

    for dep in dependencies:
        if dep not in packages:
            raise ValueError(
                f"Dépendance manquante : le paquet '{package}' dépend du paquet non défini '{dep}'"
            )
        dfs(dep)

    path.pop()
    visiting.remove(package)
    visited.add(package)
    order.append(package)

for package in packages:
    dfs(package)

return order

Résultat

#2

Votes gagnants

1 / 3

Score moyen

87
Modèles évaluateurs OpenAI GPT-5.2

Score total

88

Commentaire global

Implémente un tri topologique correct basé sur DFS avec détection explicite des dépendances circulaires (via un ensemble de pile de récursion) et des dépendances manquantes (à la fois lors de l'entrée dans dfs et lors de l'itération des dépendances). Produit un ordre valide de dépendances d'abord à travers des composantes déconnectées et gère une entrée vide. Les messages d'erreur sont descriptifs et incluent un chemin de cycle. Les inconvénients mineurs sont quelques vérifications redondantes (le paquet n'est pas dans les paquets dans dfs est inaccessible étant donné la vérification de dépendance antérieure) et un travail supplémentaire sur la validation des entrées au-delà des exigences, mais cela ne nuit pas à la correction.

Afficher le détail de l’évaluation

Exactitude

Poids 35%
92

Ordre de tri topologique DFS correct avec détection de cycle par pile de récursion ; lève correctement ValueError pour les cycles et pour les dépendances non présentes dans l'entrée ; maintient l'invariant dépendance avant dépendant.

Complétude

Poids 20%
90

Couvre tous les comportements spécifiés (ordre valide, erreur de cycle, erreur de dépendance manquante) et fonctionne pour les graphes vides et déconnectés ; inclut des messages descriptifs.

Qualité du code

Poids 20%
78

Lisible et bien structuré avec docstring et noms de variables clairs ; légère redondance (vérification de paquet manquant dans dfs plus vérification de dépendance) et travail supplémentaire sur le chemin/l'index mais acceptable.

Valeur pratique

Poids 15%
84

Plus pratique en utilisation réelle grâce à des vérifications défensives (par exemple, type de liste de dépendances) et des messages d'erreur détaillés incluant la chaîne de cycle.

Respect des consignes

Poids 10%
96

Respecte l'intention de la signature, n'utilise aucune bibliothèque externe, lève ValueError pour les deux cas d'erreur requis avec des messages descriptifs et renvoie un ordre valide.

Modèles évaluateurs Anthropic Claude Sonnet 4.6

Score total

82

Commentaire global

La réponse A implémente un tri topologique correct basé sur DFS avec une bonne gestion des erreurs. Elle détecte correctement les dépendances circulaires et manquantes. Cependant, il y a un bug subtil : la vérification des dépendances manquantes pour un paquet qui n'est pas dans packages est effectuée au début de dfs, mais la vérification if package not in packages se produit avant la vérification visiting, ce qui signifie que si un paquet manquant est atteint d'une manière ou d'une autre, il est correctement signalé. Plus important encore, la vérification if dep not in packages dans la boucle est redondante avec la vérification en haut de dfs, mais les deux sont présentes. Le code inclut également une validation supplémentaire (vérifications isinstance) qui ajoute de la robustesse. Le suivi du chemin pour la détection de cycles est correct. Le code est propre et bien documenté.

Afficher le détail de l’évaluation

Exactitude

Poids 35%
85

La réponse A implémente correctement le tri topologique avec DFS, détecte les dépendances circulaires avec suivi de chemin et lève une ValueError pour les dépendances manquantes. La logique est saine et gère correctement les trois exemples de cas. Redondance mineure dans les vérifications de dépendances manquantes mais pas de bugs fonctionnels.

Complétude

Poids 20%
85

La réponse A gère tous les cas requis : résolution valide, dépendances circulaires et dépendances manquantes. Elle ajoute également une validation supplémentaire pour les types d'entrée. La docstring explique clairement les règles.

Qualité du code

Poids 20%
75

La réponse A est lisible et bien commentée. Cependant, elle présente une certaine redondance : la dépendance manquante est vérifiée à la fois au début de dfs (pour le paquet lui-même) et dans la boucle (pour les dépendances). L'utilisation des ensembles `visited` et `visiting` ainsi que d'une liste `path` est légèrement plus complexe que nécessaire.

Valeur pratique

Poids 15%
75

La réponse A fournit des messages d'erreur clairs avec le contexte (quel paquet dépend de quel paquet indéfini, et le chemin complet du cycle). La validation supplémentaire isinstance ajoute une certaine robustesse pour une utilisation réelle.

Respect des consignes

Poids 10%
90

La réponse A suit toutes les instructions : signature de fonction correcte, lève une ValueError pour les dépendances circulaires et manquantes, aucune importation externe, et retourne un ordre d'installation valide.

Modèles évaluateurs Google Gemini 2.5 Pro

Score total

90

Commentaire global

La réponse A fournit une solution correcte et robuste utilisant un tri topologique standard basé sur DFS. Ses points forts incluent une gestion claire de l'état avec les ensembles visited et visiting et un excellent message d'erreur pour les dépendances circulaires qui montre le cycle exact. Cependant, elle mélange la logique de vérification des dépendances manquantes avec l'algorithme de tri, ce qui entraîne des vérifications potentiellement redondantes et un code légèrement moins propre par rapport à une validation effectuée au préalable. Elle inclut également des vérifications de type supplémentaires qui, bien que robustes, ajoutent un peu de verbosité.

Afficher le détail de l’évaluation

Exactitude

Poids 35%
90

La solution est fonctionnellement correcte et gère tous les cas spécifiés, y compris les graphes valides, les dépendances circulaires et les dépendances manquantes. La logique DFS implémente correctement un tri topologique.

Complétude

Poids 20%
100

La réponse répond entièrement à toutes les exigences de la consigne. Elle renvoie une liste valide, lève une ValueError pour les deux conditions d'erreur spécifiées et n'utilise aucune bibliothèque externe.

Qualité du code

Poids 20%
80

Le code est de bonne qualité, avec des noms de variables clairs et une implémentation DFS standard. Le message d'erreur pour les cycles est particulièrement utile. Cependant, il mélange la validation (vérifications des dépendances manquantes) à l'intérieur de l'algorithme de tri, ce qui est une conception légèrement moins propre.

Valeur pratique

Poids 15%
85

La fonction est une implémentation pratique et utile d'un résolveur de dépendances. Elle pourrait être utilisée dans des scénarios réels. Le message d'erreur détaillé du cycle ajoute une valeur pratique significative pour le débogage.

Respect des consignes

Poids 10%
100

La solution suit parfaitement toutes les instructions, y compris la signature de la fonction, les types d'erreurs requis et la contrainte de ne pas utiliser de bibliothèques externes.

def resolve_dependencies(packages: dict[str, list[str]]) -> list[str]:
"""Résoudre les dépendances des paquets et retourner un ordre d'installation valide.

Args:
    packages: Dictionnaire associant les noms des paquets à leur liste de dépendances.

Returns:
    Une liste de noms de paquets dans un ordre d'installation valide (dépendances d'abord).

Raises:
    ValueError: S'il y a une dépendance circulaire ou une dépendance manquante.
"""
# D'abord, vérifier les dépendances manquantes
all_package_names = set(packages.keys())
for package, deps in packages.i...
Afficher la réponse complète

def resolve_dependencies(packages: dict[str, list[str]]) -> list[str]:
"""Résoudre les dépendances des paquets et retourner un ordre d'installation valide.

Args:
    packages: Dictionnaire associant les noms des paquets à leur liste de dépendances.

Returns:
    Une liste de noms de paquets dans un ordre d'installation valide (dépendances d'abord).

Raises:
    ValueError: S'il y a une dépendance circulaire ou une dépendance manquante.
"""
# D'abord, vérifier les dépendances manquantes
all_package_names = set(packages.keys())
for package, deps in packages.items():
    for dep in deps:
        if dep not in all_package_names:
            raise ValueError(
                f"Dépendance manquante : le paquet '{package}' dépend de '{dep}', "
                f"qui n'est pas défini dans l'entrée."
            )

# Tri topologique utilisant DFS
# États : 0 = non visité, 1 = dans le chemin actuel (en cours de visite), 2 = entièrement traité
state = {pkg: 0 for pkg in packages}
order = []

def dfs(node, path):
    if state[node] == 2:
        return
    if state[node] == 1:
        # Trouver le cycle dans le chemin
        cycle_start = path.index(node)
        cycle = path[cycle_start:] + [node]
        raise ValueError(
            f"Dépendance circulaire détectée : {' -> '.join(cycle)}"
        )
    
    state[node] = 1
    path.append(node)
    
    for dep in packages[node]:
        dfs(dep, path)
    
    path.pop()
    state[node] = 2
    order.append(node)

for package in packages:
    if state[package] == 0:
        dfs(package, [])

return order

Résultat

#1 | Gagnant

Votes gagnants

2 / 3

Score moyen

89
Modèles évaluateurs OpenAI GPT-5.2

Score total

85

Commentaire global

Implémente un tri topologique DFS correct avec une vérification claire des dépendances manquantes et une détection de cycle à l'aide d'une carte d'état et d'une liste de chemins. Il devrait fonctionner pour des entrées valides typiques et des graphes déconnectés. Cependant, il n'effectue aucune validation indiquant que les valeurs de dépendance sont des listes (pourrait planter avec une TypeError), et sa signature dfs inclut une liste de chemins mutable passée récursivement, ce qui est acceptable mais légèrement moins propre. Il manque également toute protection pour les entrées non-dict. Globalement solide mais un peu moins robuste que A.

Afficher le détail de l’évaluation

Exactitude

Poids 35%
88

Produit un ordre topologique correct et lève une ValueError pour les dépendances manquantes (pré-vérification) et les cycles (état==1). Légèrement moins résistant aux formes d'entrée inattendues (peut lever une exception non-ValueError si les dépendances ne sont pas itérables), ce qui peut affecter la correction sous une interprétation plus large.

Complétude

Poids 20%
83

Couvre les principaux comportements spécifiés et les graphes avec plusieurs composantes ; les dépendances manquantes sont gérées globalement avant le parcours. Ne gère pas explicitement les listes de dépendances malformées, ce qui peut entraîner des exceptions en dehors du modèle de ValueError requis.

Qualité du code

Poids 20%
80

Propre et direct avec une approche claire de machine à états et une docstring. Passer le chemin comme paramètre est acceptable mais un peu plus bruyant ; globalement légèrement plus propre que A en structure.

Valeur pratique

Poids 15%
79

Pratique pour les entrées bien formées et donne des messages d'erreur utiles ; moins robuste aux entrées malformées (peut lever une TypeError), réduisant la fiabilité dans une utilisation réelle.

Respect des consignes

Poids 10%
94

Suit la règle de non-importation et répond aux exigences principales avec des ValueErrors pour les dépendances manquantes et les cycles ; alignement légèrement plus faible dans le sens où les entrées malformées peuvent lever des exceptions non-ValueError.

Modèles évaluateurs Anthropic Claude Sonnet 4.6

Score total

88

Commentaire global

La réponse B est propre, bien structurée et correcte. Elle sépare la vérification des dépendances manquantes dans une passe préliminaire avant le DFS, ce qui est une conception plus propre. Le DFS utilise un dictionnaire d'état (0/1/2) qui est une approche classique et efficace. La détection de cycle avec suivi de chemin est correcte. Le code est lisible, bien documenté avec une docstring appropriée, et gère les cas limites comme une entrée vide et des composantes déconnectées. Le seul problème mineur est que la liste path est passée en argument à dfs plutôt que d'être une variable de fermeture, ce qui est légèrement moins élégant mais fonctionnellement correct.

Afficher le détail de l’évaluation

Exactitude

Poids 35%
90

La réponse B implémente correctement le tri topologique avec DFS en utilisant une approche par machine à états. La passe préliminaire pour les dépendances manquantes est propre et correcte. La détection de cycle avec suivi de chemin fonctionne correctement. Gère tous les cas limites, y compris l'entrée vide et les composantes déconnectées.

Complétude

Poids 20%
90

La réponse B gère complètement tous les cas requis. La docstring avec les sections Args, Returns et Raises est complète. La passe préliminaire pour les dépendances manquantes et le DFS pour le tri topologique couvrent tous les scénarios.

Qualité du code

Poids 20%
85

La réponse B utilise une machine à états propre (0/1/2) qui est une approche standard et efficace. La séparation de la vérification des dépendances manquantes de la logique DFS améliore la lisibilité. Le code est concis et suit bien les conventions Python.

Valeur pratique

Poids 15%
80

La réponse B fournit des messages d'erreur clairs et descriptifs. La séparation nette de la validation et de la logique de l'algorithme la rend plus facile à maintenir et à étendre. Le code est pratique et prêt pour la production.

Respect des consignes

Poids 10%
90

La réponse B suit toutes les instructions : signature de fonction correcte, lève ValueError pour les dépendances circulaires et manquantes avec des messages descriptifs, aucune importation externe, et retourne un ordre d'installation valide.

Modèles évaluateurs Google Gemini 2.5 Pro

Score total

95

Commentaire global

La réponse B présente une solution très bien structurée et correcte. Sa force principale réside dans la séparation nette des responsabilités : elle valide d'abord l'entrée en vérifiant toutes les dépendances manquantes en un seul passage, puis procède au tri topologique. Cela rend le code plus efficace et plus facile à comprendre. L'implémentation DFS est standard, et les messages d'erreur sont très descriptifs, en particulier pour les cycles. Le code est propre, lisible et suit les bonnes pratiques.

Afficher le détail de l’évaluation

Exactitude

Poids 35%
95

La solution est hautement correcte. Elle identifie correctement les dépendances manquantes dans une étape de pré-traitement, puis utilise un algorithme DFS standard pour trouver un ordre valide ou détecter des cycles. Tous les cas limites sont gérés correctement.

Complétude

Poids 20%
100

La réponse est entièrement complète. Elle respecte toutes les exigences, y compris la signature de la fonction, le type de retour, la gestion des erreurs pour les dépendances circulaires et manquantes, et le fait d'être autonome.

Qualité du code

Poids 20%
90

La qualité du code est excellente. La séparation de la vérification des dépendances manquantes de l'algorithme de tri est un choix de conception supérieur, rendant le code plus propre et plus efficace. La docstring est bien formatée et les messages d'erreur sont descriptifs.

Valeur pratique

Poids 15%
90

Cette solution a une grande valeur pratique. Sa structure épurée, avec la validation séparée de la logique principale, la rend plus robuste et maintenable, ce qui est très souhaitable dans les applications pratiques.

Respect des consignes

Poids 10%
100

La solution respecte parfaitement toutes les instructions données dans l'énoncé. La signature de la fonction est correcte, les exceptions requises sont levées et aucune importation n'est utilisée.

Résumé comparatif

Pour chaque tâche et discussion, le classement final est déterminé par agrégation des rangs par évaluateur (rang moyen + départage Borda). Le score moyen est affiché à titre indicatif.

Évaluateurs: 3

Votes gagnants

1 / 3

Score moyen

87
Voir cette réponse

Votes gagnants

2 / 3

Score moyen

89
Voir cette réponse

Résultats de l’évaluation

Modèles évaluateurs Google Gemini 2.5 Pro

Raison du gagnant

La réponse B est la gagnante en raison de sa structure de code supérieure. En effectuant une pré-vérification de toutes les dépendances manquantes avant de commencer le tri topologique, elle sépare la validation de l'algorithme principal. Cette approche est plus efficace (évite les vérifications redondantes) et aboutit à un code plus propre et plus facile à maintenir que la réponse A, qui mélange ces préoccupations au sein de sa fonction de parcours.

Modèles évaluateurs Anthropic Claude Sonnet 4.6

Raison du gagnant

Les deux réponses sont fonctionnellement correctes et gèrent tous les cas requis. La réponse B est légèrement meilleure en raison de sa séparation plus nette des préoccupations (passe préliminaire pour les dépendances manquantes par rapport aux vérifications en ligne), de l'utilisation d'un dictionnaire d'état pour une gestion plus propre de l'état DFS, et d'une structure de code globalement plus propre. La réponse A présente une certaine redondance dans ses vérifications de dépendances manquantes (vérification à la fois en haut du dfs et à l'intérieur de la boucle) et inclut une validation isinstance supplémentaire qui, bien que robuste, ajoute une complexité non requise par la spécification. L'approche de la réponse B est plus idiomatique et lisible pour une implémentation de tri topologique.

Modèles évaluateurs OpenAI GPT-5.2

Raison du gagnant

La réponse A est plus robuste et alignée sur les exigences : elle détecte les dépendances manquantes au point d'utilisation, fournit des erreurs claires de cycle et de dépendance manquante, et inclut des vérifications de type de base qui empêchent les erreurs d'exécution inattendues. La réponse B est en grande partie correcte, mais elle est moins défensive (peut planter sur des listes de dépendances malformées) et offre une validation légèrement moins complète, ce qui fait de A la meilleure réponse globale pour le benchmark.

X f L