Orivel Orivel
Ouvrir le menu

Implémenter un résolveur de dépendances en Python

Comparez les reponses des modeles pour cette tache benchmark en Programmation et consultez scores, commentaires et exemples lies.

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

X f L

Sommaire

Vue d ensemble de la tache

Genres de comparaison

Programmation

Modele createur de la tache

Modeles participants

Modeles evaluateurs

Consigne de la tache

Votre tâche est de créer un résolveur de dépendances pour un système de gestion de paquets simple. Écrivez une fonction Python `resolve_dependencies(package_definitions, target_package)` qui détermine l'ordre d'installation correct pour un paquet donné et ses dépendances. L'argument `package_definitions` est une liste de chaînes. Chaque chaîne définit un paquet et ses dépendances directes au format : `'PackageName: Dep1, Dep2, ...'`. Si un paquet n'a pas de dépendances, le format est `'PackageName:'`. Votre fonct...

Afficher plus

Votre tâche est de créer un résolveur de dépendances pour un système de gestion de paquets simple. Écrivez une fonction Python `resolve_dependencies(package_definitions, target_package)` qui détermine l'ordre d'installation correct pour un paquet donné et ses dépendances. L'argument `package_definitions` est une liste de chaînes. Chaque chaîne définit un paquet et ses dépendances directes au format : `'PackageName: Dep1, Dep2, ...'`. Si un paquet n'a pas de dépendances, le format est `'PackageName:'`. Votre fonction doit : 1. Analyser les chaînes d'entrée pour construire un graphe de dépendances. 2. Étant donné un `target_package`, trouver toutes ses dépendances (y compris transitives). 3. Retourner une seule liste de chaînes représentant l'ordre d'installation. Cette liste doit être triée topologiquement (une dépendance doit toujours apparaître avant le paquet qui en dépend). Le `target_package` lui-même doit être le dernier élément de la liste. La liste ne doit pas contenir de doublons. 4. Détecter les dépendances circulaires. Si un cycle est trouvé, lever une `ValueError` avec un message qui indique clairement le cycle (par exemple : 'Dépendance circulaire détectée impliquant : A -> B -> A'). 5. Détecter les paquets manquants. Si un paquet liste une dépendance qui n'est pas définie dans `package_definitions`, lever une `ValueError` avec un message tel que 'Définition de paquet manquante pour : C'.

Informations complementaires

Voici un exemple d'entrée valide et de sortie attendue : `package_definitions = [` ` 'A: B, C',` ` 'B: D',` ` 'C: D, E',` ` 'D:',` ` 'E:'` `]` `target_package = 'A'` Sortie attendue pour `resolve_dependencies(package_definitions, 'A')` : `['D', 'E', 'B', 'C', 'A']` ou `['E', 'D', 'B', 'C', 'A']` ou `['D', 'E', 'C', 'B', 'A']` (toute tri topologique valide est acceptable). Exemple d'une entrée qui doit lever une `ValueError` pour une dépendance circulaire : `package_definitions = ['A: B', 'B: A']` `target_pa...

Afficher plus

Voici un exemple d'entrée valide et de sortie attendue : `package_definitions = [` ` 'A: B, C',` ` 'B: D',` ` 'C: D, E',` ` 'D:',` ` 'E:'` `]` `target_package = 'A'` Sortie attendue pour `resolve_dependencies(package_definitions, 'A')` : `['D', 'E', 'B', 'C', 'A']` ou `['E', 'D', 'B', 'C', 'A']` ou `['D', 'E', 'C', 'B', 'A']` (toute tri topologique valide est acceptable). Exemple d'une entrée qui doit lever une `ValueError` pour une dépendance circulaire : `package_definitions = ['A: B', 'B: A']` `target_package = 'A'` Exemple d'une entrée qui doit lever une `ValueError` pour un paquet manquant : `package_definitions = ['A: B', 'B: C']` (C n'est pas défini) `target_package = 'A'`

Politique d evaluation

Une solution correcte doit être une fonction ou une classe Python exécutable qui respecte l'interface spécifiée. La solution sera évaluée selon plusieurs critères : 1. **Correctness (Exactitude) :** Elle doit produire une liste de dépendances valide et triée topologiquement pour toutes les entrées valides. L'ordre des dépendances au même niveau (par ex. B et C dans l'exemple) n'a pas d'importance. 2. **Error Handling (Gestion des erreurs) :** Elle doit détecter correctement et lever une `ValueError` avec des messag...

Afficher plus

Une solution correcte doit être une fonction ou une classe Python exécutable qui respecte l'interface spécifiée. La solution sera évaluée selon plusieurs critères : 1. **Correctness (Exactitude) :** Elle doit produire une liste de dépendances valide et triée topologiquement pour toutes les entrées valides. L'ordre des dépendances au même niveau (par ex. B et C dans l'exemple) n'a pas d'importance. 2. **Error Handling (Gestion des erreurs) :** Elle doit détecter correctement et lever une `ValueError` avec des messages descriptifs à la fois pour les dépendances circulaires et pour les définitions de paquets manquantes. 3. **Robustness (Robustesse) :** Le code doit analyser correctement le format d'entrée et gérer les cas limites comme les paquets sans dépendances, les dépendances en losange (diamond dependencies) et les auto-dépendances. 4. **Code Quality (Qualité du code) :** La solution doit être bien structurée, lisible et raisonnablement efficace. L'utilisation d'un algorithme standard de parcours de graphe (comme une approche basée sur Depth-First Search ou l'algorithme de Kahn) est attendue. L'implémentation ne doit pas être inutilement complexe.

Reponses

Réponse : def resolve_dependencies(package_definitions, target_package): # Analyser les définitions de paquets graph = {} for definition in package_definitions: if ':' not in definition: raise ValueError(f'Définition de paquet invalide : {definition}') name, _, deps_str = definition.partition(':') name = name.strip() deps_str = deps_str.strip() if deps_str: deps = [d.strip() for d in deps_str.split(',')] else: deps = [] graph[name] = deps # Vérifier les paquets manquants for pkg, deps in graph.items():...

Afficher la reponse complete

Réponse : def resolve_dependencies(package_definitions, target_package): # Analyser les définitions de paquets graph = {} for definition in package_definitions: if ':' not in definition: raise ValueError(f'Définition de paquet invalide : {definition}') name, _, deps_str = definition.partition(':') name = name.strip() deps_str = deps_str.strip() if deps_str: deps = [d.strip() for d in deps_str.split(',')] else: deps = [] graph[name] = deps # Vérifier les paquets manquants for pkg, deps in graph.items(): for dep in deps: if dep not in graph: raise ValueError(f'Définition de paquet manquante pour : {dep}') if target_package not in graph: raise ValueError(f'Définition de paquet manquante pour : {target_package}') # Tri topologique à l’aide de DFS, uniquement pour les paquets accessibles depuis target_package # États : 0 = non visité, 1 = en cours, 2 = terminé state = {} result = [] path = [] # suivre le chemin actuel pour la détection de cycles def dfs(pkg): if state.get(pkg) == 2: return if state.get(pkg) == 1: # Trouver le cycle dans path cycle_start = path.index(pkg) cycle = path[cycle_start:] + [pkg] raise ValueError(f'Dépendance circulaire détectée impliquant : {" -> ".join(cycle)}') state[pkg] = 1 path.append(pkg) for dep in graph[pkg]: dfs(dep) path.pop() state[pkg] = 2 result.append(pkg) dfs(target_package) return result

Resultat

#2

Votes gagnants

0 / 3

Score moyen

75
Modeles evaluateurs Google Gemini 2.5 Flash

Score total

79

Commentaire global

La réponse A fournit un résolveur de dépendances correct et fonctionnel utilisant une approche DFS standard. Il gère correctement les dépendances circulaires et les packages manquants avec les messages d'erreur spécifiés. Cependant, son analyse des entrées est moins robuste, en particulier en ce qui concerne les définitions de packages en double (qu'il écrase) et les listes de dépendances malformées (par exemple, 'A: , B' entraînerait une dépendance de chaîne vide).

Afficher le detail de l evaluation

Exactitude

Poids 35%
88

La solution effectue correctement le tri topologique et génère des erreurs appropriées pour les dépendances circulaires et manquantes. Cependant, son analyse des chaînes de dépendances comme 'A: , B' inclurait incorrectement une chaîne vide comme dépendance, ce qui constitue un défaut de correction mineur dans la construction du graphe.

Completude

Poids 20%
70

La solution implémente toutes les fonctionnalités principales mais manque de gestion des définitions de packages en double (elle les écrase) et est moins robuste dans l'analyse des chaînes de dépendances malformées, ce qui réduit sa complétude pour les entrées du monde réel.

Qualite du code

Poids 20%
78

Le code est lisible et utilise un algorithme DFS standard. La logique d'analyse est intégrée directement dans la fonction principale. Il est raisonnablement efficace et pas excessivement complexe.

Valeur pratique

Poids 15%
70

La solution est fonctionnelle mais moins robuste aux variations courantes des entrées du monde réel, telles que les définitions de packages en double ou les listes de dépendances légèrement malformées, ce qui limite son applicabilité pratique sans affinement supplémentaire.

Respect des consignes

Poids 10%
85

La solution respecte la signature de la fonction, le type de retour, les types d'erreurs et les formats de messages d'erreur spécifiés. Elle implémente correctement les exigences principales.

Modeles evaluateurs OpenAI GPT-5.2

Score total

72

Commentaire global

Implémente un tri topologique correct basé sur DFS, restreint au sous-graphe atteignable de la cible, avec détection de cycle via une pile de chemins explicite et un rapport de cycle clair. Il vérifie correctement les définitions de packages manquantes (y compris la cible manquante) avant le parcours. Faiblesses : l'analyse est un peu lâche (ne filtre pas les jetons de dépendance vides comme 'A: B,', donc elle peut générer une erreur de package manquant pour une chaîne vide) ; elle écrase silencieusement les définitions de packages dupliquées au lieu de les rejeter ; et elle effectue un scan global des dépendances manquantes sur tous les packages plutôt que sur le sous-ensemble atteignable (pas incorrect, mais potentiellement surprenant).

Afficher le detail de l evaluation

Exactitude

Poids 35%
75

Ordre topologique DFS correct pour le sous-graphe de la cible ; la détection de cycle et la détection de package manquant fonctionnent généralement. Cependant, les virgules finales peuvent produire un nom de dépendance vide qui déclenche une erreur de package manquant trompeuse, réduisant la correction sur des entrées faiblement formatées.

Completude

Poids 20%
70

Répond aux exigences principales (analyse, tri topo, erreurs de cycle/manquant). Ne gère pas les définitions dupliquées et ne nettoie pas les jetons de dépendance vides, qui sont des problèmes de format mineurs courants.

Qualite du code

Poids 20%
65

Lisible et concis ; utilise des états DFS standard. Problèmes mineurs : recherche d'index dans le chemin dans le cas de cycle et écrasement silencieux en cas de doublons ; analyse moins défensive.

Valeur pratique

Poids 15%
65

Utile tel quel pour des entrées propres, mais moins résilient aux définitions légèrement désordonnées et aux doublons, ce qui réduit l'utilité dans le monde réel.

Respect des consignes

Poids 10%
85

Implémente la fonction demandée et lève une ValueError avec des messages descriptifs incluant un chemin de cycle ; retourne le format correct.

Modeles evaluateurs Anthropic Claude Opus 4.6

Score total

74

Commentaire global

La réponse A fournit une implémentation correcte et propre du résolveur de dépendances. Elle analyse correctement l'entrée, détecte les packages manquants, détecte les dépendances circulaires avec suivi de chemin, et effectue un tri topologique basé sur DFS. Le code est concis et lisible. Cependant, il manque la gestion de certains cas limites tels que les définitions de packages dupliquées, les noms de packages vides et les entrées non-chaînes. Il manque également une docstring et un exemple d'utilisation.

Afficher le detail de l evaluation

Exactitude

Poids 35%
85

La réponse A implémente correctement le tri topologique via DFS, détecte correctement les dépendances circulaires avec un rapport de chemin de cycle précis, détecte les packages manquants et produit des ordres d'installation valides. L'algorithme principal est correct pour tous les cas de test spécifiés.

Completude

Poids 20%
65

La réponse A gère les exigences principales : analyse, tri topologique, détection de cycles et détection de packages manquants. Cependant, elle ne gère pas les cas limites tels que les définitions de packages dupliquées, les noms de packages vides, les entrées non-chaînes, ou les chaînes vides résultant de la division des dépendances.

Qualite du code

Poids 20%
70

La réponse A est concise et lisible avec des noms de variables et des commentaires clairs. La structure du code est simple. Cependant, elle manque d'une docstring et la logique d'analyse est intégrée plutôt que séparée dans une fonction d'aide.

Valeur pratique

Poids 15%
65

La réponse A est fonctionnelle et fonctionnerait en pratique pour des entrées bien formées. Cependant, le manque de validation des entrées pour les cas limites réduit sa robustesse dans des scénarios du monde réel où les entrées peuvent être mal formées.

Respect des consignes

Poids 10%
75

La réponse A suit bien les instructions : elle implémente la signature de fonction requise, analyse le format d'entrée, effectue un tri topologique, détecte les cycles avec des messages descriptifs et détecte les packages manquants. Le format du message d'erreur correspond aux exemples.

Reponse B: OpenAI GPT-5.4

def resolve_dependencies(package_definitions, target_package): """ Résout les dépendances pour target_package et renvoie un ordre d'installation valide. Args: package_definitions: list[str], chacune sous la forme 'Package: Dep1, Dep2' ou 'Package:' target_package: str Returns: list[str]: ordre d'installation trié topologiquement se terminant par target_package Raises: ValueError: en cas d'entrée mal formée, de définitions de package manquantes ou de dépendances circulaires """ def parse_definitions(definitions): graph = {} for entry...

Afficher la reponse complete

def resolve_dependencies(package_definitions, target_package): """ Résout les dépendances pour target_package et renvoie un ordre d'installation valide. Args: package_definitions: list[str], chacune sous la forme 'Package: Dep1, Dep2' ou 'Package:' target_package: str Returns: list[str]: ordre d'installation trié topologiquement se terminant par target_package Raises: ValueError: en cas d'entrée mal formée, de définitions de package manquantes ou de dépendances circulaires """ def parse_definitions(definitions): graph = {} for entry in definitions: if not isinstance(entry, str): raise ValueError(f"Définition de package invalide : {entry}") if ':' not in entry: raise ValueError(f"Définition de package invalide : {entry}") package, deps_part = entry.split(':', 1) package = package.strip() if not package: raise ValueError(f"Définition de package invalide : {entry}") deps_part = deps_part.strip() if deps_part: deps = [dep.strip() for dep in deps_part.split(',') if dep.strip()] else: deps = [] if package in graph: raise ValueError(f"Définition de package dupliquée pour : {package}") graph[package] = deps return graph graph = parse_definitions(package_definitions) if target_package not in graph: raise ValueError(f"Définition de package manquante pour : {target_package}") order = [] state = {} # 0/non défini = non visité, 1 = en cours de visite, 2 = visité stack = [] def dfs(package): if package not in graph: raise ValueError(f"Définition de package manquante pour : {package}") package_state = state.get(package, 0) if package_state == 1: try: start = stack.index(package) cycle_path = stack[start:] + [package] except ValueError: cycle_path = [package, package] raise ValueError( "Dépendance circulaire détectée impliquant : " + " -> ".join(cycle_path) ) if package_state == 2: return state[package] = 1 stack.append(package) for dep in graph[package]: if dep not in graph: raise ValueError(f"Définition de package manquante pour : {dep}") dfs(dep) stack.pop() state[package] = 2 order.append(package) dfs(target_package) return order # Exemple d'utilisation : if __name__ == "__main__": package_definitions = [ 'A: B, C', 'B: D', 'C: D, E', 'D:', 'E:' ] print(resolve_dependencies(package_definitions, 'A')) # Exemple de cycle : # print(resolve_dependencies(['A: B', 'B: A'], 'A')) # Exemple de package manquant : # print(resolve_dependencies(['A: B', 'B: C'], 'A'))

Resultat

#1 | Gagnant

Votes gagnants

3 / 3

Score moyen

83
Modeles evaluateurs Google Gemini 2.5 Flash

Score total

86

Commentaire global

La réponse B est une solution très robuste et bien structurée. Elle excelle dans l'analyse des entrées, gère avec succès les définitions de packages en double et divers scénarios de listes de dépendances malformées. Elle implémente correctement le tri topologique, détecte les dépendances circulaires et identifie les packages manquants avec des messages d'erreur précis. L'utilisation d'une fonction d'aide pour l'analyse améliore la modularité. Une légère bizarrerie logique existe dans le bloc `try-except` de la détection de cycle, mais cela n'affecte pas la correction de la solution.

Afficher le detail de l evaluation

Exactitude

Poids 35%
90

La solution effectue correctement le tri topologique et lève les erreurs appropriées. Elle gère correctement divers cas limites d'analyse, tels que 'A: , B' ne créant pas une dépendance de chaîne vide. La logique de détection de cycle est saine, malgré une bizarrerie logique mineure et sans impact dans le bloc `try-except`.

Completude

Poids 20%
85

La solution est très complète, implémentant toutes les fonctionnalités requises, y compris une analyse robuste, la construction de graphes, le tri topologique et une gestion complète des erreurs. Elle traite correctement les définitions de packages en double et divers scénarios d'entrées malformées.

Qualite du code

Poids 20%
82

La qualité du code est forte, avec une bonne modularité obtenue en séparant l'analyse dans une fonction d'aide. Elle inclut une docstring utile et utilise un DFS standard. Le bloc `try-except` dans la détection de cycle est une légère bizarrerie logique mais ne nuit pas significativement à la qualité globale.

Valeur pratique

Poids 15%
80

La solution offre une grande valeur pratique en raison de son analyse robuste et de sa gestion complète des erreurs, y compris la détection des définitions de packages en double. Cela la rend plus résiliente et fiable pour une utilisation dans un système de gestion de packages.

Respect des consignes

Poids 10%
90

La solution suit méticuleusement toutes les instructions explicites, y compris la signature de la fonction, le type de retour, les types d'erreurs et les formats exacts des messages d'erreur. Elle va même au-delà des exigences explicites en fournissant une analyse d'entrée plus robuste, s'alignant bien avec l'esprit du critère de robustesse de la tâche.

Modeles evaluateurs OpenAI GPT-5.2

Score total

83

Commentaire global

Fournit un résolveur DFS robuste et exécutable avec une bonne validation de l'analyse (entrées non-chaînes, ':' manquant, nom de package vide, supprime les dépendances et filtre les jetons vides) et rejette les définitions de packages dupliquées. Il détecte correctement les packages manquants à la fois pour la cible et pour toute dépendance rencontrée, et signale les cycles avec une trace de chemin explicite. Le code est bien structuré et documenté ; l'exemple d'utilisation inclus est inoffensif bien qu'un peu superflu pour une réponse de benchmark.

Afficher le detail de l evaluation

Exactitude

Poids 35%
85

Produit un ordre topologique valide se terminant par la cible, sans doublons, gestion correcte des dépendances transitives, auto-dépendances et diamants. La détection de cycles et de packages manquants est correcte et cohérente pendant le parcours.

Completude

Poids 20%
85

Couvre toutes les exigences spécifiées et ajoute des extras judicieux (détection de définition dupliquée, vérifications plus robustes des entrées malformées) sans casser l'interface.

Qualite du code

Poids 20%
80

Bien structuré avec une fonction d'analyse auxiliaire, une docstring, une nomenclature de variables claire et des vérifications défensives. La construction du cycle est claire ; globalement maintenable.

Valeur pratique

Poids 15%
80

Plus adapté à la production en raison de la validation, de la détection des doublons et de la sanitisation des jetons de dépendance ; l'exemple d'utilisation facilite une vérification rapide.

Respect des consignes

Poids 10%
80

Implémente la fonction demandée et les messages d'erreur ; inclut un bloc main d'exemple supplémentaire (non demandé) mais n'interfère pas avec le comportement de la fonction.

Modeles evaluateurs Anthropic Claude Opus 4.6

Score total

81

Commentaire global

La réponse B fournit une implémentation correcte et plus robuste du résolveur de dépendances. Elle inclut des validations supplémentaires telles que la détection de doublons de paquets, la détection de noms de paquets vides, la validation d'entrées non-chaînes de caractères et le filtrage des chaînes de dépendances vides issues des résultats de division. Elle possède une docstring complète, un code bien structuré avec une fonction de parsing séparée, et inclut un exemple d'utilisation. Le code gère plus de cas limites tout en maintenant la lisibilité.

Afficher le detail de l evaluation

Exactitude

Poids 35%
85

La réponse B implémente correctement le tri topologique via DFS, détecte correctement les dépendances circulaires avec un rapport de chemin de cycle précis, détecte les paquets manquants et produit des ordres d'installation valides. L'algorithme principal est correct pour tous les cas de test spécifiés. La vérification des paquets manquants est effectuée à la fois en amont et pendant le parcours DFS, ce qui est légèrement redondant mais pas incorrect.

Completude

Poids 20%
80

La réponse B gère toutes les exigences principales plus des cas limites supplémentaires : définitions de paquets en double, noms de paquets vides, validation d'entrées non-chaînes de caractères et filtrage des chaînes de dépendances vides. Elle inclut également une docstring documentant l'interface, les arguments, la valeur de retour et les exceptions.

Qualite du code

Poids 20%
80

La réponse B a une meilleure organisation du code avec une fonction d'aide parse_definitions séparée, une docstring complète, des noms de variables clairs et des commentaires en ligne. La séparation des préoccupations rend le code plus maintenable et testable.

Valeur pratique

Poids 15%
75

La réponse B est plus pratique en raison de sa validation d'entrée supplémentaire, de ses meilleurs messages d'erreur et de son exemple d'utilisation dans le bloc __main__. La détection des doublons et la vérification du type d'entrée la rendent plus adaptée à l'intégration dans un système de gestion de paquets réel.

Respect des consignes

Poids 10%
80

La réponse B suit toutes les instructions et va même un peu plus loin en fournissant une docstring, un exemple d'utilisation et des validations supplémentaires. La signature de la fonction correspond exactement, les messages d'erreur sont descriptifs et correspondent au format requis, et le tri topologique est correctement implémenté.

Resume comparatif

Pour chaque tache et discussion, le classement final est determine par agregation des rangs par evaluateur (rang moyen + departage Borda). Le score moyen est affiche a titre indicatif.

Evaluateurs: 3

Votes gagnants

0 / 3

Score moyen

75
Voir cette reponse

Votes gagnants

3 / 3

Score moyen

83
Voir cette reponse

Resultats de l evaluation

Modeles evaluateurs Anthropic Claude Opus 4.6

Raison du gagnant

La réponse B gagne car elle gère plus de cas limites (paquets en double, noms de paquets vides, entrées non-chaînes, chaînes de dépendances vides après division), a une meilleure organisation du code avec une fonction de parsing séparée, inclut une docstring complète et fournit un exemple d'utilisation. Les deux réponses sont correctes pour la fonctionnalité principale, mais la réponse B est plus robuste et a une meilleure qualité de code. La validation supplémentaire dans la réponse B la rend plus adaptée à une utilisation réelle.

Modeles evaluateurs OpenAI GPT-5.2

Raison du gagnant

La réponse B l'emporte en raison d'une robustesse et d'une validation des entrées plus solides tout en répondant à toutes les exigences fonctionnelles : elle gère les cas limites tels que les virgules finales/les jetons de dépendance vides, détecte les définitions de packages dupliquées et conserve des erreurs claires de cycle/de package manquant. La réponse A est largement correcte mais peut mal gérer les listes de dépendances malformées (par exemple, introduire des noms de dépendances vides) et écrase les doublons silencieusement.

Modeles evaluateurs Google Gemini 2.5 Flash

Raison du gagnant

La réponse B est supérieure en raison de son analyse et de sa gestion nettement plus robustes des cas limites tels que les définitions de packages dupliquées et les chaînes de dépendances malformées. Bien que les deux réponses implémentent correctement la logique de résolution des dépendances et la gestion des erreurs, la robustesse accrue de B la rend plus pratique et complète pour un scénario réel.

X f L