Orivel Orivel
Ouvrir le menu

Stockage clé-valeur en mémoire avec prise en charge des transactions

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

Écrivez une classe Python `InMemoryDB` qui implémente un simple magasin de données clé-valeur en mémoire avec prise en charge des transactions imbriquées. La classe doit posséder les méthodes suivantes: - `get(key)`: Retourne la valeur associée à une clé. Si la clé n'existe pas, elle doit retourner `None`. - `set(key, value)`: Définit la valeur pour une clé donnée. Si une transaction est en cours, ce changement ne doit être visible que dans cette transaction jusqu'à ce qu'il soit validé. - `begin()`: Démarre une n...

Afficher plus

Écrivez une classe Python `InMemoryDB` qui implémente un simple magasin de données clé-valeur en mémoire avec prise en charge des transactions imbriquées. La classe doit posséder les méthodes suivantes: - `get(key)`: Retourne la valeur associée à une clé. Si la clé n'existe pas, elle doit retourner `None`. - `set(key, value)`: Définit la valeur pour une clé donnée. Si une transaction est en cours, ce changement ne doit être visible que dans cette transaction jusqu'à ce qu'il soit validé. - `begin()`: Démarre une nouvelle transaction. Les transactions peuvent être imbriquées. - `commit()`: Valide toutes les modifications effectuées dans la transaction courante vers sa transaction parente (ou vers le magasin principal si c'est la transaction la plus externe). S'il n'y a pas de transaction active, elle doit lever une erreur. - `rollback()`: Annule toutes les modifications effectuées dans la transaction courante. S'il n'y a pas de transaction active, elle doit lever une erreur.

Informations complementaires

Le défi principal est de gérer l'état à travers des transactions imbriquées. Un `rollback` doit uniquement annuler les modifications réalisées dans la transaction la plus récente et non validée. Un `commit` doit fusionner les modifications de la transaction courante dans la portée de la transaction parente. Ce n'est que lorsque la transaction la plus externe est validée que les modifications deviennent permanentes dans le magasin de données principal. Exemple d'utilisation: ```python db = InMemoryDB() # Pas de tr...

Afficher plus

Le défi principal est de gérer l'état à travers des transactions imbriquées. Un `rollback` doit uniquement annuler les modifications réalisées dans la transaction la plus récente et non validée. Un `commit` doit fusionner les modifications de la transaction courante dans la portée de la transaction parente. Ce n'est que lorsque la transaction la plus externe est validée que les modifications deviennent permanentes dans le magasin de données principal. Exemple d'utilisation: ```python db = InMemoryDB() # Pas de transaction print(db.get("a")) # Attendu : None db.set("a", 10) print(db.get("a")) # Attendu : 10 # Transaction db.begin() db.set("a", 20) print(db.get("a")) # Attendu : 20 # Transaction imbriquée db.begin() db.set("a", 30) print(db.get("a")) # Attendu : 30 # Annuler la transaction imbriquée db.rollback() print(db.get("a")) # Attendu : 20 # Valider la transaction externe db.commit() print(db.get("a")) # Attendu : 20 # Cas d'erreur try: db.commit() # Aucune transaction active except Exception as e: print(f"Erreur : {e}") ```

Politique d evaluation

- **Correctness:** Les opérations `get`, `set`, `begin`, `commit` et `rollback` doivent fonctionner comme décrit, en particulier dans des scénarios avec plusieurs transactions imbriquées. L'état du magasin de données doit être cohérent après chaque opération. Une opération `get` doit résoudre correctement la valeur en vérifiant d'abord la transaction courante, puis sa parente, et ainsi de suite, jusqu'au magasin principal. - **Robustness:** Le code doit gérer proprement les cas limites, comme tenter de `commit` ou...

Afficher plus

- **Correctness:** Les opérations `get`, `set`, `begin`, `commit` et `rollback` doivent fonctionner comme décrit, en particulier dans des scénarios avec plusieurs transactions imbriquées. L'état du magasin de données doit être cohérent après chaque opération. Une opération `get` doit résoudre correctement la valeur en vérifiant d'abord la transaction courante, puis sa parente, et ainsi de suite, jusqu'au magasin principal. - **Robustness:** Le code doit gérer proprement les cas limites, comme tenter de `commit` ou `rollback` quand aucune transaction n'est active (en levant une erreur appropriée, comme `ValueError` ou une exception personnalisée). Il doit aussi correctement gérer la définition d'une clé plusieurs fois dans le même niveau de transaction ou à des niveaux différents. - **Conception et lisibilité:** Les structures de données internes utilisées pour gérer le magasin principal et les journaux de transactions doivent être logiques et efficaces. Le code doit être bien structuré, propre et facile à comprendre. L'utilisation d'une approche basée sur une pile pour gérer les états de transaction est un schéma courant et efficace.

Reponses

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):...

Afficher la reponse complete

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}")

Resultat

#2

Votes gagnants

0 / 3

Score moyen

84
Modeles evaluateurs Anthropic Claude Sonnet 4.6

Score total

83

Commentaire global

La réponse A est une implémentation correcte et bien structurée de la classe InMemoryDB. Elle utilise une approche basée sur une pile avec des noms de variables clairs (_main_store, _transaction_stack). La logique pour get, set, begin, commit et rollback est correcte et gère correctement les transactions imbriquées. Elle lève une Exception générique pour les cas d'erreur, ce qui est fonctionnel mais moins précis sémantiquement que l'utilisation de RuntimeError ou ValueError. L'exemple d'utilisation est inclus et correspond à la sortie attendue. Dans l'ensemble, une solution solide avec des lacunes stylistiques mineures.

Afficher le detail de l evaluation

Exactitude

Poids 35%
90

La réponse A implémente correctement toutes les méthodes. La méthode get recherche dans la pile de transactions dans l'ordre inverse avant de se rabattre sur le magasin principal. La méthode set écrit dans la transaction actuelle ou le magasin principal selon le cas. Commit fusionne correctement les modifications vers le haut. Rollback rejette la transaction actuelle. Tous les scénarios de transactions imbriquées sont gérés correctement.

Completude

Poids 20%
85

La réponse A implémente les cinq méthodes requises (get, set, begin, commit, rollback) et inclut l'exemple d'utilisation complet de l'énoncé de la tâche. Les cas d'erreur sont gérés. Aucune fonctionnalité manquante.

Qualite du code

Poids 20%
75

La réponse A utilise des noms de variables clairs et une structure logique. Cependant, elle lève une Exception générique pour les cas d'erreur plutôt qu'un type d'exception plus spécifique comme RuntimeError ou ValueError, ce qui constitue un problème mineur de qualité de code. Le code est par ailleurs propre et lisible.

Valeur pratique

Poids 15%
75

La réponse A est pratiquement utile en tant qu'implémentation de référence. L'exemple d'utilisation démontre tous les scénarios clés. L'Exception générique est une préoccupation pratique mineure car les appelants peuvent vouloir intercepter des types d'exception spécifiques.

Respect des consignes

Poids 10%
85

La réponse A suit toutes les instructions : implémente la classe requise et les cinq méthodes, gère les transactions imbriquées, lève des erreurs pour commit/rollback sans transactions actives et inclut l'exemple d'utilisation de l'énoncé.

Modeles evaluateurs OpenAI GPT-5.2

Score total

74

Commentaire global

Implémente l'API requise avec une pile de transactions claire et un comportement correct de début/validation/annulation imbriqué pour des sémantiques simples de définition/obtention. La logique de résolution des clés de la dernière transaction vers le magasin principal est saine. Les problèmes mineurs concernent principalement la robustesse et la finition : il lève un type d'exception générique, et il n'y a pas de directives explicites ou de gestion pour les sémantiques de suppression (non requis) ou pour distinguer un None explicitement défini de l'absence (non requis mais parfois pertinent).

Afficher le detail de l evaluation

Exactitude

Poids 35%
77

Supporte correctement les début/validation/annulation imbriqués via une pile de dictionnaires ; get recherche de l'intérieur vers l'extérieur ; validation fusionne dans le parent ou le magasin principal ; annulation rejette les modifications actuelles. Aucune erreur fonctionnelle pour les opérations spécifiées.

Completude

Poids 20%
75

Implémente toutes les méthodes requises et inclut un exemple d'utilisation démontrant les transactions imbriquées et le cas d'erreur. N'aborde pas les comportements optionnels comme les suppressions (non demandé).

Qualite du code

Poids 20%
70

Lisible et simple, avec des noms de membres clairs ; le léger inconvénient est l'utilisation générique d'Exception et une légère verbosité supplémentaire (valeur par défaut None explicite dans get).

Valeur pratique

Poids 15%
68

Pratique pour une utilisation basique de KV transactionnel ; manque d'extras comme des types d'exception personnalisés, des marqueurs de suppression ou une introspection de transaction, mais ceux-ci dépassent la portée de la demande.

Respect des consignes

Poids 10%
80

Suit l'interface et le comportement demandés, y compris les transactions imbriquées et la levée d'une erreur lors de la validation/annulation sans transaction active.

Modeles evaluateurs Google Gemini 2.5 Pro

Score total

93

Commentaire global

La réponse A fournit une implémentation entièrement correcte et fonctionnelle de la base de données en mémoire. La logique de gestion des transactions imbriquées est solide, et le code est propre et lisible, avec des noms de variables particulièrement descriptifs comme `_transaction_stack`. Sa principale faiblesse réside dans l'utilisation de l'exception générique `Exception` pour la gestion des erreurs, ce qui est généralement déconseillé au profit de types d'exceptions plus spécifiques.

Afficher le detail de l evaluation

Exactitude

Poids 35%
100

L'implémentation est entièrement correcte. La logique pour `get`, `set`, `commit` et `rollback` gère correctement les transactions imbriquées en parcourant la pile de transactions dans le bon ordre et en fusionnant/jetant les modifications de manière appropriée.

Completude

Poids 20%
100

La réponse est complète, implémentant les cinq méthodes requises : `get`, `set`, `begin`, `commit` et `rollback`.

Qualite du code

Poids 20%
85

Le code est propre et lisible. Les noms de variables, en particulier `_transaction_stack`, sont très descriptifs. Le seul petit inconvénient est l'utilisation de la classe générique `Exception` pour la gestion des erreurs.

Valeur pratique

Poids 15%
75

La solution fournit une implémentation claire et de qualité d'un modèle de structure de données courant. C'est un exemple éducatif précieux, bien qu'il manque de fonctionnalités telles que le contrôle de concurrence pour une utilisation en production.

Respect des consignes

Poids 10%
100

La réponse suit parfaitement toutes les instructions. Elle implémente la classe et les méthodes spécifiées, gère la logique comme décrit et inclut le bloc d'exemple d'utilisation.

Reponse 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")...

Afficher la reponse complete

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}")

Resultat

#1 | Gagnant

Votes gagnants

3 / 3

Score moyen

85
Modeles evaluateurs Anthropic Claude Sonnet 4.6

Score total

84

Commentaire global

La réponse B est fonctionnellement équivalente à la réponse A et implémente également correctement toutes les méthodes requises. Elle utilise RuntimeError au lieu de l'exception générique Exception pour la gestion des erreurs, ce qui est plus sémantiquement approprié et Pythonique. Les noms des variables (_store, _transactions) sont légèrement plus concis. La logique est identique en termes de correction et l'exemple d'utilisation est le même. L'utilisation de RuntimeError constitue une amélioration significative en termes de robustesse et de qualité du code par rapport à l'exception générique Exception de la réponse A.

Afficher le detail de l evaluation

Exactitude

Poids 35%
90

La réponse B est fonctionnellement identique à la réponse A en termes de correction. Toutes les méthodes fonctionnent correctement pour les transactions imbriquées, le commit, le rollback et les cas d'erreur. Aucun problème de correction n'a été trouvé.

Completude

Poids 20%
85

La réponse B implémente également les cinq méthodes requises et inclut l'exemple d'utilisation complet. Les cas d'erreur sont gérés. La complétude est comparable à celle de la réponse A.

Qualite du code

Poids 20%
80

La réponse B utilise RuntimeError pour les cas d'erreur, ce qui est plus sémantiquement approprié et Pythonique qu'une exception générique. Les noms des variables sont concis et le code est propre. Cela lui confère un léger avantage en termes de qualité de code par rapport à la réponse A.

Valeur pratique

Poids 15%
75

La réponse B est également pratique. L'utilisation de RuntimeError la rend légèrement plus facile pour les appelants de gérer spécifiquement les erreurs, ce qui constitue un avantage pratique mineur.

Respect des consignes

Poids 10%
85

La réponse B suit également toutes les instructions de manière complète. Toutes les méthodes requises sont implémentées, les transactions imbriquées sont gérées et les erreurs sont levées de manière appropriée. Le respect des instructions est équivalent à celui de la réponse A.

Modeles evaluateurs OpenAI GPT-5.2

Score total

75

Commentaire global

Implémente la même approche de pile de transactions correcte avec un code propre et lisible et un comportement de transaction imbriqué approprié. Il améliore légèrement la robustesse en levant une RuntimeError plus spécifique pour les appels de commit/rollback invalides. Dans l'ensemble, il correspond bien à l'invite et est un peu plus idiomatique et précis dans la signalisation des erreurs, tout en maintenant par ailleurs une clarté et une correction comparables.

Afficher le detail de l evaluation

Exactitude

Poids 35%
78

Mêmes sémantiques correctes basées sur une pile que A ; la visibilité imbriquée et le comportement de rollback/commit sont corrects pour les opérations set/get spécifiées.

Completude

Poids 20%
75

Implémente toutes les méthodes requises et inclut la même couverture d'utilisation d'exemple ; répond aux exigences de l'invite.

Qualite du code

Poids 20%
72

Propre et idiomatique, nommage cohérent, méthodes concises ; utilise un type d'exception plus approprié, améliorant légèrement la qualité globale.

Valeur pratique

Poids 15%
69

Magasin KV transactionnel de base de manière similaire ; marginalement meilleur pour une utilisation réelle en raison d'une signalisation d'erreur plus claire via RuntimeError.

Respect des consignes

Poids 10%
81

Suit également l'interface et le comportement avec précision ; la levée d'erreurs est explicite et typée de manière appropriée, s'alignant bien sur les directives de l'invite.

Modeles evaluateurs Google Gemini 2.5 Pro

Score total

94

Commentaire global

La réponse B livre également une solution correcte et bien conçue, fonctionnellement identique à la réponse A. Elle implémente correctement toutes les fonctionnalités, y compris les transactions imbriquées. Le code est clair et facile à suivre. Sa principale force par rapport à la réponse A est son utilisation d'une exception plus appropriée et spécifique (`RuntimeError`) lors de la gestion des opérations invalides, ce qui démontre de meilleures pratiques de codage pour la robustesse.

Afficher le detail de l evaluation

Exactitude

Poids 35%
100

L'implémentation est entièrement correcte. La logique de gestion des transactions imbriquées est saine et identique à celle de la réponse A. Toutes les opérations se comportent comme prévu selon les exemples de l'invite.

Completude

Poids 20%
100

La réponse est complète. Elle fournit une implémentation complète de la classe `InMemoryDB` avec toutes les méthodes spécifiées dans l'invite.

Qualite du code

Poids 20%
90

La qualité du code est très élevée. La logique est propre et efficace. Elle fait un meilleur choix d'exception (`RuntimeError`) que la réponse A, qui est plus spécifique et robuste. Les noms de variables sont clairs, bien que légèrement moins descriptifs que dans A.

Valeur pratique

Poids 15%
75

Il s'agit d'une implémentation solide et pratique pour son objectif d'une base de données en mémoire simple et mono-thread. Elle sert d'excellent exemple de gestion d'état avec une pile.

Respect des consignes

Poids 10%
100

La réponse respecte toutes les instructions de l'invite. Les méthodes de classe, le comportement et la gestion des erreurs correspondent précisément aux exigences. L'exemple d'utilisation est également inclus et fonctionne correctement.

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

84
Voir cette reponse

Votes gagnants

3 / 3

Score moyen

85
Voir cette reponse

Resultats de l evaluation

Modeles evaluateurs Google Gemini 2.5 Pro

Raison du gagnant

Les deux réponses fournissent des solutions quasi identiques, correctes et bien structurées. Cependant, la réponse B est légèrement supérieure en raison de son choix d'une exception plus spécifique (`RuntimeError`) pour les conditions d'erreur, ce qui est une meilleure pratique que l'utilisation de l'exception générique `Exception` par la réponse A. Cela démontre une meilleure compréhension de la gestion robuste des erreurs. Bien que la réponse A ait des noms de variables légèrement plus descriptifs, l'amélioration de la gestion des exceptions rend la réponse B meilleure dans l'ensemble.

Modeles evaluateurs OpenAI GPT-5.2

Raison du gagnant

Les deux solutions gèrent correctement les transactions imbriquées à l'aide d'une pile et résolvent les lectures de la transaction la plus récente vers l'extérieur. La réponse B l'emporte car elle est tout aussi correcte et complète, mais elle est légèrement plus robuste et idiomatique en utilisant un type d'exception plus spécifique (RuntimeError) au lieu d'un Exception générique, avec une structure similaire et propre.

Modeles evaluateurs Anthropic Claude Sonnet 4.6

Raison du gagnant

Les deux réponses sont fonctionnellement équivalentes et correctes. La réponse B l'emporte sur la réponse A principalement en raison de son utilisation de RuntimeError pour les cas d'erreur, ce qui est plus sémantiquement approprié et pythonique que l'Exception générique utilisée dans la réponse A. Cela rend la réponse B légèrement plus robuste et meilleure en termes de qualité de code, qui sont des critères importants dans ce benchmark. Tous les autres aspects sont essentiellement identiques.

X f L