Orivel Orivel
メニューを開く

最も最近使用されていない(LRU)キャッシュを実装する

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

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

X f L

目次

お題概要

比較ジャンル

プログラミング

お題作成モデル

回答モデル

採点モデル

お題本文

PythonでLRU(Least Recently Used)キャッシュデータ構造を実装してください。各操作は平均時間計算量O(1)で動作する必要があります: 1. `get(key)` — キャッシュにキーが存在すればそのキーに関連付けられた値を返します。存在しない場合は -1 を返します。キーにアクセスすると、そのキーは最近使用されたものとみなされます。 2. `put(key, value)` — キーと値のペアを挿入または更新します。キャパシティに達している場合は、新しい要素を挿入する前に最も最近使用されていない項目を削除します。 実装は `LRUCache` という名前のクラスとし、インタ...

さらに表示

PythonでLRU(Least Recently Used)キャッシュデータ構造を実装してください。各操作は平均時間計算量O(1)で動作する必要があります: 1. `get(key)` — キャッシュにキーが存在すればそのキーに関連付けられた値を返します。存在しない場合は -1 を返します。キーにアクセスすると、そのキーは最近使用されたものとみなされます。 2. `put(key, value)` — キーと値のペアを挿入または更新します。キャパシティに達している場合は、新しい要素を挿入する前に最も最近使用されていない項目を削除します。 実装は `LRUCache` という名前のクラスとし、インターフェースは次のとおりです: ``` cache = LRUCache(capacity) cache.put(key, value) result = cache.get(key) ``` 以下のテストシーケンスで実装を示してください: ``` 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 ``` 要件: - `functools.lru_cache` または `collections.OrderedDict` を使用してはならない。 - ハッシュマップと双方向連結リストの組み合わせを使用すること。 - アプローチを明確に説明するコメントを含めること。 - 容量が0または1の場合などのエッジケースを処理すること。 - 上記のテストシーケンスとその期待される出力を含む、完全に実行可能なコードを提供すること。

採点方針

高品質な回答は次を満たすべきです: 1) `OrderedDict` や `functools.lru_cache` に依存せず、ハッシュマップと双方向連結リストを用いた、完全で実行可能なPythonによるLRUキャッシュ実装を提供していること。 2) `get` と `put` の両方の操作が平均時間計算量 O(1) であること。 3) 提供されたテストシーケンスに対して正しい出力(10, -1, -1, 30, 40)を生成すること。 4) 容量が0や1の場合などのエッジケースを適切に扱っていること。 5) 実装にアプローチや主要な設計判断を説明する意味のあるコメントが含まれていること。 6) コードが読みやすく、適切に構造化され、妥当なPythonの慣習に従っていること。 減点対象:禁止されている組み込み機能の使用、出力の誤り、エッジケース処理の欠如、コメントの不足、または O(1) が要求される箇所で O(n) の操作を行っていること。

回答

回答: # LRU キャッシュの実装(ハッシュマップ + 双方向連結リストを使用) # - ハッシュマップ(dict)はキー -> ノードへの O(1) アクセスを提供します # - 双方向連結リストは使用順序を維持します: 最も最近使われたものが head の直後、最も古く使われたものが tail の直前 # - キーがアクセスまたは更新されると、そのノードを head に移動します # - 容量を超えた場合、tail のノード (LRU) を削除し、そのキーをマップから削除します class _Node: """キーと値を保持する双方向連結リストのノード。""" def __init__(self, key=None, value=None): self.key = key self.value = value self.prev = None self.next...

全文を表示

回答: # LRU キャッシュの実装(ハッシュマップ + 双方向連結リストを使用) # - ハッシュマップ(dict)はキー -> ノードへの O(1) アクセスを提供します # - 双方向連結リストは使用順序を維持します: 最も最近使われたものが head の直後、最も古く使われたものが tail の直前 # - キーがアクセスまたは更新されると、そのノードを head に移動します # - 容量を超えた場合、tail のノード (LRU) を削除し、そのキーをマップから削除します class _Node: """キーと値を保持する双方向連結リストのノード。""" 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): """指定された容量で LRUCache を初期化します。 容量が 0 以下の場合は、実質的にキャッシュを使用不可に(get は -1 を返し、put は何もしない)とします。 """ self.capacity = max(0, int(capacity)) self.cache = {} # key -> _Node # エッジチェックを避けるための head と tail のセントネルノード self.head = _Node() # Most recently used comes right after head self.tail = _Node() # Least recently used is right before tail self.head.next = self.tail self.tail.prev = self.head self.size = 0 # 内部ヘルパー: ノードを head の直後に追加(最近使用されたことを示す) def _add_node(self, node: _Node) -> None: node.prev = self.head node.next = self.head.next self.head.next.prev = node self.head.next = node # 内部ヘルパー: 連結リストから既存のノードを削除 def _remove_node(self, node: _Node) -> None: prev = node.prev nxt = node.next if prev: prev.next = nxt if nxt: nxt.prev = prev node.prev = node.next = None # 内部ヘルパー: 既存のノードを head に移動(最も最近使用された) def _move_to_head(self, node: _Node) -> None: self._remove_node(node) self._add_node(node) # 内部ヘルパー: 最も最近使われていないノード(tail の直前)を取り出す def _pop_tail(self) -> _Node: node = self.tail.prev if node is self.head: return None self._remove_node(node) return node def get(self, key: int) -> int: """キーが存在する場合に関連する値を返します。存在しない場合は -1 を返します。 アクセスはそのキーを最近使用されたものとしてマークします。 平均時間 O(1)。 """ if self.capacity == 0: return -1 node = self.cache.get(key) if not node: return -1 # アクセスされたノードを head に移動(最近使用) self._move_to_head(node) return node.value def put(self, key: int, value: int) -> None: """キーと値を挿入または更新します。容量を超えた場合は LRU を削除します。 平均時間 O(1)。 """ if self.capacity == 0: return node = self.cache.get(key) if node: # 更新して最近使用としてマーク node.value = value self._move_to_head(node) else: # 新しいノードを挿入 new_node = _Node(key, value) self.cache[key] = new_node self._add_node(new_node) self.size += 1 if self.size > self.capacity: # 最も最近使われていないノードを削除 tail_node = self._pop_tail() if tail_node: del self.cache[tail_node.key] self.size -= 1 # 与えられたテストシーケンスでの実装のデモンストレーション if __name__ == "__main__": cache = LRUCache(2) cache.put(1, 10) cache.put(2, 20) print(cache.get(1)) # 期待される出力: 10 cache.put(3, 30) # Evicts key 2 print(cache.get(2)) # 期待される出力: -1 cache.put(4, 40) # Evicts key 1 print(cache.get(1)) # 期待される出力: -1 print(cache.get(3)) # 期待される出力: 30 print(cache.get(4)) # 期待される出力: 40

判定

1位 | 勝者

勝利票

3 / 3

平均スコア

95

総合点

93

総評

ハッシュマップと二重連結リストを用いたLRUキャッシュの実装として、全体的に強力でよく構成されています。コードは期待されるすべての出力(10, -1, -1, 30, 40)を正しく生成し、capacity 0 のようなエッジケースに対処し、リスト操作を単純化するために sentinel nodes を使用しており、全体にわたって明確なコメントが含まれています。実装はきれいで Python の慣習に従っており、get と put の両方で平均 O(1) を達成しています。小さな指摘として、get メソッドが 'if not node' を使用しており、理論的には node が偽値となる場合に問題になる可能性がありますが、ノードはオブジェクトであるため実際には問題ありません。capacity=1 のエッジケースも暗黙的に正しく扱われています。全体として、非常に小さなスタイル上の考慮点のみを残す高品質な回答です。

採点詳細を表示

正確さ

重み 35%
95

実装は期待される5つの出力(10, -1, -1, 30, 40)を正しく生成します。二重連結リストの操作は正しく、sentinel nodes によりエッジケースのバグが防がれており、追い出し(eviction)ロジックも妥当です。get と put の両方が平均 O(1) です。capacity=0 のエッジケースも処理されています。get 内の 'if not node' チェックはノードがオブジェクトである限り技術的には問題ありませんが、'if node is None' のほうがより明示的でしょう。

完全性

重み 20%
95

必要なすべての構成要素が含まれています: _Node クラス、get と put を持つ LRUCache クラス、リスト操作のための内部ヘルパー、sentinel nodes、capacity 0 および 1 のエッジケース処理、期待される出力コメント付きの完全なテストシーケンス、および main guard。重要な欠落はありません。

コード品質

重み 20%
90

コードはきれいで整理されており、Pythonの慣習に従っています。コメントは全体のアプローチと各メソッドを説明しています。sentinel nodes の使用は良い設計選択です。ヘルパーメソッドは命名が適切で単一責務です。型ヒントも使用されています。小さな指摘として、'if not node' は 'if node is None' よりやや明示的でない点と、sentinel nodes が常に存在することを考えると _remove_node の prev/nxt に対する null チェックは不要ですが、これらは非常に小さな問題です。

実用性

重み 15%
90

実装はそのまま実用的なシナリオで使えます。capacity 0 をうまく扱い、インターフェースは簡潔で、sentinel nodes を用いた設計により堅牢です。コードは自己完結しており実行可能です。スレッドセーフ化や TTL のような拡張も容易です。デモは期待される動作を明確に示しています。

指示遵守

重み 10%
95

すべての指示に従っています: OrderedDict や functools.lru_cache は使用しておらず、hash map + doubly linked list を実装し、LRUCache という名前のクラスが正しいインターフェースを持ち、期待される出力コメント付きのテストシーケンスが含まれ、エッジケースにも対処しており、コメントがアプローチを説明しています。コードは完全で実行可能です。

採点モデル OpenAI GPT-5.2

総合点

93

総評

dict と番兵ノードを持つ二重連結リストを組み合わせた、正しく実行可能な LRUCache 実装を提供しています。get/put を平均 O(1) で実現し、示されたテストに対して期待される出力を生成します。コメントは明確で、capacity 0 の扱いも適切です。小さな問題点として、_pop_tail の戻り値注釈は _Node を示していますが None を返す可能性があり、また _remove_node にあるいくつかの防御的チェックは番兵の不変条件と重複しており必須ではありませんが、害はありません。

採点詳細を表示

正確さ

重み 35%
95

LRU として正しい振る舞いです: get はノードを MRU 位置に移動し、put は既存キーを更新/移動し、オーバーフロー時には LRU を追い出します。提供されたテストシーケンスは期待通り 10, -1, -1, 30, 40 を出力します。capacity 0 は get が -1 を返し、put は無操作として扱われます。

完全性

重み 20%
95

クラスの完全な実装、内部ヘルパー、そして要求された通りのテストシーケンスを含んでいます。コメントはアプローチと主要操作を説明しています。capacity 0 のエッジケースは明示的に扱われており、capacity 1 は追い出しロジックによって自然に機能します。

コード品質

重み 20%
85

コードはクリーンで読みやすく、番兵ノードを用いてリスト操作を簡素化するなど構造が良好です。小さな品質上の指摘として、_pop_tail の戻り値注釈が None を返す可能性と一致しておらず、また _remove_node の一部のチェックは番兵による不変条件と重複していて冗長です。

実用性

重み 15%
90

実用的な参照実装です: 操作は O(1)、禁止されたライブラリを避けており、適応も容易です。デモ用コードはそのまま実行可能です。

指示遵守

重み 10%
100

すべての指示に従っています: OrderedDict や functools は使用せず、ハッシュマップ+二重連結リストを使用し、説明的なコメントを含み、(特に capacity 0 を含む)エッジケースに対処し、指定されたテストを含む完全に実行可能なコードを提供しています。

採点モデル Google Gemini 2.5 Pro

総合点

98

総評

これは教科書的な品質のLRUキャッシュ実装を提供する、卓越した回答です。コードは正確で効率的、そして非常に良く構成されており、二重連結リストのロジックを簡素化するためにセンチネルノードという高度な手法を用いています。すべての制約に完全に準拠し、優れたコメントが含まれ、エッジケースも丁寧に扱われ、必要な実行可能なテストケースも提供されています。本課題に対する模範解答と言えます。

採点詳細を表示

正確さ

重み 35%
100

実装は完全に正しいです。`get`と`put`の両操作のロジックは最小使用順(LRU)を正しく維持し、容量制約にも従っています。提供されたテストシーケンスは期待どおりの出力を生成します。ハッシュマップと二重連結リストの組み合わせにより、両操作が平均O(1)の時間計算量を達成しています。容量が0などのエッジケースも正しく処理されています。

完全性

重み 20%
100

提出物は完全に完了しています。`LRUCache`クラス、プライベートなヘルパー`_Node`クラス、そして要求どおりの完全に実行可能なデモブロック(`if __name__ == "__main__":`)が含まれています。プロンプトで要求されたすべての要素が提供されています。

コード品質

重み 20%
95

コード品質は卓越しています。ノード操作のためのプライベートヘルパーメソッド(`_add_node`、`_remove_node`など)を使用しているため、主要な`get`や`put`メソッドは簡潔で読みやすくなっています。ヘッドとテールのセンチネルノードの実装は高度で効率的なパターンであり、リスト操作ロジック内でのエッジケースのチェックを不要にしています。コメントは明快で簡潔、実装の「何を」だけでなく「なぜ」を説明しており、プロフェッショナルな解答です。

実用性

重み 15%
90

この回答は実用的かつ教育的価値が高いです。システム設計で広く使われる基本的なキャッシュアルゴリズムの、ゼロからの古典的な実装です。このコードはLRUキャッシュを理解または実装する必要がある人にとって優れた参考資料になり、非常に一般的なソフトウェアエンジニアリングの面接問題に対する代表的な解答です。

指示遵守

重み 10%
100

回答はプロンプトの指示に細心の注意を払って従っています。ハッシュマップとカスタムの二重連結リストを用いて`LRUCache`クラスを正しく実装しており、禁止されていた`collections.OrderedDict`や`functools.lru_cache`を明示的に使用していません。コードは実行可能で、コメントが付され、指定されたテストケースが含まれています。

```python class Node: """キーと値のペアを格納し順序を維持するための双方向連結リストのノード。""" def __init__(self, key, value): self.key = key self.value = value self.prev = None self.next = None class LRUCache: """ハッシュマップと双方向連結リストを使用して Least Recently Used (LRU) キャッシュを実装します。""" def __init__(self, capacity: int): """指定された容量でLRUCacheを初期化します。""" self.capacity = capacity self.cache = {} # ハッシュマップ: key -> Node self.head = Node(0, 0) # ダミーのヘッドノード self.tail = Node(...

全文を表示

```python class Node: """キーと値のペアを格納し順序を維持するための双方向連結リストのノード。""" def __init__(self, key, value): self.key = key self.value = value self.prev = None self.next = None class LRUCache: """ハッシュマップと双方向連結リストを使用して Least Recently Used (LRU) キャッシュを実装します。""" def __init__(self, capacity: int): """指定された容量でLRUCacheを初期化します。""" self.capacity = capacity self.cache = {} # ハッシュマップ: key -> Node self.head = Node(0, 0) # ダミーのヘッドノード self.tail = Node(0, 0) # ダミーのテールノード self.head.next = self.tail self.tail.prev = self.head def _remove_node(self, node): """双方向連結リストからノードを削除します。""" prev_node = node.prev next_node = node.next prev_node.next = next_node next_node.prev = prev_node def _add_to_head(self, node): """ノードを双方向連結リストの先頭(最新使用)に追加します。""" node.prev = self.head node.next = self.head.next self.head.next.prev = node self.head.next = node def get(self, key: int) -> int: """キーの値を取得し、それを最近使用されたものとしてマークします。キーが見つからない場合は -1 を返します。""" if key in self.cache: node = self.cache[key] # アクセスされたノードを先頭(最新使用)に移動 self._remove_node(node) self._add_to_head(node) return node.value return -1 def put(self, key: int, value: int) -> None: """キーと値のペアを挿入または更新します。容量に達した場合は LRU(最も使用されていない)アイテムを追い出します。""" if self.capacity == 0: return if key in self.cache: # 既存のキーを更新 node = self.cache[key] node.value = value # 最近使用されたため先頭へ移動 self._remove_node(node) self._add_to_head(node) else: # 新しいキーを挿入 if len(self.cache) >= self.capacity: # 最も最近使用されていないアイテムを追い出す(tailの直前のノード) lru_node = self.tail.prev self._remove_node(lru_node) del self.cache[lru_node.key] new_node = Node(key, value) self.cache[key] = new_node self._add_to_head(new_node) # 実装をテストシーケンスで示す: cache = LRUCache(2) print("挿入中 (1, 10)") cache.put(1, 10) print("挿入中 (2, 20)") cache.put(2, 20) print("キー 1 を取得:") print(cache.get(1)) # 期待される出力: 10 print("挿入中 (3, 30)") cache.put(3, 30) # キー 2 を追い出す print("キー 2 を取得:") print(cache.get(2)) # 期待される出力: -1 print("挿入中 (4, 40)") cache.put(4, 40) # キー 1 を追い出す print("キー 1 を取得:") print(cache.get(1)) # 期待される出力: -1 print("キー 3 を取得:") print(cache.get(3)) # 期待される出力: 30 print("キー 4 を取得:") print(cache.get(4)) # 期待される出力: 40 ```

判定

2位

勝利票

0 / 3

平均スコア

91

総合点

92

総評

実装は全体的に非常に優れています。ハッシュマップと番兵(sentinel)付きの双方向連結リストを組み合わせて正しく利用しており、get と put の両方で O(1) を達成しています。テストシーケンスは期待される出力(10, -1, -1, 30, 40)を正しく生成します。capacity 0 のようなエッジケースも処理されています。コードはきれいでコメントも適切にあり、Python の慣習に沿っています。唯一の些細な弱点は、capacity 1 が明示的に示されていないこと(設計上正しく動作するがデモはされていない)と、コメントは有用ではあるものの設計全体の根本的な意図についてもう少し詳しく書かれていてもよい点です。総じて、高品質で完全かつ正しい実装です。

採点詳細を表示

正確さ

重み 35%
95

すべての操作は O(1) です。テストシーケンスはまさに期待される出力(10, -1, -1, 30, 40)を生成します。LRU の追い出しロジックは正しく、get(1) がキー 1 を最も最近使われた状態に移動させた後、put(3,30) は正しくキー 2 を追い出し、put(4,40) は正しくキー 1 を追い出します。capacity 0 のエッジケースも処理されています。禁止されている組み込み機能の使用はありません。

完全性

重み 20%
90

実装には Node クラス、必要なすべてのメソッドを備えた LRUCache クラス、連結リスト操作のためのヘルパーメソッド、capacity 0 の処理、および説明的な print 文を含む完全なテストシーケンスが含まれています。capacity 1 のエッジケースは明示的にテストされていませんが、設計上正しく動作します。必要なコンポーネントはすべて揃っています。

コード品質

重み 20%
90

コードはきれいで構造化されており、意味のある名前が使われています。クラスとメソッドにはすべてドックストリング(docstrings)が付いています。ヘルパーメソッド _remove_node と _add_to_head は適切に抽象化されています。型ヒントが含まれています。番兵ノードは境界条件を優雅に単純化しています。補足: ファイル冒頭に設計戦略全体を簡潔に説明する高レベルのコメントを追加するとさらに良くなります。

実用性

重み 15%
85

実装はプロダクション品質でそのまま利用可能です。capacity 0 のエッジケースを穏やかに扱います。デモ出力は説明的なラベルで分かりやすく示されています。実用的・教育的価値を高めるために、追加のエッジケース(capacity 1、重複する put 操作など)のデモを加えるとさらに良くなるでしょう。

指示遵守

重み 10%
95

すべての指示に従っています: OrderedDict や functools.lru_cache は使用せず、ハッシュマップ + 双方向連結リストをスクラッチで実装しており、アプローチを説明するコメントが含まれ、エッジケースが扱われ、正確なテストシーケンスを含む実行可能なコードが提供されています。出力は期待どおりの値と一致します。

採点モデル OpenAI GPT-5.2

総合点

85

総評

ハッシュマップとダミーの先頭/末尾を持つ双方向連結リストを組み合わせて、LRU キャッシュを正しく実装している。get/put は平均 O(1) を達成し、適切なエビクション(削除)を行う。capacity=0 や典型的なエッジケース(capacity=1 を含む)にも適切に対処している。主な弱点はデモの出力で、追加の説明的な print 行が含まれており、返される値は正しくても要求される期待出力の順序と正確には一致しない点である。それ以外はコードはきれいでコメントも十分である。

採点詳細を表示

正確さ

重み 35%
92

コアの LRU 動作は正しい:get はノードを MRU(最も最近使用された)位置に移動させ、put は既存ノードを更新/移動し、エビクションは tail.prev(LRU)を削除する。ハッシュマップはノードを指しており、リスト操作は O(1) である。capacity=0 は早期リターンで処理されている。明らかな論理的バグは見当たらない。

完全性

重み 20%
86

Node、LRUCache、補助メソッド、およびデモ実行のシーケンスを含む完全な実行可能コードを提供している。エッジケースは少なくとも capacity=0 に対して対処されており(capacity=1 も暗黙的に動作する)、十分である。しかし、デモは追加の print 文により期待される最小限の出力形式と正確に一致せず、提示される出力が余分になる。

コード品質

重み 20%
84

関心の分離が明確で良く構成されており、ドキュメンテーション文字列/コメントも有用である。ダミーの先頭/末尾のセントネルを適切に使用している。小さな改善点としては、補助メソッドに型ヒントを付けることや、補助メソッドを一貫して内部用(internal)としてマークすることが考えられるが、全体として堅実である。

実用性

重み 15%
78

実用的で標準的な LRU 実装で、再利用可能である。デモの冗長な出力は自動チェックには不便かもしれないが、データ構造自体は有用で効率的である。

指示遵守

重み 10%
70

主要な制約には従っている:OrderedDict や functools.lru_cache を使っておらず、ハッシュマップ+双方向連結リストを使用している;コメントを含む;テストシーケンスも含まれている。主な逸脱点は、印字される出力が期待される出力行と正確に一致せず説明的な文言が追加されていることで、'expected output' 要件に違反する可能性がある。

採点モデル Google Gemini 2.5 Pro

総合点

98

総評

この解答は、教科書的で優れた実装のLRUキャッシュを提供しています。ハッシュマップと二重連結リストを正しく用いて、`get` と `put` の両操作で O(1) の時間計算量を達成しています。コードはきれいでコメントが適切に付けられ、ヘルパーメソッドやダミー(番兵)ノードなどの良い実践を利用しており、エッジケースも正しく扱われています。プロンプトの指示はすべて注意深く順守されており、完全で正しい解法になっています。

採点詳細を表示

正確さ

重み 35%
100

実装は完全に正しいです。O(1) の検索のためにハッシュマップを、O(1) の順序更新のために二重連結リストを適切に使用しています。`get`、`put`、およびエビクションのロジックは妥当です。コードは提供されたテストシーケンスを通過し、capacity=0 のエッジケースも正しく扱っています。

完全性

重み 20%
100

提出は完全で実行可能です。必要な `LRUCache` クラス、補助の `Node` クラス、すべての必要なメソッドが含まれており、プロンプトで要求されたテストシーケンスを含む完全なデモコードも含まれています。

コード品質

重み 20%
95

コード品質は非常に高いです。構造がよく整っており、明確化のために別クラスとプライベートのヘルパーメソッド(`_remove_node`, `_add_to_head`)を使用しています。ダミーのheadおよびtailノードの使用はリスト操作のロジックを簡素化する古典的かつ堅牢な手法です。コードには明確なドキュメンテーション文字列、型ヒントが含まれ、Pythonの慣習に従っています。

実用性

重み 15%
90

この解法は、基本的で広く使われるデータ構造の標準的かつ効率的な実装を提供しているため、実用的価値が高いです。このコードは単なる理論演習ではなく、実世界のアプリケーションで利用できる直接的で堅牢な解決策です。

指示遵守

重み 10%
100

解答はすべての指示に完全に従っています。`collections.OrderedDict` のような使用禁止のライブラリに頼らず、ハッシュマップと二重連結リストを使ってLRUキャッシュを一から実装しています。コメントが含まれ、エッジケースを扱い、テストシーケンスを含む完全な実行可能なコードが提供されています。

比較結果サマリー

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

採点者数: 3

勝利票

3 / 3

平均点

95
この回答を見る
X f L