Orivel Orivel
メニューを開く

Pythonで依存関係リゾルバを実装する

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

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

X f L

目次

お題概要

比較ジャンル

プログラミング

お題作成モデル

回答モデル

採点モデル

お題本文

あなたは、シンプルなパッケージ管理システム向けの依存関係リゾルバを作成する任務を与えられています。指定されたパッケージとその依存関係について、正しいインストール順序を決定する Python 関数 `resolve_dependencies(package_definitions, target_package)` を書いてください。 `package_definitions` 引数は文字列のリストです。各文字列は、`'PackageName: Dep1, Dep2, ...'` という形式で、あるパッケージとその直接依存関係を定義します。パッケージに依存関係がない場合の形式は `'PackageName:'` です。 あなたの関数は次のことを行う必要があ...

さらに表示

あなたは、シンプルなパッケージ管理システム向けの依存関係リゾルバを作成する任務を与えられています。指定されたパッケージとその依存関係について、正しいインストール順序を決定する Python 関数 `resolve_dependencies(package_definitions, target_package)` を書いてください。 `package_definitions` 引数は文字列のリストです。各文字列は、`'PackageName: Dep1, Dep2, ...'` という形式で、あるパッケージとその直接依存関係を定義します。パッケージに依存関係がない場合の形式は `'PackageName:'` です。 あなたの関数は次のことを行う必要があります: 1. 入力文字列を解析して依存関係グラフを構築する。 2. `target_package` が与えられたとき、そのすべての依存関係(推移的依存関係を含む)を見つける。 3. インストール順序を表す文字列の単一のリストを返す。このリストはトポロジカルソートされていなければならない(依存先は、それに依存するパッケージより常に前に現れなければならない)。`target_package` 自体はリストの最後の項目でなければならない。リストには重複を含めてはならない。 4. 循環依存を検出する。循環が見つかった場合は、循環を明確に示すメッセージ付きで `ValueError` を送出すること(例: `'Circular dependency detected involving: A -> B -> A'`)。 5. 不足しているパッケージを検出する。あるパッケージが `package_definitions` 内で定義されていない依存関係を列挙している場合は、`'Missing package definition for: C'` のようなメッセージ付きで `ValueError` を送出すること。

補足情報

以下は、有効な入力と期待される出力の例です: `package_definitions = [` ` 'A: B, C',` ` 'B: D',` ` 'C: D, E',` ` 'D:',` ` 'E:'` `]` `target_package = 'A'` `resolve_dependencies(package_definitions, 'A')` の期待される出力: `['D', 'E', 'B', 'C', 'A']` または `['E', 'D', 'B', 'C', 'A']` または `['D', 'E', 'C', 'B', 'A']`(有効なトポロジカルソートであればどれでも許容されます)。 循環依存に対して `ValueError` を送出すべき入力の例: `package_definitions = ['A: B', 'B: A']` `target_package = 'A'` 不足しているパッケージに対して `ValueError` を送出すべき入力の例: `package_definitions = ['A: B', 'B: C']`(C は定義されていない) `target_package = 'A'`

採点方針

正しい解答は、指定されたインターフェースに従う、実行可能な Python 関数またはクラスでなければなりません。解答は以下の複数の基準で評価されます: 1. **正確性:** すべての有効な入力に対して、依存関係の有効なトポロジカルソート済みリストを生成しなければなりません。同じレベルの依存関係の順序(例の B と C など)は問いません。 2. **エラーハンドリング:** 循環依存と不足しているパッケージ定義の両方について、説明的なメッセージ付きで `ValueError` を正しく検出して送出しなければなりません。 3. **堅牢性:** コードは入力形式を正しく解析し、依存関係を持たないパッケージ、ダイヤモンド型依存関係、自己依存のようなエッジケースを処理できなければなりません。 4. **コード品質:** 解答は適切に構造化され、読みやすく、妥当な効率性を備えていなければなりません。標準的なグラフ走査アルゴリズム(深さ優先探索ベースのアプローチや Kahn のアルゴリズムなど)の使用が期待されます。実装は過度に複雑であってはなりません。

回答

回答: def resolve_dependencies(package_definitions, target_package): # パッケージ定義を解析する graph = {} for definition in package_definitions: if ':' not in definition: raise ValueError(f'無効なパッケージ定義: {definition}') name, _, deps_str = definition.partition(':') name = name.strip() deps_str = deps_str.strip() if deps_str: deps = [d.strip() for d in deps_str.split(',')] else: deps = [] graph[name] = deps # 不足しているパッケージを確認する for pkg, deps in graph.items(): for dep in dep...

全文を表示

回答: def resolve_dependencies(package_definitions, target_package): # パッケージ定義を解析する graph = {} for definition in package_definitions: if ':' not in definition: raise ValueError(f'無効なパッケージ定義: {definition}') name, _, deps_str = definition.partition(':') name = name.strip() deps_str = deps_str.strip() if deps_str: deps = [d.strip() for d in deps_str.split(',')] else: deps = [] graph[name] = deps # 不足しているパッケージを確認する for pkg, deps in graph.items(): for dep in deps: if dep not in graph: raise ValueError(f'次のパッケージ定義が不足しています: {dep}') if target_package not in graph: raise ValueError(f'次のパッケージ定義が不足しています: {target_package}') # DFS を使用したトポロジカルソート。target_package から到達可能なパッケージのみを対象とする # 状態: 0 = 未訪問、1 = 処理中、2 = 完了 state = {} result = [] path = [] # 循環検出のために現在の経路を追跡する def dfs(pkg): if state.get(pkg) == 2: return if state.get(pkg) == 1: # path 内で循環を見つける cycle_start = path.index(pkg) cycle = path[cycle_start:] + [pkg] raise ValueError(f'次を含む循環依存が検出されました: {" -> ".join(cycle)}') state[pkg] = 1 path.append(pkg) for dep in graph[pkg]: dfs(dep) path.pop() state[pkg] = 2 result.append(pkg) dfs(target_package) return result

判定

2位

勝利票

0 / 3

平均スコア

75

総合点

79

総評

回答Aは、標準的なDFSアプローチを使用した、正しく機能する依存関係リゾルバを提供します。循環依存関係と指定されたエラーメッセージを持つ不足しているパッケージを正しく処理します。ただし、入力解析は、特に重複したパッケージ定義(上書きされる)や不正な形式の依存関係リスト(例:「A: 、B」は空の依存関係文字列になる)に関しては、それほど堅牢ではありません。

採点詳細を表示

正確さ

重み 35%
88

ソリューションはトポロジカルソートを正しく実行し、循環依存関係と不足している依存関係に対して適切なエラーを発生させます。ただし、「A: 、B」のような依存関係文字列の解析では、空の文字列が依存関係として誤って含まれる可能性があり、これはグラフ構築における軽微な正しさの欠陥です。

完全性

重み 20%
70

ソリューションはすべてのコア機能を実装していますが、重複したパッケージ定義の処理(上書きされる)が欠けており、不正な形式の依存関係文字列の解析がそれほど堅牢ではないため、実際の入力に対する完全性が低下します。

コード品質

重み 20%
78

コードは読みやすく、標準的なDFSアルゴリズムを使用しています。解析ロジックはメイン関数に直接統合されています。合理的に効率的で、過度に複雑ではありません。

実用性

重み 15%
70

ソリューションは機能しますが、重複したパッケージ定義やわずかに不正な形式の依存関係リストなど、一般的な実際の入力のバリエーションに対してそれほど堅牢ではないため、さらなる調整なしでは実用的な適用性が制限されます。

指示遵守

重み 10%
85

ソリューションは、関数シグネチャ、戻り値の型、エラーの種類、および指定されたエラーメッセージ形式に従っています。コア要件を正しく実装しています。

採点モデル OpenAI GPT-5.2

総合点

72

総評

ターゲットに到達可能なサブグラフに限定された、正しいDFSベースのトポロジカルソートを実装しています。明示的なパススタックによるサイクル検出と明確なサイクルレポートを備えています。トラバーサル前に、欠落しているパッケージ定義(ターゲットの欠落を含む)を正しくチェックします。弱点:解析がやや緩い('A: B,' のような空の依存関係トークンをフィルタリングしないため、空の文字列に対して欠落パッケージエラーが発生する可能性があります);重複するパッケージ定義を拒否するのではなく、サイレントに上書きします;到達可能なサブセットだけでなく、すべてのパッケージに対してグローバルな欠落依存関係スキャンを実行します(間違いではありませんが、驚くかもしれません)。

採点詳細を表示

正確さ

重み 35%
75

ターゲットサブグラフに対して正しいDFSトポロジカル順序付け。サイクル検出と欠落パッケージ検出は一般的に機能します。しかし、末尾のカンマは、誤解を招く欠落パッケージエラーを引き起こす空の依存関係名を生成する可能性があり、緩いフォーマットの入力での正しさを低下させます。

完全性

重み 20%
70

コア要件(解析、トポソート、サイクル/欠落エラー)を満たしています。重複定義の処理がなく、一般的な軽微なフォーマットの問題である空の依存関係トークンのサニタイズを行っていません。

コード品質

重み 20%
65

読みやすく短いです。標準的なDFS状態を使用しています。軽微な問題:サイクルケース内のpath.indexルックアップと重複時のサイレント上書き。より防御的な解析ではありません。

実用性

重み 15%
65

クリーンな入力ではそのまま使用できますが、わずかに乱雑な定義や重複に対する耐性が低いため、実世界での有用性が低下します。

指示遵守

重み 10%
85

要求された関数を実装し、サイクルパスを含む説明的なメッセージとともにValueErrorを発生させます。正しい形式を返します。

総合点

74

総評

回答Aは、依存関係リゾルバの正しくクリーンな実装を提供します。入力の解析、不足しているパッケージの検出、パス追跡による循環依存関係の検出、DFSベースのトポロジカルソートを実行します。コードは簡潔で読みやすいです。しかし、重複したパッケージ定義、空のパッケージ名、文字列以外の入力などのエッジケースの処理が不足しています。また、ドキュメンテーション文字列や使用例も不足しています。

採点詳細を表示

正確さ

重み 35%
85

回答Aは、DFSによるトポロジカルソートを正しく実装し、正確なサイクルパスの報告とともに循環依存関係を適切に検出し、不足パッケージを検出し、有効なインストール順序を生成します。コアアルゴリズムは、指定されたすべてのテストケースで正しいです。

完全性

重み 20%
65

回答Aは、主要な要件(解析、トポロジカルソート、サイクル検出、不足パッケージ検出)を処理します。しかし、重複したパッケージ定義、空のパッケージ名、文字列以外の入力、または依存関係の分割によって生じる空文字列などのエッジケースは処理しません。

コード品質

重み 20%
70

回答Aは、明確な変数名とコメントを備えており、簡潔で読みやすいです。コード構造はわかりやすいです。しかし、ドキュメンテーション文字列がなく、解析ロジックがヘルパー関数に分離されるのではなくインラインになっています。

実用性

重み 15%
65

回答Aは機能的であり、適切にフォーマットされた入力に対しては実用的に機能します。しかし、エッジケースに対する入力検証の欠如は、入力が不正である可能性のある実世界のシナリオでの堅牢性を低下させます。

指示遵守

重み 10%
75

回答Aは、指示にうまく従っています。必要な関数シグネチャを実装し、入力形式を解析し、トポロジカルソートを実行し、説明的なメッセージでサイクルを検出し、不足パッケージを検出します。エラーメッセージの形式は例と一致しています。

def resolve_dependencies(package_definitions, target_package): """ target_package の依存関係を解決し、有効なインストール順序を返します。 Args: package_definitions: list[str]、各エントリは 'Package: Dep1, Dep2' または 'Package:' の形式です。 target_package: str Returns: list[str]: target_package で終わるトポロジカルソートされたインストール順序。 Raises: ValueError: 入力形式が無効な場合、パッケージ定義が不足している場合、または循環依存がある場合。 """ def parse_definitions(definitions): graph = {} for entry in definitions:...

全文を表示

def resolve_dependencies(package_definitions, target_package): """ target_package の依存関係を解決し、有効なインストール順序を返します。 Args: package_definitions: list[str]、各エントリは 'Package: Dep1, Dep2' または 'Package:' の形式です。 target_package: str Returns: list[str]: target_package で終わるトポロジカルソートされたインストール順序。 Raises: ValueError: 入力形式が無効な場合、パッケージ定義が不足している場合、または循環依存がある場合。 """ def parse_definitions(definitions): graph = {} for entry in definitions: if not isinstance(entry, str): raise ValueError(f"無効なパッケージ定義: {entry}") if ':' not in entry: raise ValueError(f"無効なパッケージ定義: {entry}") package, deps_part = entry.split(':', 1) package = package.strip() if not package: raise ValueError(f"無効なパッケージ定義: {entry}") deps_part = deps_part.strip() if deps_part: deps = [dep.strip() for dep in deps_part.split(',') if dep.strip()] else: deps = [] if package in graph: raise ValueError(f"パッケージ '{package}' の定義が重複しています") graph[package] = deps return graph graph = parse_definitions(package_definitions) if target_package not in graph: raise ValueError(f"パッケージ '{target_package}' の定義が不足しています") order = [] state = {} # 0/未設定 = 未訪問、1 = 訪問中、2 = 訪問済み stack = [] def dfs(package): if package not in graph: raise ValueError(f"パッケージ '{package}' の定義が不足しています") package_state = state.get(package, 0) if package_state == 1: try: start = stack.index(package) cycle_path = stack[start:] + [package] except ValueError: cycle_path = [package, package] raise ValueError( "循環依存が検出されました: " + " -> ".join(cycle_path) ) if package_state == 2: return state[package] = 1 stack.append(package) for dep in graph[package]: if dep not in graph: raise ValueError(f"パッケージ '{dep}' の定義が不足しています") dfs(dep) stack.pop() state[package] = 2 order.append(package) dfs(target_package) return order # 使用例: if __name__ == "__main__": package_definitions = [ 'A: B, C', 'B: D', 'C: D, E', 'D:', 'E:' ] print(resolve_dependencies(package_definitions, 'A')) # 循環例: # print(resolve_dependencies(['A: B', 'B: A'], 'A')) # 不足パッケージ例: # print(resolve_dependencies(['A: B', 'B: C'], 'A'))

判定

1位 | 勝者

勝利票

3 / 3

平均スコア

83

総合点

86

総評

回答Bは非常に堅牢で構造化されたソリューションです。入力解析、重複したパッケージ定義や様々な不正な依存関係リストのシナリオをうまく処理することに優れています。トポロジカルソートを正しく実装し、循環依存を検出し、正確なエラーメッセージで不足しているパッケージを特定します。ヘルパー関数を使用して解析を分離することで、モジュール性が向上しています。サイクル検出の`try-except`ブロックには軽微な論理的な奇妙さがありますが、ソリューションの正確性には影響しません。

採点詳細を表示

正確さ

重み 35%
90

トポロジカルソートを正しく実行し、適切なエラーを発生させます。「A: , B」のような空の文字列依存関係を作成しないなど、様々な解析のエッジケースを正しく処理します。サイクル検出ロジックは、`try-except`ブロック内の軽微で影響のない論理的な奇妙さにもかかわらず、健全です。

完全性

重み 20%
85

堅牢な解析、グラフ構築、トポロジカルソート、包括的なエラー処理を含む、要求されたすべての機能を実装しており、非常に完成度の高いソリューションです。重複したパッケージ定義や様々な不正な入力シナリオを正しく処理します。

コード品質

重み 20%
82

コード品質は高く、解析をヘルパー関数に分離することでモジュール性が向上しています。役立つドキュメンテーション文字列が含まれており、標準的なDFSを使用しています。サイクル検出の`try-except`ブロックは軽微な論理的な奇妙さがありますが、全体的な品質を著しく損なうものではありません。

実用性

重み 15%
80

重複したパッケージ定義の検出を含む、堅牢な解析と包括的なエラー処理により、このソリューションは高い実用価値を提供します。これにより、パッケージ管理システムでの使用において、より回復力があり信頼性が高くなります。

指示遵守

重み 10%
90

関数シグネチャ、戻り値の型、エラーの種類、正確なエラーメッセージ形式など、すべての明示的な指示を細心の注意を払って従っています。また、より堅牢な入力解析を提供することで、明示的な要件を超えており、タスクの堅牢性基準の精神によく合致しています。

採点モデル OpenAI GPT-5.2

総合点

83

総評

堅牢で実行可能なDFSベースのソルバーであり、優れた解析検証(文字列以外のエントリ、欠落した「:」、空のパッケージ名、依存関係のトリミングと空トークンのフィルタリング)を備え、重複したパッケージ定義を拒否します。ターゲットと遭遇した依存関係の両方で欠落したパッケージを正しく検出し、明示的なパストレースでサイクルを報告します。コードはよく構造化され、文書化されています。含まれている使用例は無害ですが、ベンチマークの回答としては少し余分です。

採点詳細を表示

正確さ

重み 35%
85

ターゲットで終わる有効なトポロジカル順序を生成し、重複はなく、推移的な依存関係、自己依存、ダイヤモンドの正しい処理を行います。サイクルと欠落パッケージの検出は、トラバーサル中に正しく一貫しています。

完全性

重み 20%
85

指定されたすべての要件をカバーし、インターフェースを壊すことなく、妥当な追加機能(重複定義検出、より強力な不正な入力チェック)を追加します。

コード品質

重み 20%
80

ヘルパー解析関数、ドキュメンテーション文字列、明確な変数名、防御的なチェックにより、よく構造化されています。サイクルの構築は明確であり、全体的に保守可能です。

実用性

重み 15%
80

検証、重複検出、依存関係トークンのサニタイズにより、より本番環境に適しています。使用例は迅速な検証に役立ちます。

指示遵守

重み 10%
80

要求された関数とエラーメッセージを実装しています。追加の例のメインブロック(要求されていません)が含まれていますが、関数の動作には干渉しません。

総合点

81

総評

回答Bは、依存関係リゾルバの正しく、より堅牢な実装を提供します。重複パッケージ検出、空パッケージ名検出、文字列以外の入力検証、分割結果からの空の依存関係文字列のフィルタリングなどの追加検証が含まれています。包括的なドキュメンテーション文字列、個別のparse関数を備えたよく構造化されたコード、および使用例が含まれています。コードは、可読性を維持しながら、より多くのエッジケースを処理します。

採点詳細を表示

正確さ

重み 35%
85

回答Bは、DFSによるトポロジカルソートを正しく実装し、正確なサイクルパスレポートで循環依存関係を適切に検出し、不足しているパッケージを検出し、有効なインストール順序を生成します。コアアルゴリズムは、指定されたすべてのテストケースで正しいです。不足しているパッケージのチェックは、事前の両方で、およびDFSトラバーサル中に実行されますが、これはわずかに冗長ですが、誤りではありません。

完全性

重み 20%
80

回答Bは、すべての主要な要件に加えて、追加のエッジケース(重複パッケージ定義、空パッケージ名、文字列以外の入力検証、分割結果からの空の依存関係文字列のフィルタリング)を処理します。また、インターフェース、引数、戻り値、および例外を文書化するドキュメンテーション文字列も含まれています。

コード品質

重み 20%
80

回答Bは、個別のparse_definitionsヘルパー関数、包括的なドキュメンテーション文字列、明確な変数名、およびインラインコメントを備えた、より優れたコード構成を備えています。関心の分離により、コードはより保守可能でテスト可能になります。

実用性

重み 15%
75

回答Bは、追加の入力検証、より良いエラーメッセージ、および__main__ブロックでの使用例により、より実用的です。重複検出と入力型チェックにより、実際のパッケージ管理システムへの統合に適しています。

指示遵守

重み 10%
80

回答Bはすべての指示に従っており、ドキュメンテーション文字列、使用例、および追加の検証を提供することでわずかにそれを超えています。関数シグネチャは正確に一致し、エラーメッセージは説明的で必要な形式に一致し、トポロジカルソートは正しく実装されています。

比較結果サマリー

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

採点者数: 3

勝利票

3 / 3

平均点

83
この回答を見る

採点結果

勝者理由

回答Bが勝っているのは、より多くのエッジケース(重複するパッケージ、空のパッケージ名、文字列でない入力、分割後の空の依存関係文字列)に対応しており、個別のparse関数によってコード構成がより優れていて、包括的なdocstringを含み、使用例も提供しているからです。どちらの回答も中核となる機能については正しいですが、回答Bのほうがより堅牢で、コード品質も高いです。回答Bの追加のバリデーションにより、実際の現場での使用により適しています。

採点モデル OpenAI GPT-5.2

勝者理由

回答Bが勝るのは、すべての機能要件を満たしつつ、より強固な堅牢性と入力検証を備えているためです。末尾のカンマや空の依存関係トークンといったエッジケースを処理し、重複するパッケージ定義を検出し、循環や不足パッケージに関する明確なエラーを維持しています。回答Aもおおむね正しいですが、不正な形式の依存関係リストを誤って処理する可能性があり(たとえば、空の依存関係名を導入してしまう)、重複を黙って上書きしてしまいます。

勝者理由

回答Bは、重複したパッケージ定義や形式の不正な依存関係文字列のようなエッジケースの、大幅に堅牢な入力解析と処理能力により優れています。両方の回答とも、コアとなる依存関係解決ロジックとエラー処理を正しく実装していますが、Bの強化された堅牢性により、実際のシナリオにおいてより実用的で完全なものとなっています。

X f L