回答A: OpenAI GPT-5.2
class _Node: __slots__ = ("key", "value", "prev", "next") def __init__(self, key=None, value=None): self.key = key self.value = value self.prev = None self.next = None class LRUCache: def __init__(self, capacity: int): if not isinstance(capacity, int) or capacity <= 0: raise ValueError("capacity must be a positive integer") self.capacity = capacity self.map = {} # key -> _Node # Dummy head/tail to avoid edge cases. # Most-recent is right after head. Least-recent is right before tail. self.head = _Node()...
全文を表示 ▼
class _Node: __slots__ = ("key", "value", "prev", "next") def __init__(self, key=None, value=None): self.key = key self.value = value self.prev = None self.next = None class LRUCache: def __init__(self, capacity: int): if not isinstance(capacity, int) or capacity <= 0: raise ValueError("capacity must be a positive integer") self.capacity = capacity self.map = {} # key -> _Node # Dummy head/tail to avoid edge cases. # Most-recent is right after head. Least-recent is right before tail. self.head = _Node() self.tail = _Node() self.head.next = self.tail self.tail.prev = self.head def _add_to_front(self, node: _Node) -> None: node.prev = self.head node.next = self.head.next self.head.next.prev = node self.head.next = node def _remove(self, node: _Node) -> None: node.prev.next = node.next node.next.prev = node.prev node.prev = None node.next = None def _move_to_front(self, node: _Node) -> None: self._remove(node) self._add_to_front(node) def _evict_lru(self) -> None: lru = self.tail.prev if lru is self.head: return self._remove(lru) del self.map[lru.key] def get(self, key: int) -> int: node = self.map.get(key) if node is None: return -1 self._move_to_front(node) return node.value def put(self, key: int, value: int) -> None: node = self.map.get(key) if node is not None: node.value = value self._move_to_front(node) return new_node = _Node(key, value) self.map[key] = new_node self._add_to_front(new_node) if len(self.map) > self.capacity: self._evict_lru() # Demonstration cache = LRUCache(2) cache.put(1, 10) cache.put(2, 20) print(cache.get(1)) # Expected: 10 cache.put(3, 30) # Evicts key 2 print(cache.get(2)) # Expected: -1 cache.put(4, 40) # Evicts key 1 print(cache.get(1)) # Expected: -1 print(cache.get(3)) # Expected: 30 print(cache.get(4)) # Expected: 40
判定
勝利票
3 / 3
平均スコア
総合点
総評
この提出物は傑出しています。LRUキャッシュの正確、効率的、かつ高品質な実装をゼロから提供しています。コードは、ハッシュマップと双方向連結リストを組み合わせた古典的かつ最適なアプローチを使用しています。実装は堅牢で、エッジケースを単純化するためのダミーのヘッド/テールノードを備えており、ヘルパーメソッドや型ヒントなどの優れたコーディングプラクティスを示しています。タスクの要件と制約をすべて完全に遵守しています。
採点詳細を表示 ▼
正確さ
重み 35%実装は完全に正しいです。O(1)のルックアップのためのハッシュマップと、使用順序を維持するための双方向連結リストをうまく使用しています。`get`、`put`、およびエビクションのロジックは完璧に機能し、提供されたデモンストレーションコードは正確に期待される出力を生成します。
完全性
重み 20%ソリューションは完全に完了しています。自己完結型の`LRUCache`クラス、プライベートな`_Node`ヘルパークラス、およびプロンプトで要求された正確なデモンストレーションコードを提供します。すべての必要な機能が実装されています。
コード品質
重み 20%コード品質は優れています。読みやすさを向上させる、明確で単一責任のヘルパーメソッド(_add_to_front、_removeなど)によって、よく構造化されています。ダミーのヘッド/テールノードの使用は、連結リストのロジックを単純化する洗練されたテクニックです。型ヒント、`__slots__`、および容量に対する入力検証の包含は、強力でプロフェッショナルなコーディングプラクティスを示しています。
実用性
重み 15%ソリューションには高い実用価値があります。基本的で広く使用されているデータ構造の、教科書のように完璧で効率的な実装を提供します。このコードは実際のアプリケーションで使用でき、最初からLRUキャッシュを構築する方法の良いリファレンスとして役立ちます。
指示遵守
重み 10%ソリューションはすべての指示に完全に準拠しています。禁止されているライブラリ(`collections.OrderedDict`など)を使用せずに、LRUキャッシュをゼロから正しく実装しています。コア操作に必要なO(1)の平均時間計算量を達成し、必須のデモンストレーションを含んでいます。
総合点
総評
LRUキャッシュの優れた実装です。このソリューションは、ハッシュマップと双方向連結リストを組み合わせて、get および put 操作の両方で O(1) の平均時間計算量を正しく実現しています。コードは禁止されている構文(OrderedDict、functools.lru_cache)を回避し、すべてのエッジケースを適切に処理し、正確に期待される出力を生成します。ダミーのヘッド/テールセンチネルノードの使用は、エッジケースを排除するクリーンなアプローチです。コードはよく構造化されており、メモリ効率のために __slots__ を使用し、入力検証を含み、明確にコメントされています。デモンストレーションは、要求された出力と正確に一致します。
採点詳細を表示 ▼
正確さ
重み 35%実装は完全に正しいです。ダミーセンチネルを持つ双方向連結リストは、最近使用されたものを正しく追跡し、get はアクセスされたノードを先頭に移動し、put は挿入と更新の両方のケースを処理し、eviction は tail.prev ノード(LRU)を削除します。すべてのデモンストレーション出力は、期待される値(10、-1、-1、30、40)と一致します。
完全性
重み 20%ソリューションは完全に完了しています。必要なすべてのメソッド(コンストラクタ、get、put)、ヘルパーのプライベートメソッド、_Node クラス、入力検証、およびタスクで指定された完全なデモンストレーションコードを含む LRUCache クラスが含まれています。
コード品質
重み 20%コード品質は優れています。_Node で __slots__ を使用していることは、メモリ効率への配慮を示しています。プライベートヘルパーメソッド(_add_to_front、_remove、_move_to_front、_evict_lru)は、名前が適切で単一の目的を持っています。型ヒントが使用されています。コメントはセンチネルノードの設計を説明しています。コードはクリーンで読みやすいです。
実用性
重み 15%実装は非常に実用的です。意味のあるエラーメッセージを持つ入力検証が含まれており、パフォーマンスのために __slots__ を使用しており、設計は拡張可能です。唯一のマイナーな欠点は、スレッドセーフティを処理していないことですが、それはタスクによって要求されていませんでした。
指示遵守
重み 10%すべての指示が正確に従われています。OrderedDict または functools.lru_cache は使用されておらず、ハッシュマップ + 双方向連結リストを介して O(1) の複雑さが達成されており、基盤となるデータ構造は手動で実装され、タスクからの正確なデモンストレーションコードが正しい期待される出力コメントとともに含まれています。
総合点
総評
この回答は、ハッシュマップと双方向連結リストを使用したLRUキャッシュの、正しく、効率的で、自己完結型のPython実装を提供します。必要なO(1)操作を満たし、容量と追い出しを正しく処理し、期待される出力を印刷する要求されたデモンストレーションが含まれています。コードはクリーンで読みやすいです。マイナーな問題は、小さなスタイルポイント(例:mapという名前は組み込みをシャドウします、docstringがありません)に限定されますが、これらは正しさやパフォーマンスに影響しません。
採点詳細を表示 ▼
正確さ
重み 35%ハッシュマップ+双方向連結リストを使用してLRUを正しく実装しています。getとputはO(1)の平均時間で動作し、追い出しロジックは正しく、提供されたデモンストレーションは期待される出力を生成します。
完全性
重み 20%必要なすべての機能が含まれています:容量検証付きコンストラクタ、getとputのセマンティクス、容量を超えた場合のLRU追い出し、OrderedDictまたはfunctools.lru_cacheの使用なし、および要求されたデモンストレーションが含まれています。
コード品質
重み 20%コードはよく構造化され、明確で、リスト操作を簡素化するためにダミーのヘッド/テールを使用しています。メソッドは小さく、集中しています。マイナーなスタイルの問題:'map'という属性名は組み込みをシャドウし、docstringがありませんが、これらは正しさに影響しません。
実用性
重み 15%実装は実用的であり、実際のコードで使用する準備ができています:効率的で、安全(容量を検証)、メモリ効率(__slots__を使用)です。docstringや単体テストなどの小さな追加から恩恵を受けるでしょうが、機能的には完了しています。
指示遵守
重み 10%指示に正確に従っています:禁止されているライブラリを使用せず、必要なデータ構造を自分で実装し、O(1)操作を保証し、期待される印刷結果を含む正確なデモンストレーションを含んでいます。