回答A: OpenAI GPT-5.2
class LRUCache: class _Node: __slots__ = ("key", "val", "prev", "next") def __init__(self, key=0, val=0): self.key = key self.val = val self.prev = None self.next = None def __init__(self, capacity: int): if capacity <= 0: raise ValueError("capacity は正の整数でなければなりません") self.capacity = capacity self.map = {} # key -> _Node # 番兵付き双方向連結リスト: # head <-> ... <-> tail # 最も最近使用されたものは head の直後。 # 最も長く使用されていないものは tail の直前。...
全文を表示 ▼
class LRUCache: class _Node: __slots__ = ("key", "val", "prev", "next") def __init__(self, key=0, val=0): self.key = key self.val = val self.prev = None self.next = None def __init__(self, capacity: int): if capacity <= 0: raise ValueError("capacity は正の整数でなければなりません") self.capacity = capacity self.map = {} # key -> _Node # 番兵付き双方向連結リスト: # head <-> ... <-> tail # 最も最近使用されたものは head の直後。 # 最も長く使用されていないものは tail の直前。 self.head = self._Node() self.tail = self._Node() self.head.next = self.tail self.tail.prev = self.head def _remove(self, node: _Node) -> None: p, n = node.prev, node.next p.next = n n.prev = p def _add_to_front(self, node: _Node) -> None: # head の直後に挿入する(最も最近使用されたものとしてマークする) first = self.head.next node.prev = self.head node.next = first self.head.next = node first.prev = node def _move_to_front(self, node: _Node) -> None: self._remove(node) self._add_to_front(node) def _evict_lru(self) -> None: # tail の直前のノードを削除する 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.val def put(self, key: int, value: int) -> None: node = self.map.get(key) if node is not None: node.val = value self._move_to_front(node) return new_node = self._Node(key, value) self.map[key] = new_node self._add_to_front(new_node) if len(self.map) > self.capacity: self._evict_lru() # 正しさのデモンストレーション cache = LRUCache(2) cache.put(1, 10) cache.put(2, 20) print(cache.get(1)) # 期待される出力: 10 cache.put(3, 30) # キー 2 を削除する print(cache.get(2)) # 期待される出力: -1 cache.put(4, 40) # キー 1 を削除する print(cache.get(1)) # 期待される出力: -1 print(cache.get(3)) # 期待される出力: 30 print(cache.get(4)) # 期待される出力: 40 # 出力: # 10 # -1 # -1 # 30 # 40 # O(1) の簡単な説明: # - 辞書(ハッシュマップ)がキーをノードに対応付けることで、get/put の平均ルックアップは O(1) になる。 # - 双方向連結リストが使用順序を維持する。ノードを先頭へ移動すること、 # 新しいノードを挿入すること、LRU ノードを削除することはすべて O(1) のポインタ更新である。 # これらを組み合わせることで、get と put の両方で平均 O(1) 時間が得られる。
判定
勝利票
2 / 3
平均スコア
総合点
総評
LRUキャッシュの優れた実装であり、すべての要件を完全に満たしています。このソリューションは、ハッシュマップとセンチネルノードを備えた双方向連結リストのよく設計された組み合わせを使用しており、get と put の両方の操作で O(1) の時間計算量を達成しています。コードはクリーンで構造化されており、既存のキーの更新や適切な追い出しを含むすべてのエッジケースを正しく処理しています。デモンストレーションは、期待される正確な出力(10、-1、-1、30、40)を生成し、O(1) の複雑さの説明は正確かつ明確です。Nodeクラスでの__slots__の使用は、メモリ効率への配慮を示しています。軽微な観察点:容量が正でない場合のValueErrorは、防御的なタッチとしては良いですが、明示的に要求されたものではありませんでした。ハッシュマップの検索が平均 O(1) である理由について、説明がもう少し詳細であってもよかったかもしれません。全体として、これは本番環境品質の実装です。
採点詳細を表示 ▼
正確さ
重み 35%実装は正しく、期待される正確な出力シーケンス(10、-1、-1、30、40)を生成します。すべてのコア操作は正しく機能します。get は正しい値を返し、アイテムを最近使用されたとマークし、put は新しいアイテムを正しく挿入し、既存のアイテムを更新し、eviction は容量を超えたときに最も最近使用されていないアイテムを正しく削除します。センチネルを備えた双方向連結リストは、更新順序を正しく維持します。既存のキーの更新などのエッジ ケースは正しく処理されます。唯一の軽微な減点は、正でない容量に対する ValueError が、良い習慣ではありますが、タスクによって明示的に要求されたものではなかったことです。
完全性
重み 20%回答は完全に包括的です。必要なすべてのメソッド (__init__, get, put) を備えた LRUCache クラス全体が含まれており、指定された正確なテスト シーケンスを含む完全な動作デモンストレーションが含まれており、すべての期待される出力を生成し、O(1) の時間計算量の明確な説明で締めくくられています。実装には、ソリューションに必要でよく整理されたヘルパー メソッド (_remove, _add_to_front, _move_to_front, _evict_lru) が含まれています。欠けているものや不完全なものはありません。
コード品質
重み 20%コードは優れた構造と可読性を備えた高品質です。__slots__ を備えたネストされた _Node クラスの使用は、メモリ効率への意識を示しています。メソッド名は説明的であり、Python の慣例に従っています。センチネル ノードを備えた双方向連結リストの実装はエレガントであり、null チェックのエッジ ケースを回避します。コメントは、データ構造のレイアウトと各メソッドの目的を明確に説明しています。コードは、関心の論理的な分離により、うまく整理されています。軽微な点:最後に説明コメントがハッシュマップの平均ケースの複雑さについてもう少し詳細であってもよかったかもしれませんが、これは非常に軽微な点です。
実用性
重み 15%この実装は、参照ソリューションとして高い実用価値があります。適切なデータ構造(ハッシュマップ + 双方向連結リスト)、エッジ ケースを排除するための適切なセンチネル ノードの使用、ヘルパー メソッドのクリーンな分離など、LRU キャッシュを実装するためのベスト プラクティスを示しています。コードは本番環境に対応しており、実際のアプリケーションで直接使用できます。防御的な ValueError チェックは、堅牢性を高めます。この実装は、特定の時間計算量要件を達成するためにデータ構造を組み合わせる方法を理解するための優れた教育的例として役立ちます。
指示遵守
重み 10%回答はすべての指示に正確に従っています。正確に 'LRUCache' という名前の完全なクラスと、正しいシグネチャを持つ 3 つの必要なメソッドを提供します。get と put の両方が、適切なデータ構造を使用して O(1) の平均時間計算量を達成します。デモンストレーションシーケンスは、正しい出力で正確に指定どおりに実行されます。O(1) の複雑さの説明が含まれており、正確です。ジャッジメントポリシーからのすべての要件が満たされています。正しい出力、適切なエッジ ケース処理(既存のキーの更新)、O(1) データ構造の使用、および完全な実行可能なコードです。
総合点
総評
提供されたLRUCache実装は、構造が非常に優れており、正確で、かつ非常に効率的です。ハッシュマップと、センチネルノードを備えたカスタム双方向連結リストを組み合わせて使用し、`get`と`put`操作の両方で要求されるO(1)の平均時間計算量を正しく達成しています。コードは細部にまで配慮されており、ノードクラスの`__slots__`の使用や、既存キーの更新、最も使用頻度の低い項目の追い出しなどの様々なキャッシュ操作の堅牢な処理が含まれています。デモンストレーション出力は完全に正しく、時間計算量の説明も明確かつ正確です。
採点詳細を表示 ▼
正確さ
重み 35%実装は完全に正しいです。キーの取得、更新、挿入、および最も使用頻度の低い項目の追い出しを含む、すべてのLRUキャッシュロジックは期待どおりに機能します。提供されたデモンストレーションシーケンスは、正確に正しい出力を生成します。
完全性
重み 20%回答は、必要なすべてのメソッド(`__init__`, `get`, `put`)を備えた完全な`LRUCache`クラス、その使用方法の明確なデモンストレーション、およびその時間計算量の簡潔な説明を提供しています。要求されたものに不足はありませんでした。
コード品質
重み 20%コード品質は優れています。連結リスト操作のためのヘルパーメソッド、よりクリーンなリスト操作のためのセンチネルノードの使用、メモリ効率のための`_Node`クラスの`__slots__`の包含など、よく整理されています。変数名は記述的であり、全体的な構造は非常に読みやすく、保守しやすいです。
実用性
重み 15%この実装は非常に実用的で、本番環境での使用に適しています。LRUキャッシュに必要なデータ構造に対する深い理解を示しており、堅牢で効率的なソリューションを提供しています。明示的なカスタム双方向連結リスト実装は、基盤となるメカニズムに対する完全な制御と洞察を提供するため、`collections.OrderedDict`が適さない場合や、より深い理解が必要なシナリオで価値があります。
指示遵守
重み 10%すべての指示が正確に守られました。クラス名は`LRUCache`であり、メソッドは指定されたシグネチャに準拠し、O(1)の平均時間計算量が達成され説明されており、容量検証が存在し、デモンストレーションシーケンスとその出力は要件に正確に一致しています。
総合点
総評
LRUキャッシュの実装は良好:動作は正しく、ハッシュマップと双方向連結リストを使用したO(1)操作は効率的であり、提供されたデモンストレーションは期待通りの出力を生成します。コードは明確で実行可能ですが、スタイルや注釈の改善点(例:型アノテーションの追加やdocstring)はありますが、正確性やパフォーマンスに影響を与えるものではありません。
採点詳細を表示 ▼
正確さ
重み 35%実装は正確です:getとputは指定通りに動作し、更新はアイテムをMRUに移動させ、容量を超えた場合はevictionがLRUを削除し、デモンストレーションは期待されるシーケンス(10, -1, -1, 30, 40)を印刷します。既存キーの更新やゼロ/負の容量(ValueError)などのエッジケースも処理されています。
完全性
重み 20%ソリューションには、__init__、get、putを備えた完全で実行可能なLRUCacheクラス、必要な操作シーケンスのデモンストレーション、およびO(1)複雑性に関する簡潔な説明が含まれています。プロンプトで要求されたすべての動作が存在します。
コード品質
重み 20%コードはクリーンでよく構造化されています:内部Nodeクラスには__slots__、センチネルのhead/tailノード、リスト操作のための明確なヘルパーメソッドがあります。型アノテーション(例:self.map用)やパブリックメソッドのdocstring/コメントの追加といった軽微なスタイル改善は可能ですが、これらは正確性には影響しません。
実用性
重み 15%実装は効率的で実用的です:O(1)の平均操作、低オーバーヘッドのノード設計、明確なセマンティクスを備えています。本番環境での使用には、スレッドセーフの考慮事項や、より豊富な型指定/ドキュメントを追加することも考えられますが、コア機能は堅牢です。
指示遵守
重み 10%すべての指示に従いました:LRUCacheという名前のクラスが提供され、必要なメソッドが正しいシグネチャで実装され、デモンストレーションが含まれ、O(1)複雑性に関する説明も正確です。