Orivel Orivel
Abrir menu

Implementar un resolvedor de dependencias en Python

Compara respuestas de modelos para esta tarea benchmark de Programación y revisa puntuaciones, comentarios y ejemplos relacionados.

Inicia sesion o registrate para usar me gusta y favoritos. Registrarse

X f L

Indice

Resumen de la tarea

Generos de Comparacion

Programación

Modelo creador de la tarea

Modelos participantes

Modelos evaluadores

Enunciado de la tarea

Se le ha encomendado crear un resolvedor de dependencias para un sistema simple de gestión de paquetes. Escriba una función Python `resolve_dependencies(package_definitions, target_package)` que determine el orden correcto de instalación para un paquete dado y sus dependencias. El argumento `package_definitions` es una lista de cadenas. Cada cadena define un paquete y sus dependencias directas en el formato: `'PackageName: Dep1, Dep2, ...'`. Si un paquete no tiene dependencias, el formato es `'PackageName:'`. Su...

Mostrar mas

Se le ha encomendado crear un resolvedor de dependencias para un sistema simple de gestión de paquetes. Escriba una función Python `resolve_dependencies(package_definitions, target_package)` que determine el orden correcto de instalación para un paquete dado y sus dependencias. El argumento `package_definitions` es una lista de cadenas. Cada cadena define un paquete y sus dependencias directas en el formato: `'PackageName: Dep1, Dep2, ...'`. Si un paquete no tiene dependencias, el formato es `'PackageName:'`. Su función debe: 1. Analizar las cadenas de entrada para construir un grafo de dependencias. 2. Dado un `target_package`, encontrar todas sus dependencias (incluyendo las transitivas). 3. Devolver una única lista de cadenas que represente el orden de instalación. Esta lista debe estar ordenada topológicamente (una dependencia debe aparecer siempre antes que el paquete que depende de ella). El `target_package` en sí debe ser el último elemento de la lista. La lista no debe contener duplicados. 4. Detectar dependencias circulares. Si se encuentra un ciclo, lanzar un `ValueError` con un mensaje que indique claramente el ciclo (por ejemplo, 'Se detectó una dependencia circular que involucra: A -> B -> A'). 5. Detectar paquetes faltantes. Si un paquete lista una dependencia que no está definida en `package_definitions`, lanzar un `ValueError` con un mensaje como 'Falta la definición del paquete para: C'.

Informacion complementaria

Aquí hay un ejemplo de entrada válida y la salida esperada: `package_definitions = [` ` 'A: B, C',` ` 'B: D',` ` 'C: D, E',` ` 'D:',` ` 'E:'` `]` `target_package = 'A'` Salida esperada para `resolve_dependencies(package_definitions, 'A')`: `['D', 'E', 'B', 'C', 'A']` o `['E', 'D', 'B', 'C', 'A']` o `['D', 'E', 'C', 'B', 'A']` (cualquier ordenación topológica válida es aceptable). Ejemplo de una entrada que debería lanzar un `ValueError` por una dependencia circular: `package_definitions = ['A: B', 'B: A']`...

Mostrar mas

Aquí hay un ejemplo de entrada válida y la salida esperada: `package_definitions = [` ` 'A: B, C',` ` 'B: D',` ` 'C: D, E',` ` 'D:',` ` 'E:'` `]` `target_package = 'A'` Salida esperada para `resolve_dependencies(package_definitions, 'A')`: `['D', 'E', 'B', 'C', 'A']` o `['E', 'D', 'B', 'C', 'A']` o `['D', 'E', 'C', 'B', 'A']` (cualquier ordenación topológica válida es aceptable). Ejemplo de una entrada que debería lanzar un `ValueError` por una dependencia circular: `package_definitions = ['A: B', 'B: A']` `target_package = 'A'` Ejemplo de una entrada que debería lanzar un `ValueError` por un paquete faltante: `package_definitions = ['A: B', 'B: C']` (C no está definido) `target_package = 'A'`

Politica de evaluacion

Una solución correcta debe ser una función o clase Python ejecutable que se ajuste a la interfaz especificada. La solución se evaluará según varios criterios: 1. **Correctitud:** Debe producir una lista válida, ordenada topológicamente de dependencias para todas las entradas válidas. El orden entre dependencias en el mismo nivel (por ejemplo, B y C en el ejemplo) no importa. 2. **Manejo de errores:** Debe detectar correctamente y lanzar `ValueError` con mensajes descriptivos tanto para dependencias circulares como...

Mostrar mas

Una solución correcta debe ser una función o clase Python ejecutable que se ajuste a la interfaz especificada. La solución se evaluará según varios criterios: 1. **Correctitud:** Debe producir una lista válida, ordenada topológicamente de dependencias para todas las entradas válidas. El orden entre dependencias en el mismo nivel (por ejemplo, B y C en el ejemplo) no importa. 2. **Manejo de errores:** Debe detectar correctamente y lanzar `ValueError` con mensajes descriptivos tanto para dependencias circulares como para definiciones de paquetes faltantes. 3. **Robustez:** El código debe analizar correctamente el formato de entrada y manejar casos límite como paquetes sin dependencias, dependencias en diamante y auto-dependencias. 4. **Calidad del código:** La solución debe estar bien estructurada, legible y ser razonablemente eficiente. Se espera el uso de un algoritmo estándar de recorrido de grafos (como un enfoque basado en Depth-First Search (búsqueda en profundidad) o el algoritmo de Kahn). La implementación no debe ser innecesariamente compleja.

Respuestas

Respuesta: def resolve_dependencies(package_definitions, target_package): # Analizar definiciones de paquetes graph = {} for definition in package_definitions: if ':' not in definition: raise ValueError(f'Definición de paquete no válida: {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 # Comprobar paquetes faltantes for pkg, deps in graph.items():...

Mostrar respuesta completa

Respuesta: def resolve_dependencies(package_definitions, target_package): # Analizar definiciones de paquetes graph = {} for definition in package_definitions: if ':' not in definition: raise ValueError(f'Definición de paquete no válida: {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 # Comprobar paquetes faltantes for pkg, deps in graph.items(): for dep in deps: if dep not in graph: raise ValueError(f'Falta la definición del paquete para: {dep}') if target_package not in graph: raise ValueError(f'Falta la definición del paquete para: {target_package}') # Ordenación topológica usando DFS, solo para paquetes alcanzables desde target_package # Estados: 0 = no visitado, 1 = en progreso, 2 = terminado state = {} result = [] path = [] # rastrear la ruta actual para detectar ciclos def dfs(pkg): if state.get(pkg) == 2: return if state.get(pkg) == 1: # Encontrar ciclo en la ruta cycle_start = path.index(pkg) cycle = path[cycle_start:] + [pkg] raise ValueError(f'Se detectó una dependencia circular que involucra: {" -> ".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

Resultado

#2

Votos ganadores

0 / 3

Puntuacion media

75
Modelos evaluadores Google Gemini 2.5 Flash

Puntuacion total

79

Comentario general

La respuesta A proporciona un resolvedor de dependencias correcto y funcional utilizando un enfoque DFS estándar. Maneja correctamente las dependencias circulares y los paquetes faltantes con los mensajes de error especificados. Sin embargo, su análisis de entrada es menos robusto, particularmente en lo que respecta a definiciones de paquetes duplicadas (que sobrescribe) y listas de dependencias mal formadas (por ejemplo, 'A: , B' resultaría en una dependencia de cadena vacía).

Ver detalle de evaluacion

Correccion

Peso 35%
88

La solución realiza correctamente la ordenación topológica y genera errores apropiados para dependencias circulares y faltantes. Sin embargo, su análisis de cadenas de dependencias como 'A: , B' incluiría incorrectamente una cadena vacía como dependencia, lo que es un defecto menor de corrección en la construcción del grafo.

Integridad

Peso 20%
70

La solución implementa todas las características principales, pero carece de manejo para definiciones de paquetes duplicadas (las sobrescribe) y es menos robusta en el análisis de cadenas de dependencias mal formadas, lo que reduce su completitud para entradas del mundo real.

Calidad del codigo

Peso 20%
78

El código es legible y utiliza un algoritmo DFS estándar. La lógica de análisis está integrada directamente en la función principal. Es razonablemente eficiente y no excesivamente complejo.

Valor practico

Peso 15%
70

La solución es funcional pero menos robusta ante variaciones comunes de entrada del mundo real, como definiciones de paquetes duplicadas o listas de dependencias ligeramente mal formadas, lo que limita su aplicabilidad práctica sin un refinamiento adicional.

Seguimiento de instrucciones

Peso 10%
85

La solución se adhiere a la firma de la función, el tipo de retorno, los tipos de error y los formatos de mensaje de error especificados. Implementa correctamente los requisitos principales.

Modelos evaluadores OpenAI GPT-5.2

Puntuacion total

72

Comentario general

Implementa un ordenamiento topológico DFS correcto restringido al subgrafo alcanzable del objetivo, con detección de ciclos mediante una pila de ruta explícita y una notificación clara de ciclos. Comprueba correctamente las definiciones de paquetes faltantes (incluido el objetivo faltante) antes de la traversa. Debilidades: el análisis es un poco impreciso (no filtra tokens de dependencia vacíos como 'A: B,', por lo que puede generar un error de paquete faltante para una cadena vacía); sobrescribe silenciosamente las definiciones de paquetes duplicadas en lugar de rechazarlas; y realiza un escaneo global de dependencias faltantes sobre todos los paquetes en lugar de solo el subconjunto alcanzable (no es incorrecto, pero potencialmente sorprendente).

Ver detalle de evaluacion

Correccion

Peso 35%
75

Ordenamiento topológico DFS correcto para el subgrafo del objetivo; la detección de ciclos y la detección de paquetes faltantes funcionan en general. Sin embargo, las comas finales pueden producir un nombre de dependencia vacío que desencadena un error de paquete faltante engañoso, lo que reduce la corrección en entradas con formato impreciso.

Integridad

Peso 20%
70

Cumple los requisitos principales (análisis, ordenamiento topológico, errores de ciclo/faltantes). Carece de manejo de definiciones duplicadas y no sanitiza tokens de dependencia vacíos, que son problemas comunes de formato menores.

Calidad del codigo

Peso 20%
65

Legible y corto; utiliza estados DFS estándar. Problemas menores: búsqueda de índice de ruta dentro del caso de ciclo y sobrescritura silenciosa en duplicados; análisis menos defensivo.

Valor practico

Peso 15%
65

Útil tal cual para entradas limpias, pero menos resistente a definiciones y duplicados ligeramente desordenados, lo que reduce la utilidad en el mundo real.

Seguimiento de instrucciones

Peso 10%
85

Implementa la función solicitada y genera ValueError con mensajes descriptivos que incluyen una ruta de ciclo; devuelve el formato correcto.

Modelos evaluadores Anthropic Claude Opus 4.6

Puntuacion total

74

Comentario general

La Respuesta A proporciona una implementación correcta y limpia del resolvedor de dependencias. Analiza correctamente la entrada, detecta paquetes faltantes, detecta dependencias circulares con seguimiento de ruta y realiza una ordenación topológica basada en DFS. El código es conciso y legible. Sin embargo, carece de manejo de algunos casos extremos como definiciones de paquetes duplicados, nombres de paquetes vacíos y entradas no-string. También carece de un docstring y un ejemplo de uso.

Ver detalle de evaluacion

Correccion

Peso 35%
85

La Respuesta A implementa correctamente la ordenación topológica mediante DFS, detecta correctamente las dependencias circulares con un informe preciso de la ruta del ciclo, detecta paquetes faltantes y produce órdenes de instalación válidas. El algoritmo principal es correcto para todos los casos de prueba especificados.

Integridad

Peso 20%
65

La Respuesta A maneja los requisitos principales: análisis, ordenación topológica, detección de ciclos y detección de paquetes faltantes. Sin embargo, no maneja casos extremos como definiciones de paquetes duplicados, nombres de paquetes vacíos, entradas no-string o cadenas vacías resultantes de la división de dependencias.

Calidad del codigo

Peso 20%
70

La Respuesta A es concisa y legible, con nombres de variables y comentarios claros. La estructura del código es sencilla. Sin embargo, carece de un docstring y la lógica de análisis está en línea en lugar de separarse en una función auxiliar.

Valor practico

Peso 15%
65

La Respuesta A es funcional y funcionaría en la práctica para entradas bien formadas. Sin embargo, la falta de validación de entrada para casos extremos reduce su robustez en escenarios del mundo real donde las entradas pueden estar mal formadas.

Seguimiento de instrucciones

Peso 10%
75

La Respuesta A sigue bien las instrucciones: implementa la firma de función requerida, analiza el formato de entrada, realiza la ordenación topológica, detecta ciclos con mensajes descriptivos y detecta paquetes faltantes. El formato del mensaje de error coincide con los ejemplos.

Respuesta B: OpenAI GPT-5.4

def resolve_dependencies(package_definitions, target_package): """ Resuelve las dependencias para target_package y devuelve un orden de instalación válido. Args: package_definitions: list[str], cada una en el formato 'Paquete: Dep1, Dep2' o 'Paquete:' target_package: str Returns: list[str]: orden de instalación ordenado topológicamente que termina con target_package Raises: ValueError: en caso de entrada mal formada, definiciones de paquetes faltantes o dependencias circulares """ def parse_definitions(definitions): graph = {} for en...

Mostrar respuesta completa

def resolve_dependencies(package_definitions, target_package): """ Resuelve las dependencias para target_package y devuelve un orden de instalación válido. Args: package_definitions: list[str], cada una en el formato 'Paquete: Dep1, Dep2' o 'Paquete:' target_package: str Returns: list[str]: orden de instalación ordenado topológicamente que termina con target_package Raises: ValueError: en caso de entrada mal formada, definiciones de paquetes faltantes o dependencias circulares """ def parse_definitions(definitions): graph = {} for entry in definitions: if not isinstance(entry, str): raise ValueError(f"Definición de paquete inválida: {entry}") if ':' not in entry: raise ValueError(f"Definición de paquete inválida: {entry}") package, deps_part = entry.split(':', 1) package = package.strip() if not package: raise ValueError(f"Definición de paquete inválida: {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"Definición de paquete duplicada para: {package}") graph[package] = deps return graph graph = parse_definitions(package_definitions) if target_package not in graph: raise ValueError(f"Definición de paquete faltante para: {target_package}") order = [] state = {} # 0/sin establecer = no visitado, 1 = visitando, 2 = visitado stack = [] def dfs(package): if package not in graph: raise ValueError(f"Definición de paquete faltante para: {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( "Se detectó una dependencia circular que involucra: " + " -> ".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"Definición de paquete faltante para: {dep}") dfs(dep) stack.pop() state[package] = 2 order.append(package) dfs(target_package) return order # Ejemplo de uso: if __name__ == "__main__": package_definitions = [ 'A: B, C', 'B: D', 'C: D, E', 'D:', 'E:' ] print(resolve_dependencies(package_definitions, 'A')) # Ejemplo de ciclo: # print(resolve_dependencies(['A: B', 'B: A'], 'A')) # Ejemplo de paquete faltante: # print(resolve_dependencies(['A: B', 'B: C'], 'A'))

Resultado

#1 | Ganador

Votos ganadores

3 / 3

Puntuacion media

83
Modelos evaluadores Google Gemini 2.5 Flash

Puntuacion total

86

Comentario general

La respuesta B es una solución muy robusta y bien estructurada. Sobresale en el análisis de entrada, manejando definiciones de paquetes duplicadas y varios escenarios de listas de dependencias mal formadas con gracia. Implementa correctamente el ordenamiento topológico, detecta dependencias circulares e identifica paquetes faltantes con mensajes de error precisos. El uso de una función auxiliar para el análisis mejora la modularidad. Existe una pequeña rareza lógica en el bloque `try-except` de la detección de ciclos, pero no afecta la corrección de la solución.

Ver detalle de evaluacion

Correccion

Peso 35%
90

La solución realiza correctamente el ordenamiento topológico y genera los errores apropiados. Maneja correctamente varios casos extremos de análisis, como que 'A: ,' no cree una dependencia de cadena vacía. La lógica de detección de ciclos es sólida, a pesar de una pequeña rareza lógica no impactante en el bloque `try-except`.

Integridad

Peso 20%
85

La solución está muy completa, implementando todas las características requeridas, incluyendo análisis robusto, construcción de grafos, ordenamiento topológico y manejo integral de errores. Aborda correctamente las definiciones de paquetes duplicadas y varios escenarios de entrada mal formados.

Calidad del codigo

Peso 20%
82

La calidad del código es alta, con buena modularidad lograda al separar el análisis en una función auxiliar. Incluye una útil cadena de documentación y utiliza un DFS estándar. El bloque `try-except` en la detección de ciclos es una pequeña rareza lógica, pero no resta valor significativamente a la calidad general.

Valor practico

Peso 15%
80

La solución ofrece un alto valor práctico debido a su análisis robusto y manejo integral de errores, incluida la detección de definiciones de paquetes duplicadas. Esto la hace más resistente y confiable para su uso en un sistema de gestión de paquetes.

Seguimiento de instrucciones

Peso 10%
90

La solución sigue meticulosamente todas las instrucciones explícitas, incluyendo la firma de la función, el tipo de retorno, los tipos de error y los formatos exactos de los mensajes de error. También va más allá de los requisitos explícitos al proporcionar un análisis de entrada más robusto, alineándose bien con el espíritu del criterio de robustez de la tarea.

Modelos evaluadores OpenAI GPT-5.2

Puntuacion total

83

Comentario general

Proporciona un resolvedor robusto y ejecutable basado en DFS con una buena validación de análisis (entradas no de cadena, falta de ':', nombre de paquete vacío, recorta dependencias y filtra tokens vacíos) y rechaza definiciones de paquetes duplicadas. Detecta correctamente los paquetes faltantes tanto para el objetivo como para cualquier dependencia encontrada, e informa ciclos con un rastro de ruta explícito. El código está bien estructurado y documentado; el uso de ejemplo incluido es inofensivo aunque un poco extra para una respuesta de benchmark.

Ver detalle de evaluacion

Correccion

Peso 35%
85

Produce un orden topológico válido que termina con el objetivo, sin duplicados, manejo correcto de dependencias transitivas, autodependencias y diamantes. La detección de ciclos y paquetes faltantes es correcta y consistente durante la traversa.

Integridad

Peso 20%
85

Cubre todos los requisitos especificados y añade extras sensatos (detección de definición duplicada, comprobaciones más sólidas de entrada mal formada) sin romper la interfaz.

Calidad del codigo

Peso 20%
80

Bien estructurado con función de análisis auxiliar, docstring, nomenclatura de variables clara y comprobaciones defensivas. La construcción de ciclos es clara; en general, mantenible.

Valor practico

Peso 15%
80

Más amigable para producción debido a la validación, detección de duplicados y saneamiento de tokens de dependencia; el uso de ejemplo ayuda a la verificación rápida.

Seguimiento de instrucciones

Peso 10%
80

Implementa la función y los mensajes de error solicitados; incluye un bloque principal de ejemplo adicional (no solicitado) pero no interfiere con el comportamiento de la función.

Modelos evaluadores Anthropic Claude Opus 4.6

Puntuacion total

81

Comentario general

La Respuesta B proporciona una implementación correcta y más robusta del resolvedor de dependencias. Incluye validaciones adicionales como la detección de paquetes duplicados, la detección de nombres de paquetes vacíos, la validación de entradas no-string y el filtrado de cadenas de dependencias vacías de los resultados divididos. Tiene un docstring completo, código bien estructurado con una función de análisis separada e incluye un ejemplo de uso. El código maneja más casos extremos manteniendo la legibilidad.

Ver detalle de evaluacion

Correccion

Peso 35%
85

La Respuesta B implementa correctamente el ordenamiento topológico mediante DFS, detecta adecuadamente las dependencias circulares con informes precisos de la ruta del ciclo, detecta paquetes faltantes y produce órdenes de instalación válidos. El algoritmo principal es correcto para todos los casos de prueba especificados. La verificación de paquetes faltantes se realiza tanto al principio como durante el recorrido DFS, lo cual es ligeramente redundante pero no incorrecto.

Integridad

Peso 20%
80

La Respuesta B maneja todos los requisitos principales más casos extremos adicionales: definiciones de paquetes duplicados, nombres de paquetes vacíos, validación de entradas no-string y filtrado de cadenas de dependencias vacías. También incluye un docstring que documenta la interfaz, los argumentos, el valor de retorno y las excepciones.

Calidad del codigo

Peso 20%
80

La Respuesta B tiene una mejor organización del código con una función auxiliar separada para analizar definiciones, un docstring completo, nombres de variables claros y comentarios en línea. La separación de responsabilidades hace que el código sea más mantenible y testeable.

Valor practico

Peso 15%
75

La Respuesta B es más práctica debido a su validación de entrada adicional, mejores mensajes de error y ejemplo de uso en el bloque __main__. La detección de duplicados y la verificación del tipo de entrada la hacen más adecuada para la integración en un sistema de gestión de paquetes real.

Seguimiento de instrucciones

Peso 10%
80

La Respuesta B sigue todas las instrucciones y va un poco más allá al proporcionar un docstring, un ejemplo de uso y validaciones adicionales. La firma de la función coincide exactamente, los mensajes de error son descriptivos y coinciden con el formato requerido, y el ordenamiento topológico está implementado correctamente.

Resumen comparativo

Para cada tarea y discusion, el orden final se decide por agregacion de rangos por evaluador (rango promedio + desempate Borda). La puntuacion media se muestra como referencia.

Evaluadores: 3

Votos ganadores

0 / 3

Puntuacion media

75
Ver esta respuesta

Votos ganadores

3 / 3

Puntuacion media

83
Ver esta respuesta

Resultados de evaluacion

Modelos evaluadores Anthropic Claude Opus 4.6

Motivo del ganador

La respuesta B gana porque maneja más casos extremos (paquetes duplicados, nombres de paquetes vacíos, entradas no de tipo cadena, cadenas de dependencias vacías después de dividirlas), tiene una mejor organización del código con una función de análisis separada, incluye una cadena de documentación completa y proporciona un ejemplo de uso. Ambas respuestas son correctas para la funcionalidad principal, pero la respuesta B es más robusta y tiene una mayor calidad de código. La validación adicional en la respuesta B la hace más adecuada para el uso en el mundo real.

Modelos evaluadores OpenAI GPT-5.2

Motivo del ganador

La respuesta B gana debido a una mayor solidez y validación de entrada, al tiempo que sigue cumpliendo todos los requisitos funcionales: maneja casos extremos como comas finales/tokens de dependencia vacíos, detecta definiciones de paquetes duplicadas y mantiene errores claros de ciclos/paquetes faltantes. La respuesta A es en gran medida correcta, pero puede manejar incorrectamente listas de dependencias mal formadas (por ejemplo, introduciendo nombres de dependencias vacíos) y sobrescribe duplicados silenciosamente.

Modelos evaluadores Google Gemini 2.5 Flash

Motivo del ganador

La respuesta B es superior debido a su análisis y manejo significativamente más robustos de las entradas y de casos extremos como definiciones de paquetes duplicadas y cadenas de dependencias mal formadas. Si bien ambas respuestas implementan correctamente la lógica central de resolución de dependencias y el manejo de errores, la mayor robustez de B la hace más práctica y completa para un escenario del mundo real.

X f L