回答A: OpenAI GPT-5.4
import re from collections import defaultdict def analyze_logs(log_data): """ マルチラインのログ文字列を解析し、以下のサマリー辞書を返します。 - counts_by_level: 大文字のログレベルごとのログエントリ数 - successful_logins: 正常にログインした一意のユーザー名 - failed_login_ips: IPアドレスごとのログイン失敗試行回数 不正な形式または関連性のない行は無視されます。 """ counts_by_level = defaultdict(int) successful_logins = set() failed_login_ips = defaultdict(int) # 次のような行に一致します: [TIMESTAMP] LEVEL: MESSAGE log_line_pattern = re.compile( r"^\ м...
全文を表示 ▼
import re from collections import defaultdict def analyze_logs(log_data): """ マルチラインのログ文字列を解析し、以下のサマリー辞書を返します。 - counts_by_level: 大文字のログレベルごとのログエントリ数 - successful_logins: 正常にログインした一意のユーザー名 - failed_login_ips: IPアドレスごとのログイン失敗試行回数 不正な形式または関連性のない行は無視されます。 """ counts_by_level = defaultdict(int) successful_logins = set() failed_login_ips = defaultdict(int) # 次のような行に一致します: [TIMESTAMP] LEVEL: MESSAGE log_line_pattern = re.compile( r"^\ между(?P<timestamp>[^\]]+)\]\s+(?P<level>[A-Za-z]+)\s*:\s*(?P<message>.*)$" ) # ログイン成功例: User 'alice' logged in from IP '192.168.1.10' success_pattern = re.compile( r"User\s+'([^']+)'\s+logged\s+in\b", re.IGNORECASE, ) # ログイン失敗例: Failed login attempt for user 'bob' from IP '203.0.113.5' failed_pattern = re.compile( r"Failed\s+login\s+attempt\s+for\s+user\s+'[^']+'\s+from\s+IP\s+'([^']+)'", re.IGNORECASE, ) if not isinstance(log_data, str): return { "counts_by_level": {}, "successful_logins": [], "failed_login_ips": {}, } for line in log_data.splitlines(): line = line.strip() if not line: continue match = log_line_pattern.match(line) if not match: continue level = match.group("level").upper() message = match.group("message") counts_by_level[level] += 1 success_match = success_pattern.search(message) if success_match: successful_logins.add(success_match.group(1)) failed_match = failed_pattern.search(message) if failed_match: failed_login_ips[failed_match.group(1)] += 1 return { "counts_by_level": dict(counts_by_level), "successful_logins": sorted(successful_logins), "failed_login_ips": dict(failed_login_ips), } # 使用例: if __name__ == "__main__": sample_logs = """ [2023-10-27T10:00:00Z] INFO: Server starting up. [2023-10-27T10:01:00Z] INFO: User 'alice' logged in from IP '192.168.1.10' [2023-10-27T10:02:30Z] WARN: Failed login attempt for user 'bob' from IP '203.0.113.5' This is not a valid log line and should be ignored. [2023-10-27T10:03:00Z] error: Database connection failed. [2023-10-27T10:05:00Z] INFO: User 'alice' accessed resource '/dashboard' [2023-10-27T10:06:00Z] WARN: Failed login attempt for user 'eve' from IP '203.0.113.5' [2023-10-27T10:07:00Z] INFO: User 'charlie' logged in from IP '198.51.100.2'""" print(analyze_logs(sample_logs))
判定
勝利票
3 / 3
平均スコア
総合点
総評
回答Aは、非常に堅牢でよく設計されたソリューションを提供します。すべての解析ロジックを正しく実装し、ログレベルの大文字小文字を区別しない処理を行い、メッセージ解析に`re.IGNORECASE`を使用しているため、バリエーションに対して耐性があります。`defaultdict`と`set`の使用は効率的でPython的です。また、入力型のチェックも含まれており、成功したログインをソートして一貫した出力を保証しており、細部への配慮とベストプラクティスを示しています。
採点詳細を表示 ▼
正確さ
重み 35%回答Aは完全に正確であり、すべてのログコンポーネントを正確に解析し、要求どおりにデータを集計します。ログレベルの大文字小文字を区別しない処理を正しく処理し、メッセージパターンに`re.IGNORECASE`を使用しているため、堅牢なマッチングが保証されます。
完全性
重み 20%回答Aは、ログ行の堅牢な解析、大文字小文字を区別しないレベルのカウント、成功/失敗したログインの詳細の正確な抽出を含む、すべての必須機能を完全に実装しています。完全性を高めるための入力型のチェックも含まれています。
コード品質
重み 20%回答Aは、優れたコード品質を示しています。効率的なデータ集計のために`defaultdict`と`set`を、正規表現の効率のために`re.compile`を、可読性のために名前付きグループを、堅牢なパターンマッチングのために`re.IGNORECASE`を使用しています。コードはクリーンで、構造化されており、役立つドキュメンテーション文字列が含まれています。
実用性
重み 15%回答Aは、その堅牢な設計により、高い実用価値を持っています。メッセージの大文字小文字のバリエーションを含むさまざまなログ行形式を処理でき、フォーマットが不正な行や文字列以外の入力を適切に管理できるため、実際のログ分析シナリオに適しています。
指示遵守
重み 10%回答Aは、すべての指示に正確に従っています。ログレベルの大文字小文字を区別しない処理を正しく処理し、フォーマットが不正な行を堅牢に無視します。メッセージパターンに`re.IGNORECASE`を使用することは、メッセージに対して明示的に述べられていませんが、「堅牢」という要件に沿っています。また、適切なデータ構造を使用し、一貫性のために最終リストをソートしています。
総合点
総評
堅牢で正確な実装であり、正規表現ベースの解析、大文字小文字を区別しないレベル正規化、不正な形式の行の丁寧なスキップを備えています。適切なデータ構造(defaultdict、set)を使用し、プレーンな辞書を返します。些細な点:ソートされた成功ログイン(必須ではない)を返し、要求された関数以外の使用例を含みますが、コア要件には影響しません。
採点詳細を表示 ▼
正確さ
重み 35%大文字のログインレベルを正しく抽出し、カウントし、成功したログインユーザー名のユニークなものを検索し、失敗したログインIPをカウントします。パターンはプロンプトと一致し、メッセージの大文字小文字のバリエーションを処理します。
完全性
重み 20%すべての必要な出力をカバーし、不正な形式の行を明示的に無視します。また、文字列以外の入力を空の形状のサマリーを返すことで処理します。
コード品質
重み 20%名前付きのコンパイル済み正規表現と適切なコレクションにより、よく構造化されており、読みやすく保守しやすいです。追加の例のメインブロックとユーザー名の不要なソート(無害ですが)により、わずかに範囲を超えています。
実用性
重み 15%実際のログに対して実用的です。大文字小文字のバリエーション、不正な形式の行、文字列以外の入力を安全に処理します。単一パス処理と合理的なデータ構造を備えています。
指示遵守
重み 10%要求された関数と動作を実装しており、大文字小文字を区別しないレベルの解析や不正な形式の行の丁寧な無視が含まれます。必要なキーを返します。使用例を追加しますが、要件とは競合しません。
総合点
総評
回答Aは、構造化され、正確で、堅牢なソリューションです。可読性のために名前付きグループを正規表現で使用し、よりクリーンなカウントのためにdefaultdictを使用し、効率のためにループの外で正規表現パターンをコンパイルし、入力型検証を含み、決定論的な出力のためにsuccessful_loginsリストをソートし、クリーンな出力のためにdefaultdictを通常の辞書に変換し、包括的なドキュメンテーション文字列と使用例を含んでいます。ログインパターンでのre.IGNORECASEの使用は、さらなる堅牢性を加えています。コードはクリーンで、本番環境で使用できる状態です。
採点詳細を表示 ▼
正確さ
重み 35%例の入力に対して正しい出力を生成し、エッジケースも適切に処理します。正規表現パターンは、名前付きグループと大文字小文字を区別しないフラグでうまく作成されています。入力型検証は、予期しない入力に対する正確性を高めます。
完全性
重み 20%必要なすべての機能を処理します:counts_by_level、successful_logins(一意、ソート済み)、failed_login_ips。また、文字列以外の入力、空行、および不正な形式の行も適切に処理します。使用例も含まれています(__main__ブロック)。
コード品質
重み 20%優れたコード品質:効率のためのコンパイル済み正規表現パターン、可読性のための名前付きグループ、クリーンなカウントのためのdefaultdict、包括的なドキュメンテーション文字列、決定論のためのソート済み出力、defaultdictから通常の辞書への適切な変換、および関心の明確な分離。
実用性
重み 15%非常に実用的:堅牢な入力検証、決定論的なソート済み出力、効率的なコンパイル済み正規表現、および使用例により、本番環境での使用準備が整っています。ログインパターンでのre.IGNORECASEフラグは、実際の堅牢性を高めます。
指示遵守
重み 10%すべての指示に正確に従っています:正しい関数シグネチャ、3つのすべてのキーを持つ正しい出力形式、大文字で格納される大文字小文字を区別しないレベル解析、リストとしてのユニークなユーザー名、不正な形式の行の適切な処理、および推奨される正規表現の使用。