回答A: OpenAI GPT-5.4
回答: def resolve_dependencies(packages: dict[str, list[str]]) -> list[str]: """ 与えられたパッケージ依存グラフに対して、有効なインストール順序を返します。 ルール: - すべての依存関係は、それに依存するパッケージより前に出現する必要があります。 - 入力に依存関係が存在しない場合は ValueError を発生させます。 - 循環依存が検出された場合は ValueError を発生させます。 """ if not isinstance(packages, dict): raise ValueError("packages はパッケージ名を依存関係リストにマッピングする辞書でなければなりません") visited = set() # 完全に処理済みのパッケージ visiting = set()...
全文を表示 ▼
回答: def resolve_dependencies(packages: dict[str, list[str]]) -> list[str]: """ 与えられたパッケージ依存グラフに対して、有効なインストール順序を返します。 ルール: - すべての依存関係は、それに依存するパッケージより前に出現する必要があります。 - 入力に依存関係が存在しない場合は ValueError を発生させます。 - 循環依存が検出された場合は ValueError を発生させます。 """ if not isinstance(packages, dict): raise ValueError("packages はパッケージ名を依存関係リストにマッピングする辞書でなければなりません") visited = set() # 完全に処理済みのパッケージ visiting = set() # 現在 DFS スタックにあるパッケージ order = [] path = [] def dfs(package: str) -> None: if package in visited: return if package in visiting: cycle_start = path.index(package) cycle = path[cycle_start:] + [package] raise ValueError( "循環依存が検出されました: " + " -> ".join(cycle) ) if package not in packages: raise ValueError(f"依存関係が見つかりません: '{package}' は定義されていないパッケージです") visiting.add(package) path.append(package) dependencies = packages[package] if not isinstance(dependencies, list): raise ValueError(f"パッケージ '{package}' の依存関係はリストでなければなりません") for dep in dependencies: if dep not in packages: raise ValueError( f"依存関係が見つかりません: パッケージ '{package}' は未定義のパッケージ '{dep}' に依存しています" ) dfs(dep) path.pop() visiting.remove(package) visited.add(package) order.append(package) for package in packages: dfs(package) return order
判定
勝利票
1 / 3
平均スコア
総合点
総評
明示的な循環依存の検出(再帰スタックセット経由)と不足している依存関係(dfsに入る際と依存関係を反復する際の双方)の検出を備えた、正しいDFSベースのトポロジカルソートを実装しています。切断されたコンポーネント全体で有効な依存関係優先順序を生成し、空の入力を処理します。エラーメッセージは説明的であり、サイクルパスが含まれています。わずかな欠点として、いくつかの冗長なチェック(dfs内のパッケージが存在しないことは、以前の依存関係チェックが与えられているため到達不可能)と、要件を超えたわずかに余分な入力検証がありますが、これらは正しさを損なうものではありません。
採点詳細を表示 ▼
正確さ
重み 35%再帰スタックによるサイクル検出を備えた正しいDFSトポロジカル順序付け。サイクルおよび入力に存在しない依存関係に対して正しくValueErrorを発生させます。依存関係が先行する依存関係の前にあるという不変条件を維持します。
完全性
重み 20%指定されたすべての動作(有効な順序、サイクルエラー、依存関係不足エラー)をカバーし、空のグラフや切断されたグラフでも機能します。説明的なメッセージが含まれています。
コード品質
重み 20%ドキュメンテーション文字列と明確な変数名により、読みやすく構造化されています。わずかな冗長性(dfs内のパッケージ不足チェックと依存関係チェック)と、余分なパス/インデックス処理がありますが、許容範囲内です。
実用性
重み 15%(依存関係リストの型など)防御的なチェックと、サイクルチェーンを含む詳細なエラーメッセージにより、実際の使用においてより実用的です。
指示遵守
重み 10%シグネチャの意図を満たし、外部ライブラリを使用せず、両方の必須エラーケースに対して説明的なメッセージとともにValueErrorを発生させ、有効な順序を返します。
総合点
総評
回答Aは、適切なエラー処理を備えた正しいDFSベースのトポロジカルソートを実装しています。循環依存と不足している依存関係を正しく検出します。ただし、微妙なバグがあります。パッケージにない不足している依存関係のチェックは`dfs`の開始時に行われますが、`if package not in packages`のチェックは`visiting`チェックの前に行われるため、不足しているパッケージが何らかの方法で到達された場合、正しく例外が発生します。さらに重要なのは、ループ内の`if dep not in packages`のチェックは、`dfs`の先頭にあるチェックと重複していますが、両方存在することです。コードには、堅牢性を高める追加の検証(isinstanceチェック)も含まれています。サイクル検出のためのパス追跡は正しいです。コードはクリーンで、適切に文書化されています。
採点詳細を表示 ▼
正確さ
重み 35%回答Aは、DFSによるトポロジカルソートを正しく実装し、パス追跡で循環依存を検出し、不足している依存関係に対してValueErrorを発生させます。ロジックは堅牢で、3つの例すべてを正しく処理します。不足している依存関係のチェックに軽微な冗長性がありますが、機能的なバグはありません。
完全性
重み 20%回答Aは、必要なすべてのケース(有効な解決、循環依存、不足している依存関係)を処理します。また、入力型の追加検証も行います。ドキュメンテーション文字列はルールを明確に説明しています。
コード品質
重み 20%回答Aは読みやすく、コメントも適切です。ただし、いくつかの冗長性があります。不足している依存関係は、dfsの開始時(パッケージ自体に対して)とループ内(依存関係に対して)の両方でチェックされます。`visited`と`visiting`セットの両方と`path`リストの使用は、必要以上に少し複雑です。
実用性
重み 15%回答Aは、明確なエラーメッセージをコンテキスト付きで提供します(どのパッケージがどの未定義パッケージに依存しているか、および完全なサイクルパス)。追加のisinstance検証は、実際の使用に対するある程度の堅牢性を追加します。
指示遵守
重み 10%回答Aは、すべての指示に従っています。正しい関数シグネチャ、循環依存と不足している依存関係の両方に対するValueErrorの発生、外部ライブラリのインポートなし、および有効なインストール順序の返却です。
総合点
総評
回答Aは、標準的なDFSベースのトポロジカルソートを使用した、正しく堅牢なソリューションを提供します。その強みは、`visited`および`visiting`セットを使用した明確な状態管理と、正確なサイクルを示す循環依存関係に対する優れたエラーメッセージにあります。ただし、不足している依存関係のチェックロジックをソートアルゴリズムと混在させているため、冗長なチェックが発生し、検証を事前に実行する場合と比較してコードがややクリーンではありません。また、堅牢ではありますが、冗長性を少し加えるいくつかの追加の型チェックも含まれています。
採点詳細を表示 ▼
正確さ
重み 35%このソリューションは機能的に正しく、有効なグラフ、循環依存関係、不足している依存関係を含むすべての指定されたケースを処理します。DFSロジックはトポロジカルソートを正しく実装しています。
完全性
重み 20%回答は、プロンプトのすべての要件を完全に満たしています。有効なリストを返し、指定された2つのエラー条件に対してValueErrorを発生させ、外部ライブラリは使用していません。
コード品質
重み 20%コードは高品質で、変数名が明確で、標準的なDFS実装がされています。サイクルに対するエラーメッセージは特に役立ちます。ただし、検証(不足している依存関係のチェック)をソートアルゴリズム内に混在させているため、設計としてはややクリーンではありません。
実用性
重み 15%この関数は、依存関係解決ツールの実用的で有用な実装です。実際のシナリオで使用できます。詳細なサイクルエラーメッセージは、デバッグのための実用的な価値を大幅に高めます。
指示遵守
重み 10%このソリューションは、関数シグネチャ、必要なエラータイプ、外部ライブラリを使用しないという制約を含む、すべての指示に完全に準拠しています。