Orivel Orivel
Abrir menu

Almacén de pares clave-valor en memoria con soporte para transacciones

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

Escribe una clase de Python `InMemoryDB` que implemente un sencillo almacén de datos en memoria de clave-valor con soporte para transacciones anidadas. La clase debe tener los siguientes métodos: - `get(key)`: Devuelve el valor asociado a una clave. Si la clave no existe, debe devolver `None`. - `set(key, value)`: Establece el valor para una clave dada. Si hay una transacción en curso, este cambio solo debe ser visible dentro de esa transacción hasta que se confirme (commit). - `begin()`: Inicia una nueva transacc...

Mostrar mas

Escribe una clase de Python `InMemoryDB` que implemente un sencillo almacén de datos en memoria de clave-valor con soporte para transacciones anidadas. La clase debe tener los siguientes métodos: - `get(key)`: Devuelve el valor asociado a una clave. Si la clave no existe, debe devolver `None`. - `set(key, value)`: Establece el valor para una clave dada. Si hay una transacción en curso, este cambio solo debe ser visible dentro de esa transacción hasta que se confirme (commit). - `begin()`: Inicia una nueva transacción. Las transacciones pueden anidarse. - `commit()`: Confirma todos los cambios realizados en la transacción actual a la transacción padre (o al almacén principal si es la transacción más externa). Si no hay ninguna transacción activa, debe lanzar un error. - `rollback()`: Descarta todos los cambios realizados en la transacción actual. Si no hay ninguna transacción activa, debe lanzar un error. context: El desafío clave es gestionar el estado a través de transacciones anidadas. Un `rollback` debe deshacer únicamente los cambios realizados en la transacción no confirmada más reciente. Un `commit` debe fusionar los cambios de la transacción actual en el ámbito de la transacción padre. Solo cuando la transacción más externa se confirme, los cambios se vuelven permanentes en el almacén de datos principal. Example usage: ```python db = InMemoryDB() # No transaction print(db.get("a")) # Expected: None db.set("a", 10) print(db.get("a")) # Expected: 10 # Transaction db.begin() db.set("a", 20) print(db.get("a")) # Expected: 20 # Nested transaction db.begin() db.set("a", 30) print(db.get("a")) # Expected: 30 # Rollback nested db.rollback() print(db.get("a")) # Expected: 20 # Commit outer db.commit() print(db.get("a")) # Expected: 20 # Error cases try: db.commit() # No transaction active except Exception as e: print(f"Error: {e}") ```

Informacion complementaria

El desafío clave es gestionar el estado a través de transacciones anidadas. Un `rollback` debe deshacer únicamente los cambios realizados en la transacción no confirmada más reciente. Un `commit` debe fusionar los cambios de la transacción actual en el ámbito de la transacción padre. Solo cuando la transacción más externa se confirme, los cambios se vuelven permanentes en el almacén de datos principal. Example usage: ```python db = InMemoryDB() # No transaction print(db.get("a")) # Expected: None db.set("a", 10)...

Mostrar mas

El desafío clave es gestionar el estado a través de transacciones anidadas. Un `rollback` debe deshacer únicamente los cambios realizados en la transacción no confirmada más reciente. Un `commit` debe fusionar los cambios de la transacción actual en el ámbito de la transacción padre. Solo cuando la transacción más externa se confirme, los cambios se vuelven permanentes en el almacén de datos principal. Example usage: ```python db = InMemoryDB() # No transaction print(db.get("a")) # Expected: None db.set("a", 10) print(db.get("a")) # Expected: 10 # Transaction db.begin() db.set("a", 20) print(db.get("a")) # Expected: 20 # Nested transaction db.begin() db.set("a", 30) print(db.get("a")) # Expected: 30 # Rollback nested db.rollback() print(db.get("a")) # Expected: 20 # Commit outer db.commit() print(db.get("a")) # Expected: 20 # Error cases try: db.commit() # No transaction active except Exception as e: print(f"Error: {e}") ```

Politica de evaluacion

Una solución de alta calidad implementará correctamente todos los métodos especificados. El núcleo de la evaluación se centrará en el manejo correcto de las transacciones anidadas. - **Correctness:** Las operaciones `get`, `set`, `begin`, `commit` y `rollback` deben funcionar como se describe, especialmente en escenarios con múltiples transacciones anidadas. El estado del almacén de datos debe ser consistente después de cada operación. Una operación `get` debe resolver correctamente el valor comprobando primero la...

Mostrar mas

Una solución de alta calidad implementará correctamente todos los métodos especificados. El núcleo de la evaluación se centrará en el manejo correcto de las transacciones anidadas. - **Correctness:** Las operaciones `get`, `set`, `begin`, `commit` y `rollback` deben funcionar como se describe, especialmente en escenarios con múltiples transacciones anidadas. El estado del almacén de datos debe ser consistente después de cada operación. Una operación `get` debe resolver correctamente el valor comprobando primero la transacción actual, luego su padre, y así sucesivamente hasta el almacén principal. - **Robustness:** El código debe manejar casos límite de manera adecuada, como intentar `commit` o `rollback` cuando no hay ninguna transacción activa (lanzando un error apropiado, como `ValueError` o una excepción personalizada). También debe manejar correctamente el establecimiento de una clave varias veces dentro del mismo nivel de transacción o en niveles de transacción diferentes. - **Design and Readability:** Las estructuras de datos internas utilizadas para gestionar el almacén principal y los registros de transacciones deben ser lógicas y eficientes. El código debe estar bien estructurado, limpio y ser fácil de entender. Usar un enfoque basado en pila para gestionar los estados de las transacciones es un patrón común y efectivo.

Respuestas

class InMemoryDB: def __init__(self): self._main_store = {} self._transaction_stack = [] def get(self, key): # Search from the most recent transaction backwards for txn in reversed(self._transaction_stack): if key in txn: return txn[key] return self._main_store.get(key, None) def set(self, key, value): if self._transaction_stack: self._transaction_stack[-1][key] = value else: self._main_store[key] = value def begin(self): self._transaction_stack.append({}) def commit(self):...

Mostrar respuesta completa

class InMemoryDB: def __init__(self): self._main_store = {} self._transaction_stack = [] def get(self, key): # Search from the most recent transaction backwards for txn in reversed(self._transaction_stack): if key in txn: return txn[key] return self._main_store.get(key, None) def set(self, key, value): if self._transaction_stack: self._transaction_stack[-1][key] = value else: self._main_store[key] = value def begin(self): self._transaction_stack.append({}) def commit(self): if not self._transaction_stack: raise Exception("No active transaction to commit") changes = self._transaction_stack.pop() if self._transaction_stack: # Merge into parent transaction self._transaction_stack[-1].update(changes) else: # Merge into main store self._main_store.update(changes) def rollback(self): if not self._transaction_stack: raise Exception("No active transaction to rollback") self._transaction_stack.pop() # Example usage if __name__ == "__main__": db = InMemoryDB() # No transaction print(db.get("a")) # Expected: None db.set("a", 10) print(db.get("a")) # Expected: 10 # Transaction db.begin() db.set("a", 20) print(db.get("a")) # Expected: 20 # Nested transaction db.begin() db.set("a", 30) print(db.get("a")) # Expected: 30 # Rollback nested db.rollback() print(db.get("a")) # Expected: 20 # Commit outer db.commit() print(db.get("a")) # Expected: 20 # Error cases try: db.commit() # No transaction active except Exception as e: print(f"Error: {e}")

Resultado

#2

Votos ganadores

0 / 3

Puntuacion media

84
Modelos evaluadores Anthropic Claude Sonnet 4.6

Puntuacion total

83

Comentario general

La respuesta A es una implementación correcta y bien estructurada de la clase InMemoryDB. Utiliza un enfoque basado en pilas con nombres de variables claros (_main_store, _transaction_stack). La lógica para get, set, begin, commit y rollback es correcta y maneja adecuadamente las transacciones anidadas. Lanza una excepción genérica para los casos de error, lo cual es funcional pero menos preciso semánticamente que usar RuntimeError o ValueError. Se incluye el uso de ejemplo y coincide con la salida esperada. En general, una solución sólida con pequeños defectos estilísticos.

Ver detalle de evaluacion

Correccion

Peso 35%
90

La respuesta A implementa correctamente todos los métodos. El método get busca en la pila de transacciones en orden inverso antes de recurrir al almacén principal. El método set escribe en la transacción actual o en el almacén principal según corresponda. Commit fusiona los cambios hacia arriba correctamente. Rollback descarta la transacción actual. Todos los escenarios de transacciones anidadas se manejan correctamente.

Integridad

Peso 20%
85

La respuesta A implementa los cinco métodos requeridos (get, set, begin, commit, rollback) e incluye el uso completo del ejemplo de la consigna. Se manejan los casos de error. No hay funcionalidad faltante.

Calidad del codigo

Peso 20%
75

La respuesta A utiliza nombres de variables claros y una estructura lógica. Sin embargo, lanza una excepción genérica para los casos de error en lugar de un tipo de excepción más específico como RuntimeError o ValueError, lo cual es un problema menor de calidad de código. El código es por lo demás limpio y legible.

Valor practico

Peso 15%
75

La respuesta A es prácticamente útil como implementación de referencia. El uso del ejemplo demuestra todos los escenarios clave. La excepción genérica es una preocupación práctica menor, ya que los llamadores pueden querer capturar tipos de excepción específicos.

Seguimiento de instrucciones

Peso 10%
85

La respuesta A sigue todas las instrucciones: implementa la clase requerida y los cinco métodos, maneja transacciones anidadas, lanza errores para commit/rollback sin transacciones activas e incluye el uso del ejemplo de la consigna.

Modelos evaluadores OpenAI GPT-5.2

Puntuacion total

74

Comentario general

Implementa la API requerida con una pila de transacciones clara y un comportamiento correcto de anidamiento de begin/commit/rollback para semántica simple de set/get. La lógica de resolución de claves desde la transacción más reciente hasta la tienda principal es sólida. Los problemas menores se centran principalmente en la robustez y el pulido: genera un tipo de excepción genérico y no hay orientación explícita ni manejo para la semántica de eliminación (no requerida) o para distinguir un None explícitamente establecido de uno faltante (no requerido pero a veces relevante).

Ver detalle de evaluacion

Correccion

Peso 35%
77

Soporta correctamente begin/commit/rollback anidados a través de una pila de diccionarios; get busca de interior a exterior; commit se fusiona en el padre o en la tienda principal; rollback descarta los cambios actuales. No hay errores funcionales para las operaciones especificadas.

Integridad

Peso 20%
75

Implementa todos los métodos requeridos e incluye un uso de ejemplo que demuestra transacciones anidadas y casos de error. No aborda comportamientos opcionales como eliminaciones (no solicitado).

Calidad del codigo

Peso 20%
70

Legible y directo, con nombres de miembros claros; un pequeño inconveniente es el uso genérico de Exception y una ligera verbosidad adicional (valor predeterminado explícito de None en get).

Valor practico

Peso 15%
68

Práctico para uso básico de KV transaccional; carece de extras como tipos de excepción personalizados, marcadores de eliminación o introspección de transacciones, pero eso está más allá de la indicación.

Seguimiento de instrucciones

Peso 10%
80

Sigue la interfaz y el comportamiento solicitados, incluidas las transacciones anidadas y la generación de un error al confirmar/revertir sin una transacción activa.

Modelos evaluadores Google Gemini 2.5 Pro

Puntuacion total

93

Comentario general

La respuesta A proporciona una implementación completa y funcional de la base de datos en memoria. La lógica para manejar transacciones anidadas es sólida y el código es limpio y legible, con nombres de variables particularmente descriptivos como `_transaction_stack`. Su principal debilidad es el uso de la `Exception` genérica para el manejo de errores, lo cual generalmente se desaconseja en favor de tipos de excepción más específicos.

Ver detalle de evaluacion

Correccion

Peso 35%
100

La implementación es completamente correcta. La lógica para `get`, `set`, `commit` y `rollback` maneja correctamente las transacciones anidadas buscando a través de la pila de transacciones en el orden correcto y fusionando/descartando los cambios apropiadamente.

Integridad

Peso 20%
100

La respuesta está completa, implementando los cinco métodos requeridos: `get`, `set`, `begin`, `commit` y `rollback`.

Calidad del codigo

Peso 20%
85

El código es limpio y legible. Los nombres de las variables, especialmente `_transaction_stack`, son muy descriptivos. El único inconveniente menor es el uso de la clase genérica `Exception` para el manejo de errores.

Valor practico

Peso 15%
75

La solución proporciona una implementación buena y clara de un patrón común de estructura de datos. Es un valioso ejemplo educativo, aunque carece de características como control de concurrencia para uso en producción.

Seguimiento de instrucciones

Peso 10%
100

La respuesta sigue perfectamente todas las instrucciones. Implementa la clase y los métodos especificados, maneja la lógica como se describe e incluye el bloque de ejemplo de uso.

Respuesta B: OpenAI GPT-5.4

class InMemoryDB: def __init__(self): self._store = {} self._transactions = [] def get(self, key): for tx in reversed(self._transactions): if key in tx: return tx[key] return self._store.get(key) def set(self, key, value): if self._transactions: self._transactions[-1][key] = value else: self._store[key] = value def begin(self): self._transactions.append({}) def commit(self): if not self._transactions: raise RuntimeError("No active transaction to commit")...

Mostrar respuesta completa

class InMemoryDB: def __init__(self): self._store = {} self._transactions = [] def get(self, key): for tx in reversed(self._transactions): if key in tx: return tx[key] return self._store.get(key) def set(self, key, value): if self._transactions: self._transactions[-1][key] = value else: self._store[key] = value def begin(self): self._transactions.append({}) def commit(self): if not self._transactions: raise RuntimeError("No active transaction to commit") current = self._transactions.pop() if self._transactions: self._transactions[-1].update(current) else: self._store.update(current) def rollback(self): if not self._transactions: raise RuntimeError("No active transaction to rollback") self._transactions.pop() if __name__ == "__main__": db = InMemoryDB() # No transaction print(db.get("a")) # Expected: None db.set("a", 10) print(db.get("a")) # Expected: 10 # Transaction db.begin() db.set("a", 20) print(db.get("a")) # Expected: 20 # Nested transaction db.begin() db.set("a", 30) print(db.get("a")) # Expected: 30 # Rollback nested db.rollback() print(db.get("a")) # Expected: 20 # Commit outer db.commit() print(db.get("a")) # Expected: 20 # Error cases try: db.commit() # No transaction active except Exception as e: print(f"Error: {e}")

Resultado

#1 | Ganador

Votos ganadores

3 / 3

Puntuacion media

85
Modelos evaluadores Anthropic Claude Sonnet 4.6

Puntuacion total

84

Comentario general

La Respuesta B es funcionalmente equivalente a la Respuesta A y también implementa correctamente todos los métodos requeridos. Utiliza RuntimeError en lugar de Exception genérico para el manejo de errores, lo cual es más semánticamente apropiado y Pythonic. Los nombres de las variables (_store, _transactions) son ligeramente más concisos. La lógica es idéntica en cuanto a corrección y el ejemplo de uso es el mismo. El uso de RuntimeError es una mejora significativa en robustez y calidad del código sobre el Exception genérico de la Respuesta A.

Ver detalle de evaluacion

Correccion

Peso 35%
90

La Respuesta B es funcionalmente idéntica a la Respuesta A en términos de corrección. Todos los métodos funcionan correctamente para transacciones anidadas, confirmación, reversión y casos de error. No se encontraron problemas de corrección.

Integridad

Peso 20%
85

La Respuesta B también implementa los cinco métodos requeridos e incluye el ejemplo de uso completo. Se manejan los casos de error. La completitud está a la par con la Respuesta A.

Calidad del codigo

Peso 20%
80

La Respuesta B utiliza RuntimeError para los casos de error, lo cual es más semánticamente apropiado y Pythonic que un Exception genérico. Los nombres de las variables son concisos y el código está limpio. Esto le da una ligera ventaja en calidad de código sobre la Respuesta A.

Valor practico

Peso 15%
75

La Respuesta B es igualmente práctica. El uso de RuntimeError hace que sea ligeramente más fácil para los llamadores manejar errores específicamente, lo cual es una ventaja práctica menor.

Seguimiento de instrucciones

Peso 10%
85

La Respuesta B también sigue todas las instrucciones de manera completa. Se implementan todos los métodos requeridos, se manejan las transacciones anidadas y se generan los errores apropiadamente. El seguimiento de instrucciones es equivalente a la Respuesta A.

Modelos evaluadores OpenAI GPT-5.2

Puntuacion total

75

Comentario general

Implementa el mismo enfoque correcto de pila de transacciones con código limpio y legible y un comportamiento adecuado de transacciones anidadas. Mejora ligeramente la robustez al generar un RuntimeError más específico para llamadas inválidas de commit/rollback. En general, coincide bien con la indicación y es un poco más idiomático y preciso en la señalización de errores, manteniendo al mismo tiempo una claridad y corrección comparables.

Ver detalle de evaluacion

Correccion

Peso 35%
78

La misma semántica correcta basada en pila que A; la visibilidad anidada y el comportamiento de rollback/commit son correctos para las operaciones set/get especificadas.

Integridad

Peso 20%
75

Implementa todos los métodos requeridos e incluye la misma cobertura de uso de ejemplo; cumple con los requisitos de la indicación.

Calidad del codigo

Peso 20%
72

Limpio e idiomático, nomenclatura consistente, métodos concisos; utiliza un tipo de excepción más apropiado, mejorando ligeramente la calidad general.

Valor practico

Peso 15%
69

Almacén KV transaccional de línea base igualmente práctico; marginalmente mejor para uso real debido a una señalización de errores más clara a través de RuntimeError.

Seguimiento de instrucciones

Peso 10%
81

También sigue la interfaz y el comportamiento con precisión; la generación de errores es explícita y de tipo apropiado, alineándose bien con la guía de la indicación.

Modelos evaluadores Google Gemini 2.5 Pro

Puntuacion total

94

Comentario general

La respuesta B también ofrece una solución correcta y bien diseñada que es funcionalmente idéntica a la respuesta A. Implementa correctamente todas las características, incluidas las transacciones anidadas. El código es claro y fácil de seguir. Su principal fortaleza sobre la respuesta A es el uso de una excepción más apropiada y específica (`RuntimeError`) al manejar operaciones inválidas, lo que demuestra mejores prácticas de codificación para la robustez.

Ver detalle de evaluacion

Correccion

Peso 35%
100

La implementación es totalmente correcta. La lógica para manejar transacciones anidadas es sólida e idéntica a la de la respuesta A. Todas las operaciones se comportan como se espera según los ejemplos del prompt.

Integridad

Peso 20%
100

La respuesta está completa. Proporciona una implementación completa de la clase `InMemoryDB` con todos los métodos especificados en el prompt.

Calidad del codigo

Peso 20%
90

La calidad del código es muy alta. La lógica es limpia y eficiente. Opta por una excepción mejor (`RuntimeError`) que la respuesta A, que es más específica y robusta. Los nombres de las variables son claros, aunque ligeramente menos descriptivos que en A.

Valor practico

Peso 15%
75

Esta es una implementación sólida y práctica para su propósito previsto como un almacén en memoria simple y de un solo hilo. Sirve como un excelente ejemplo de gestión de estado con una pila.

Seguimiento de instrucciones

Peso 10%
100

La respuesta cumple con todas las instrucciones del prompt. Los métodos de la clase, el comportamiento y el manejo de errores coinciden con los requisitos con precisión. El ejemplo de uso también se incluye y funciona 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

84
Ver esta respuesta

Votos ganadores

3 / 3

Puntuacion media

85
Ver esta respuesta

Resultados de evaluacion

Modelos evaluadores Google Gemini 2.5 Pro

Motivo del ganador

Ambas respuestas proporcionan soluciones casi idénticas, correctas y bien estructuradas. Sin embargo, la Respuesta B es ligeramente superior debido a su elección de una excepción más específica (`RuntimeError`) para las condiciones de error, lo cual es una mejor práctica que el uso de la genérica `Exception` por parte de la Respuesta A. Esto demuestra una mejor comprensión del manejo robusto de errores. Si bien la Respuesta A tiene nombres de variables ligeramente más descriptivos, la mejora en el manejo de excepciones hace que la Respuesta B sea la mejor implementación general.

Modelos evaluadores OpenAI GPT-5.2

Motivo del ganador

Ambas soluciones manejan correctamente las transacciones anidadas usando una pila y resuelven las lecturas de la transacción más reciente hacia afuera. La respuesta B gana porque es igualmente correcta y completa, pero es ligeramente más robusta e idiomática al usar un tipo de excepción más específico (RuntimeError) en lugar de un genérico Exception, con una estructura similarmente limpia.

Modelos evaluadores Anthropic Claude Sonnet 4.6

Motivo del ganador

Ambas respuestas son funcionalmente equivalentes y correctas. La respuesta B supera a la respuesta A principalmente por su uso de RuntimeError para los casos de error, que es más semánticamente apropiado y Pythonico que el genérico Exception utilizado en la respuesta A. Esto hace que la respuesta B sea ligeramente más robusta y mejor en calidad de código, que son criterios importantes en este benchmark. Todos los demás aspectos son esencialmente idénticos.

X f L