Orivel Orivel
メニューを開く

トランザクション対応のインメモリキー・バリューストア

このプログラミングベンチマークに対する各AIの回答と比較結果を確認できます。

いいね・お気に入り機能を使うにはログインまたは新規登録が必要です。 新規登録

X f L

目次

お題概要

比較ジャンル

プログラミング

お題作成モデル

回答モデル

採点モデル

お題本文

Pythonクラス `InMemoryDB` を実装してください。これはネストされたトランザクションをサポートするシンプルなインメモリのキー・バリューデータストアです。 クラスは次のメソッドを持つべきです: - `get(key)`: キーに関連付けられた値を返します。もしキーが存在しない場合は `None` を返すべきです。 - `set(key, value)`: 指定されたキーの値を設定します。トランザクションが進行中であれば、この変更はコミットされるまでそのトランザクション内でのみ可視であるべきです。 - `begin()`: 新しいトランザクションを開始します。トランザクションはネスト可能です。 - `commit()`: 現在のトランザクションで行われたすべての変更を親トランザクションに(あるいは最外のトランザクションであればメインのストアに)コミットします。アクティブなトランザクションがない場合はエラーを発生させるべきです。 - `rollback()`: 現在のトランザクションで行われたすべての変更を破棄します。アクティブなトランザクションがない場合はエラーを発生させるべきです。

補足情報

主要な課題はネストされたトランザクション間で状態を管理することです。`rollback` は最も直近の未コミットのトランザクションで行われた変更のみを元に戻すべきです。`commit` は現在のトランザクションの変更を親トランザクションのスコープにマージするべきです。最外のトランザクションがコミットされて初めて、変更はメインのデータストアに永久的に反映されます。 Example usage: ```python db = InMemoryDB() # トランザクションなし print(db.get("a")) # 期待: None db.set("a", 10) print(db.get("a")) # 期待: 10 # トランザクション db.begi...

さらに表示

主要な課題はネストされたトランザクション間で状態を管理することです。`rollback` は最も直近の未コミットのトランザクションで行われた変更のみを元に戻すべきです。`commit` は現在のトランザクションの変更を親トランザクションのスコープにマージするべきです。最外のトランザクションがコミットされて初めて、変更はメインのデータストアに永久的に反映されます。 Example usage: ```python db = InMemoryDB() # トランザクションなし print(db.get("a")) # 期待: None db.set("a", 10) print(db.get("a")) # 期待: 10 # トランザクション db.begin() db.set("a", 20) print(db.get("a")) # 期待: 20 # ネストされたトランザクション db.begin() db.set("a", 30) print(db.get("a")) # 期待: 30 # ネストをロールバック db.rollback() print(db.get("a")) # 期待: 20 # 外側をコミット db.commit() print(db.get("a")) # 期待: 20 # エラーケース try: db.commit() # トランザクションがアクティブでない except Exception as e: print(f"Error: {e}") ```

採点方針

高品質な解決は指定されたすべてのメソッドを正しく実装します。評価の中心はネストされたトランザクションの正しい取り扱いに置かれます。 - 正確性: `get`、`set`、`begin`、`commit`、`rollback` の操作は記載どおりに動作しなければなりません。特に複数のネストされたトランザクションがあるシナリオで正しく動作することが重要です。データストアの状態は各操作の後で一貫していなければなりません。`get` 操作は現在のトランザクションを優先して値を解決し、次に親を順に辿ってメインストアまで確認する必要があります。 - 堅牢性: アクティブなトランザクションがない状態で `commit` や `rollback` を試みた場合(`ValueError` やカスタム例外など適切なエラーを送出して)優雅に扱うべきです。また、同一トランザクション内や異なるトランザクションレベルで同じキーに対して複数回設定する場合も正しく処理する必要があります。 - 設計と可読性: メインストアとトランザクションログを管理するための内部データ構造は論理的で効率的であるべきです。コードは構造的でクリーン、理解しやすいことが望まれます。トランザクション状態を管理するためにスタックベースのアプローチを用いることは一般的かつ有効なパターンです。

回答

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

全文を表示

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

判定

2位

勝利票

0 / 3

平均スコア

84

総合点

83

総評

回答Aは、InMemoryDBクラスの正しく構造化された実装です。明確な変数名(_main_store、_transaction_stack)を持つスタックベースのアプローチを使用しています。get、set、begin、commit、rollbackのロジックはすべて正しく、ネストされたトランザクションを適切に処理します。エラーケースに対して汎用的なExceptionを発生させますが、これはRuntimeErrorやValueErrorのような意味的に正確なものよりは機能的です。使用例が含まれており、期待される出力と一致します。全体として、マイナーなスタイル上の欠点はあるものの、堅実なソリューションです。

採点詳細を表示

正確さ

重み 35%
90

回答Aは、すべてのメソッドを正しく実装しています。getメソッドは、メインストアにフォールバックする前に、トランザクションスタックを逆順に検索します。setメソッドは、適切に応じて現在のトランザクションまたはメインストアに書き込みます。commitは、変更を正しく上位にマージします。rollbackは、現在のトランザクションを破棄します。すべてのネストされたトランザクションシナリオは正しく処理されます。

完全性

重み 20%
85

回答Aは、必要な5つのメソッド(get、set、begin、commit、rollback)すべてを実装し、タスクプロンプトからの完全な使用例を含んでいます。エラーケースは処理されています。機能的な欠落はありません。

コード品質

重み 20%
75

回答Aは、明確な変数名と論理的な構造を使用しています。しかし、エラーケースに対してRuntimeErrorやValueErrorのようなより具体的な例外タイプではなく、汎用的なExceptionを発生させるのは、コード品質のマイナーな問題です。それ以外は、コードはクリーンで読みやすいです。

実用性

重み 15%
75

回答Aは、参照実装として実用的な価値があります。使用例は、すべての主要なシナリオを実証しています。汎用的なExceptionは、呼び出し元が特定の例外タイプをキャッチしたい場合があるため、マイナーな実用上の懸念事項です。

指示遵守

重み 10%
85

回答Aは、すべての指示に従っています。必要なクラスと5つのメソッドすべてを実装し、ネストされたトランザクションを処理し、アクティブなトランザクションなしでのcommit/rollbackのエラーを発生させ、プロンプトからの使用例を含んでいます。

採点モデル OpenAI GPT-5.2

総合点

74

総評

トランザクションスタックが明確で、単純なセット/ゲットセマンティクスに対してネストされたbegin/commit/rollbackの動作が正しく実装されています。最新のトランザクションからメインストアへのキー解決ロジックは妥当です。軽微な問題は主に堅牢性と洗練性に関するものです。ジェネリックなException型を発生させ、明示的なNoneの設定と欠落の区別(必須ではないが、時に重要)や、削除セマンティクス(必須ではない)に関する明示的なガイダンスや処理がありません。

採点詳細を表示

正確さ

重み 35%
77

辞書のスタックを介したネストされたbegin/commit/rollbackを正しくサポートしています。getは内部から外部へ検索し、commitは親またはメインストアにマージし、rollbackは現在の変更を破棄します。指定された操作に機能的なエラーはありません。

完全性

重み 20%
75

すべての必須メソッドが実装されており、ネストされたトランザクションとエラーケースを示す使用例が含まれています。削除などのオプションの動作(要求されていません)は扱っていません。

コード品質

重み 20%
70

可読性が高く、わかりやすいメンバー名で構成されています。ジェネリックなExceptionの使用と、わずかに冗長な部分(getでの明示的なNoneデフォルト値)が欠点です。

実用性

重み 15%
68

基本的なトランザクションKV用途には実用的です。カスタム例外型、削除マーカー、トランザクションイントロスペクションなどの追加機能はありませんが、それらはプロンプトの範囲外です。

指示遵守

重み 10%
80

ネストされたトランザクションや、アクティブなトランザクションなしでのコミット/ロールバック時のエラー発生など、要求されたインターフェースと動作に従っています。

採点モデル Google Gemini 2.5 Pro

総合点

93

総評

回答Aは、インメモリデータベースの完全に正しく機能する実装を提供しています。ネストされたトランザクションを処理するロジックは堅牢であり、コードはクリーンで読みやすく、特に`_transaction_stack`のような説明的な変数名が使用されています。主な弱点は、より具体的な例外タイプが推奨されるにもかかわらず、エラー処理に汎用的な`Exception`を使用している点です。

採点詳細を表示

正確さ

重み 35%
100

実装は完全に正しいです。`get`、`set`、`commit`、`rollback`のロジックは、トランザクションスタックを正しい順序で検索し、変更を適切にマージ/破棄することで、ネストされたトランザクションを正しく処理します。

完全性

重み 20%
100

回答は完全であり、要求された5つのメソッドすべて(`get`、`set`、`begin`、`commit`、`rollback`)を実装しています。

コード品質

重み 20%
85

コードはクリーンで読みやすいです。特に`_transaction_stack`のような変数名は非常に説明的です。唯一の小さな欠点は、エラー処理に汎用的な`Exception`クラスを使用していることです。

実用性

重み 15%
75

このソリューションは、一般的なデータ構造パターンの優れた明確な実装を提供します。本番環境での使用には同時実行制御などの機能が欠けていますが、教育的な例として価値があります。

指示遵守

重み 10%
100

回答はすべての指示に完全に準拠しています。指定されたクラスとメソッドを実装し、説明どおりのロジックを処理し、サンプル使用ブロックを含んでいます。

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

全文を表示

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

判定

1位 | 勝者

勝利票

3 / 3

平均スコア

85

総合点

84

総評

回答Bは回答Aと機能的に同等であり、必要なメソッドもすべて正しく実装しています。エラー処理には汎用的なExceptionではなく、より意味的に適切でPythonicなRuntimeErrorを使用しています。変数名(_store、_transactions)もわずかに簡潔になっています。ロジックは正しさにおいて同一であり、使用例も同じです。RuntimeErrorの使用は、回答Aの汎用的なExceptionと比較して、堅牢性とコード品質において意味のある改善です。

採点詳細を表示

正確さ

重み 35%
90

回答Bは、正しさという点では回答Aと機能的に同一です。ネストされたトランザクション、コミット、ロールバック、およびエラーケースにおいて、すべてのメソッドが正しく機能します。正しさに関する問題は見つかりませんでした。

完全性

重み 20%
85

回答Bも5つの必須メソッドをすべて実装しており、完全な使用例が含まれています。エラーケースも処理されています。網羅性は回答Aと同等です。

コード品質

重み 20%
80

回答BはエラーケースにRuntimeErrorを使用しており、これは汎用的なExceptionよりも意味的に適切でPythonicです。変数名は簡潔で、コードはクリーンです。これにより、コード品質において回答Aよりもわずかに優れています。

実用性

重み 15%
75

回答Bは同等に実用的です。RuntimeErrorを使用することで、呼び出し元がエラーを特定して処理しやすくなり、わずかながら実用的な利点があります。

指示遵守

重み 10%
85

回答Bもすべての指示に完全に準拠しています。すべての必須メソッドが実装されており、ネストされたトランザクションが処理され、エラーが適切に発生します。指示の遵守は回答Aと同等です。

採点モデル OpenAI GPT-5.2

総合点

75

総評

同じ正しいトランザクションスタックアプローチを、クリーンで読みやすいコードと適切なネストされたトランザクションの動作で実装しています。無効なコミット/ロールバック呼び出しに対してより具体的なRuntimeErrorを発生させることで、堅牢性がわずかに向上しています。全体として、プロンプトによく適合しており、エラーシグナル伝達においてややより慣用的で正確ですが、それ以外では同等の明瞭さと正確性を維持しています。

採点詳細を表示

正確さ

重み 35%
78

Aと同じ正しいスタックベースのセマンティクス。ネストされた可視性とロールバック/コミットの動作は、指定されたセット/ゲット操作に対して正しいです。

完全性

重み 20%
75

すべての必須メソッドを実装し、同じサンプル使用例のカバレッジを含んでいます。プロンプトの要件を満たしています。

コード品質

重み 20%
72

クリーンで慣用的、一貫した命名、簡潔なメソッド。より適切な例外タイプを使用しており、全体的な品質がわずかに向上しています。

実用性

重み 15%
69

同様に実用的なベースライントランザクションKVストア。RuntimeErrorによる明確なエラーシグナル伝達により、実際の使用においてわずかに優れています。

指示遵守

重み 10%
81

インターフェースと動作も正確に従っています。エラー発生は明示的で適切に型付けされており、プロンプトのガイダンスによく適合しています。

採点モデル Google Gemini 2.5 Pro

総合点

94

総評

回答Bも、回答Aと機能的に同一の、正しく設計されたソリューションを提供しています。ネストされたトランザクションを含むすべての機能を正しく実装しています。コードは明確で分かりやすいです。回答Aに対する主な強みは、無効な操作を処理する際に、より適切で具体的な例外(`RuntimeError`)を使用していることで、堅牢性のためのより良いコーディングプラクティスを示しています。

採点詳細を表示

正確さ

重み 35%
100

実装は完全に正しいです。ネストされたトランザクションを処理するためのロジックは堅牢で、回答Aのものと同一です。すべての操作は、プロンプトの例に従って期待どおりに動作します。

完全性

重み 20%
100

回答は完全です。プロンプトで指定されたすべてのメソッドを備えた`InMemoryDB`クラスの完全な実装を提供しています。

コード品質

重み 20%
90

コード品質は非常に高いです。ロジックはクリーンで効率的です。回答Aよりも具体的で堅牢な、より良い例外(`RuntimeError`)の選択をしています。変数名は明確ですが、Aよりもわずかに説明的ではありません。

実用性

重み 15%
75

これは、単純なシングルスレッドのインメモリストアとしての意図された目的に対して、堅牢で実用的な実装です。状態をスタックで管理する優れた例となります。

指示遵守

重み 10%
100

回答はプロンプトのすべての指示に従っています。クラスメソッド、動作、およびエラー処理は要件に正確に一致しています。例示的な使用法も含まれており、正しく機能します。

比較結果サマリー

最終順位は、採点者ごとの順位集約(平均順位 + ボルダ方式の同点処理)で決定します。平均点は参考表示です。

採点者数: 3

勝利票

3 / 3

平均点

85
この回答を見る

採点結果

採点モデル Google Gemini 2.5 Pro

勝者理由

両方の回答はほぼ同一で、正しく構造化されたソリューションを提供しています。しかし、回答Bは、回答Aの汎用的な`Exception`の使用よりも優れたプラクティスである、エラー条件に対してより具体的な例外(`RuntimeError`)を選択したため、わずかに優れています。これは、堅牢なエラー処理に対するより良い理解を示しています。回答Aの方が変数名がわずかに説明的ですが、例外処理の改善により、回答Bが全体としてより優れた実装となっています。

採点モデル OpenAI GPT-5.2

勝者理由

両方のソリューションは、スタックを使用してネストされたトランザクションを正しく処理し、最も最近のトランザクションから外側に向かって読み取りを解決します。回答Bは、同等に正しく完全でありながら、汎用的なExceptionではなく、より具体的な例外タイプ(RuntimeError)を使用することで、わずかに堅牢で慣用的であるため、勝利します。構造も同様にクリーンです。

勝者理由

両方の回答は機能的に同等で正解です。回答Bが回答Aをわずかに上回るのは、主にエラーケースにRuntimeErrorを使用しているためです。これは回答Aの汎用的なExceptionよりも意味的に適切でPython的です。これにより、回答Bはわずかに堅牢性が高く、コード品質も向上しており、これらはこのベンチマークにおける重要な基準です。その他の側面は基本的に同一です。

X f L