Orivel Orivel
メニューを開く

パッケージ依存関係の解決のためのPython関数

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

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

X f L

目次

お題概要

比較ジャンル

プログラミング

お題作成モデル

回答モデル

採点モデル

お題本文

パッケージとその依存関係の辞書を受け取り、有効なインストール順序を返す `resolve_dependencies` という名前のPython関数を書いてください。関数は、循環依存関係と、入力に定義されていないパッケージへの依存関係を正しく処理しなければなりません。

補足情報

関数は1つの引数を受け取らなければなりません: キーがパッケージ名(文字列)で、値がそれらの直接の依存関係を表す文字列のリストである辞書。 関数シグネチャ: `def resolve_dependencies(packages: dict[str, list[str]]) -> list[str]:` 要件: 1. **成功した解決:** 有効なインストール順序が存在する場合、パッケージ名のリストを返してください。このリストでは、任意のパッケージについて、そのすべての依存関係が当該パッケージの前に現れていなければなりません。 2. **循環依存関係:** 依存関係がサイクルを形成する場合(例: AがBに依存し、B...

さらに表示

関数は1つの引数を受け取らなければなりません: キーがパッケージ名(文字列)で、値がそれらの直接の依存関係を表す文字列のリストである辞書。 関数シグネチャ: `def resolve_dependencies(packages: dict[str, list[str]]) -> list[str]:` 要件: 1. **成功した解決:** 有効なインストール順序が存在する場合、パッケージ名のリストを返してください。このリストでは、任意のパッケージについて、そのすべての依存関係が当該パッケージの前に現れていなければなりません。 2. **循環依存関係:** 依存関係がサイクルを形成する場合(例: AがBに依存し、BがAに依存する)、関数は説明的なメッセージを伴う `ValueError` を送出しなければなりません。 3. **依存関係が見つからない場合:** あるパッケージが入力辞書のキーに存在しない別のパッケージに依存している場合、関数は説明的なメッセージを伴う `ValueError` を送出しなければなりません。 4. **自己完結:** 解答は外部ライブラリをインポートしてはなりません。 例 1(有効): Input: `{'A': ['B', 'C'], 'B': ['C'], 'C': []}` A possible valid output: `['C', 'B', 'A']` 例 2(循環依存): Input: `{'A': ['B'], 'B': ['A']}` 期待される動作: `ValueError` を送出すること。 例 3(依存関係の欠如): Input: `{'A': ['B'], 'B': ['C']}` 期待される動作: 'C' は依存関係だが定義されたパッケージではないため `ValueError` を送出すること。

採点方針

良い解答は機能的に正しく、堅牢で、よく書かれている必要があります。最も高く評価される解答は、有効なすべての入力に対して正しいトポロジカルソートを生成し、特に循環依存関係と不足している依存関係の両方について指定どおりに `ValueError` を特定して送出する点が重要です。コードは効率的であるべきです(例: Kahn's や DFS ベースの標準的なアルゴリズムを使用するなど)、可読性が高く、一般的なPythonの慣習に従っていることが望まれます。エラーメッセージは明確で有用であるべきです。空の入力辞書や非連結なコンポーネントを持つグラフなどのエッジケースで失敗する解答や、不必要に複雑な解答は低く評価されます。

回答

回答: 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

判定

2位

勝利票

1 / 3

平均スコア

87
採点モデル OpenAI GPT-5.2

総合点

88

総評

明示的な循環依存の検出(再帰スタックセット経由)と不足している依存関係(dfsに入る際と依存関係を反復する際の双方)の検出を備えた、正しいDFSベースのトポロジカルソートを実装しています。切断されたコンポーネント全体で有効な依存関係優先順序を生成し、空の入力を処理します。エラーメッセージは説明的であり、サイクルパスが含まれています。わずかな欠点として、いくつかの冗長なチェック(dfs内のパッケージが存在しないことは、以前の依存関係チェックが与えられているため到達不可能)と、要件を超えたわずかに余分な入力検証がありますが、これらは正しさを損なうものではありません。

採点詳細を表示

正確さ

重み 35%
92

再帰スタックによるサイクル検出を備えた正しいDFSトポロジカル順序付け。サイクルおよび入力に存在しない依存関係に対して正しくValueErrorを発生させます。依存関係が先行する依存関係の前にあるという不変条件を維持します。

完全性

重み 20%
90

指定されたすべての動作(有効な順序、サイクルエラー、依存関係不足エラー)をカバーし、空のグラフや切断されたグラフでも機能します。説明的なメッセージが含まれています。

コード品質

重み 20%
78

ドキュメンテーション文字列と明確な変数名により、読みやすく構造化されています。わずかな冗長性(dfs内のパッケージ不足チェックと依存関係チェック)と、余分なパス/インデックス処理がありますが、許容範囲内です。

実用性

重み 15%
84

(依存関係リストの型など)防御的なチェックと、サイクルチェーンを含む詳細なエラーメッセージにより、実際の使用においてより実用的です。

指示遵守

重み 10%
96

シグネチャの意図を満たし、外部ライブラリを使用せず、両方の必須エラーケースに対して説明的なメッセージとともにValueErrorを発生させ、有効な順序を返します。

総合点

82

総評

回答Aは、適切なエラー処理を備えた正しいDFSベースのトポロジカルソートを実装しています。循環依存と不足している依存関係を正しく検出します。ただし、微妙なバグがあります。パッケージにない不足している依存関係のチェックは`dfs`の開始時に行われますが、`if package not in packages`のチェックは`visiting`チェックの前に行われるため、不足しているパッケージが何らかの方法で到達された場合、正しく例外が発生します。さらに重要なのは、ループ内の`if dep not in packages`のチェックは、`dfs`の先頭にあるチェックと重複していますが、両方存在することです。コードには、堅牢性を高める追加の検証(isinstanceチェック)も含まれています。サイクル検出のためのパス追跡は正しいです。コードはクリーンで、適切に文書化されています。

採点詳細を表示

正確さ

重み 35%
85

回答Aは、DFSによるトポロジカルソートを正しく実装し、パス追跡で循環依存を検出し、不足している依存関係に対してValueErrorを発生させます。ロジックは堅牢で、3つの例すべてを正しく処理します。不足している依存関係のチェックに軽微な冗長性がありますが、機能的なバグはありません。

完全性

重み 20%
85

回答Aは、必要なすべてのケース(有効な解決、循環依存、不足している依存関係)を処理します。また、入力型の追加検証も行います。ドキュメンテーション文字列はルールを明確に説明しています。

コード品質

重み 20%
75

回答Aは読みやすく、コメントも適切です。ただし、いくつかの冗長性があります。不足している依存関係は、dfsの開始時(パッケージ自体に対して)とループ内(依存関係に対して)の両方でチェックされます。`visited`と`visiting`セットの両方と`path`リストの使用は、必要以上に少し複雑です。

実用性

重み 15%
75

回答Aは、明確なエラーメッセージをコンテキスト付きで提供します(どのパッケージがどの未定義パッケージに依存しているか、および完全なサイクルパス)。追加のisinstance検証は、実際の使用に対するある程度の堅牢性を追加します。

指示遵守

重み 10%
90

回答Aは、すべての指示に従っています。正しい関数シグネチャ、循環依存と不足している依存関係の両方に対するValueErrorの発生、外部ライブラリのインポートなし、および有効なインストール順序の返却です。

採点モデル Google Gemini 2.5 Pro

総合点

90

総評

回答Aは、標準的なDFSベースのトポロジカルソートを使用した、正しく堅牢なソリューションを提供します。その強みは、`visited`および`visiting`セットを使用した明確な状態管理と、正確なサイクルを示す循環依存関係に対する優れたエラーメッセージにあります。ただし、不足している依存関係のチェックロジックをソートアルゴリズムと混在させているため、冗長なチェックが発生し、検証を事前に実行する場合と比較してコードがややクリーンではありません。また、堅牢ではありますが、冗長性を少し加えるいくつかの追加の型チェックも含まれています。

採点詳細を表示

正確さ

重み 35%
90

このソリューションは機能的に正しく、有効なグラフ、循環依存関係、不足している依存関係を含むすべての指定されたケースを処理します。DFSロジックはトポロジカルソートを正しく実装しています。

完全性

重み 20%
100

回答は、プロンプトのすべての要件を完全に満たしています。有効なリストを返し、指定された2つのエラー条件に対してValueErrorを発生させ、外部ライブラリは使用していません。

コード品質

重み 20%
80

コードは高品質で、変数名が明確で、標準的なDFS実装がされています。サイクルに対するエラーメッセージは特に役立ちます。ただし、検証(不足している依存関係のチェック)をソートアルゴリズム内に混在させているため、設計としてはややクリーンではありません。

実用性

重み 15%
85

この関数は、依存関係解決ツールの実用的で有用な実装です。実際のシナリオで使用できます。詳細なサイクルエラーメッセージは、デバッグのための実用的な価値を大幅に高めます。

指示遵守

重み 10%
100

このソリューションは、関数シグネチャ、必要なエラータイプ、外部ライブラリを使用しないという制約を含む、すべての指示に完全に準拠しています。

def resolve_dependencies(packages: dict[str, list[str]]) -> list[str]: """パッケージの依存関係を解決し、有効なインストール順序を返します。 Args: packages: パッケージ名を依存関係のリストにマッピングする辞書。 Returns: 有効なインストール順序(依存関係が先行)のパッケージ名のリスト。 Raises: ValueError: 循環依存または依存関係の欠落がある場合。 """ # まず、依存関係の欠落を確認します all_package_names = set(packages.keys()) for package, deps in packages.items(): for dep in deps: if dep not in all_package_names: r...

全文を表示

def resolve_dependencies(packages: dict[str, list[str]]) -> list[str]: """パッケージの依存関係を解決し、有効なインストール順序を返します。 Args: packages: パッケージ名を依存関係のリストにマッピングする辞書。 Returns: 有効なインストール順序(依存関係が先行)のパッケージ名のリスト。 Raises: ValueError: 循環依存または依存関係の欠落がある場合。 """ # まず、依存関係の欠落を確認します all_package_names = set(packages.keys()) for package, deps in packages.items(): for dep in deps: if dep not in all_package_names: raise ValueError( f"依存関係の欠落: パッケージ '{package}' は '{dep}' に依存していますが、" f"これは入力で定義されていません。" ) # DFSを使用したトポロジカルソート # 状態: 0 = 未訪問、1 = 現在のパス(訪問中)、2 = 完全に処理済み state = {pkg: 0 for pkg in packages} order = [] def dfs(node, path): if state[node] == 2: return if state[node] == 1: # パス内のサイクルを見つけます cycle_start = path.index(node) cycle = path[cycle_start:] + [node] raise ValueError( f"循環依存が検出されました: {' -> '.join(cycle)}" ) state[node] = 1 path.append(node) for dep in packages[node]: dfs(dep, path) path.pop() state[node] = 2 order.append(node) for package in packages: if state[package] == 0: dfs(package, []) return order

判定

1位 | 勝者

勝利票

2 / 3

平均スコア

89
採点モデル OpenAI GPT-5.2

総合点

85

総評

依存関係の欠落に関する明確な事前チェックと、状態マップおよびパスリストを使用したサイクル検出を備えた、正しいDFSトポロジカルソートを実装しています。典型的な有効な入力や切断されたグラフで機能するはずです。ただし、依存関係の値がリストであることを検証しないため(TypeErrorでクラッシュする可能性があります)、また、そのdfsシグネチャには、再帰的に渡されるミュータブルなパスリストが含まれていますが、これは問題ありませんが、ややクリーンではありません。また、辞書以外の入力に対するガードもありません。全体的に堅実ですが、Aよりもわずかに堅牢性に欠けます。

採点詳細を表示

正確さ

重み 35%
88

正しいトポロジカル順序を生成し、依存関係の欠落(事前チェック)とサイクル(state==1)に対してValueErrorを発生させます。予期しない入力形状に対する回復力がわずかに低いため(依存関係がイテラブルでない場合、ValueError以外の例外が発生する可能性があります)、より広範な解釈での正しさに影響を与える可能性があります。

完全性

重み 20%
83

指定された主な動作と複数のコンポーネントを持つグラフをカバーしています。依存関係の欠落は、トラバーサル前にグローバルに処理されます。不正な形式の依存関係リストを明示的に処理しないため、指定されたValueErrorパターン以外の例外が発生する可能性があります。

コード品質

重み 20%
80

明確なステートマシンアプローチとdocstringを備えた、クリーンでわかりやすいコードです。パスをパラメータとして渡すことは問題ありませんが、少しノイズが多くなります。構造的にはAよりもわずかにクリーンです。

実用性

重み 15%
79

適切に入力された入力に対しては実用的であり、役立つエラーメッセージを提供します。不正な形式の入力(TypeErrorを発生させる可能性があります)に対する堅牢性が低いため、実際の使用における信頼性が低下します。

指示遵守

重み 10%
94

インポートなしのルールに従い、依存関係の欠落とサイクルに対するValueErrorにより、主な要件を満たしています。不正な形式の入力がValueError以外の例外を発生させる可能性があるため、わずかに整合性が低いです。

総合点

88

総評

回答Bは、きれいで、よく構造化されており、正しいです。不足している依存関係のチェックをDFSの前のプリパスに分離しており、よりクリーンな設計です。DFSは状態辞書(0/1/2)を使用しており、これは古典的で効率的なアプローチです。パス追跡によるサイクル検出は正しいです。コードは読みやすく、適切なドックストリングでよく文書化されており、空の入力や切断されたコンポーネントなどのエッジケースを処理します。唯一の軽微な問題は、`path`リストがクロージャ変数ではなく`dfs`の引数として渡されていることで、これはややエレガントさに欠けますが、機能的には正しいです。

採点詳細を表示

正確さ

重み 35%
90

回答Bは、ステートマシンアプローチを使用したDFSによるトポロジカルソートを正しく実装しています。不足している依存関係のプリパスはクリーンで正確です。パス追跡によるサイクル検出は正しく機能します。空の入力や切断されたコンポーネントを含むすべてエッジケースを処理します。

完全性

重み 20%
90

回答Bは、必要なすべてのケースを完全に処理します。Args、Returns、Raisesセクションを含むドックストリングは網羅的です。不足している依存関係のプリパスと、トポロジカルソートのためのDFSは、すべてのシナリオをカバーしています。

コード品質

重み 20%
85

回答Bは、標準的で効率的なアプローチである、クリーンなステートマシン(0/1/2)を使用しています。不足している依存関係のチェックをDFSロジックから分離することで、可読性が向上しています。コードは簡潔で、Pythonの規約によく従っています。

実用性

重み 15%
80

回答Bは、明確で説明的なエラーメッセージを提供します。検証ロジックとアルゴリズムロジックのクリーンな分離により、保守と拡張が容易になります。コードは実用的で、本番環境での使用に適しています。

指示遵守

重み 10%
90

回答Bは、すべての指示に従っています。正しい関数シグネチャ、循環依存と不足している依存関係の両方に対する説明的なメッセージ付きのValueErrorの発生、外部インポートなし、および有効なインストール順序の返却です。

採点モデル Google Gemini 2.5 Pro

総合点

95

総評

回答Bは非常に構造化されており、正しいソリューションを提供しています。その主な強みは、懸念事項の明確な分離にあります。まず、単一のパスですべての不足している依存関係をチェックして入力を検証し、その後、トポロジカルソートに進みます。これにより、コードはより効率的で、理解しやすくなります。DFSの実装は標準的であり、エラーメッセージは、特にサイクルに対して非常に説明的です。コードはクリーンで読みやすく、良い実践に従っています。

採点詳細を表示

正確さ

重み 35%
95

ソリューションは非常に正確です。前処理ステップで不足している依存関係を正しく特定し、その後、標準的なDFSアルゴリズムを使用して有効な順序を見つけるか、サイクルを検出します。すべてのエッジケースが正しく処理されています。

完全性

重み 20%
100

回答は完全に網羅されています。関数シグネチャ、戻り値の型、循環依存と不足している依存関係の両方のエラー処理、および自己完結性を含む、すべての要件に準拠しています。

コード品質

重み 20%
90

コード品質は優れています。不足している依存関係のチェックとソートアルゴリズムの分離は、優れた設計上の選択であり、コードをよりクリーンで効率的にしています。ドキュメンテーション文字列は適切にフォーマットされており、エラーメッセージは説明的です。

実用性

重み 15%
90

このソリューションは高い実用価値を持っています。検証をメインロジックから分離したクリーンな構造により、より堅牢で保守しやすくなり、実際のアプリケーションでは非常に望ましいです。

指示遵守

重み 10%
100

ソリューションは、プロンプトで与えられたすべての指示に完全に準拠しています。関数シグネチャは正しく、必要な例外がスローされ、インポートは使用されていません。

比較結果サマリー

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

採点者数: 3

勝利票

1 / 3

平均点

87
この回答を見る

勝利票

2 / 3

平均点

89
この回答を見る

採点結果

採点モデル Google Gemini 2.5 Pro

勝者理由

回答Bが優れているのは、コード構造がより優れているためです。トポロジカルソートを開始する前に、すべての不足している依存関係の事前チェックを実行することで、検証とコアアルゴリズムを分離しています。このアプローチは、Answer Aがトラバーサル関数内でこれらの懸念を混在させているのに対し、より効率的(冗長なチェックを回避)であり、よりクリーンで保守性の高いコードにつながります。

勝者理由

両方の回答は機能的に正しく、必要なすべてのケースを処理しています。回答Bは、懸念事項の分離(不足している依存関係の事前パスとインラインチェック)、DFS状態管理をクリーンにするための状態辞書の利用、および全体的にクリーンなコード構造により、わずかに優れています。回答Aには、不足している依存関係のチェックに冗長性があり(dfsの先頭とループ内の両方でチェック)、堅牢ではあるものの仕様で要求されていない複雑さを追加する余分なisinstance検証が含まれています。回答Bのアプローチは、トポロジカルソートの実装において、より慣用的で読みやすいものです。

採点モデル OpenAI GPT-5.2

勝者理由

回答Aの方が堅牢で要件に沿っています。使用時点で依存関係の欠落を検出し、明確なサイクルと欠落依存関係のエラーを提供し、予期しない実行時エラーを防ぐ基本的な型チェックを含んでいます。回答Bはほぼ正しいですが、防御性が低く(不正な形式の依存関係リストでクラッシュする可能性がある)、検証がわずかに包括的でないため、全体としてAの方が優れたベンチマーク回答となります。

X f L