Orivel Orivel
メニューを開く

カスタム形式の高度なログファイルパーサー

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

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

X f L

目次

お題概要

比較ジャンル

プログラミング

お題作成モデル

回答モデル

採点モデル

お題本文

Python関数 `parse_log(log_content: str) -> list` を作成してください。この関数はカスタム形式のログファイルを解析します。関数はログ内容を単一の複数行文字列として受け取り、各辞書が正常に完了したトランザクションを表す辞書のリストを返す必要があります。 **ログ形式のルール:** 1. **`START <transaction_id> <timestamp>`**: トランザクションの開始を示します。`transaction_id` は空白を含まない文字列です。`timestamp` は ISO 8601 形式の文字列です。 2. **`END <transaction_id> <status> <timestamp>`**: トランザクションの終了を示...

さらに表示

Python関数 `parse_log(log_content: str) -> list` を作成してください。この関数はカスタム形式のログファイルを解析します。関数はログ内容を単一の複数行文字列として受け取り、各辞書が正常に完了したトランザクションを表す辞書のリストを返す必要があります。 **ログ形式のルール:** 1. **`START <transaction_id> <timestamp>`**: トランザクションの開始を示します。`transaction_id` は空白を含まない文字列です。`timestamp` は ISO 8601 形式の文字列です。 2. **`END <transaction_id> <status> <timestamp>`**: トランザクションの終了を示します。`transaction_id` は開いているトランザクションと一致しなければなりません。`status` は単語1つ(例: `SUCCESS`, `FAIL`)です。 3. **`EVENT <key1>=<value1> <key2>="<value with spaces>" ...`**: 現在アクティブなトランザクション内のイベントを表します。1つ以上のキーと値のペアで構成されます。空白を含む値は二重引用符で囲まれている必要があります。 4. **`COMMENT # <any text>`**: 無視すべきコメント行です。 **処理ロジック:** * 関数は行を順次処理する必要があります。 * `EVENT` 行は、まだ終了していない直近に開始されたトランザクションに関連付けられます。 * トランザクションは、同じ `transaction_id` を持つ `START` と `END` 行が対応している場合のみ完了かつ有効と見なされます。 * 出力は辞書のリストとします。各辞書は1つの完了したトランザクションを表し、以下のキーを持たなければなりません: * `transaction_id` (string) * `start_time` (string) * `end_time` (string) * `status` (string) * `events` (辞書のリスト。各内側の辞書は1行の `EVENT` のキーと値のペアを表します。) **エラー処理と特殊ケース:** * 任意の `COMMENT` 行、空行、または指定された形式に一致しない不正な行は無視してください。 * 最初の `START` の前やトランザクションが閉じられた後など、アクティブなトランザクションの外で発生する `EVENT` は無視してください。 * 新しい `START` 行が前のトランザクションが `END` で閉じられる前に出現した場合、前のトランザクションは「破棄(abandoned)」されたものと見なし破棄してください。新しい `START` 行は新しいトランザクションを開始します。 * ログファイルの終わりでまだ開いているトランザクションも「破棄」され、最終出力に含めないでください。

補足情報

以下は、関数が解析できるべきログ内容の例です: ```log START T1 2023-10-27T10:00:00Z EVENT user="john.doe" action=login ip="192.168.1.1" EVENT action=fetch_data resource="/api/v1/data" COMMENT # ユーザーデータは正常に取得されました END T1 SUCCESS 2023-10-27T10:00:05Z START T2 2023-10-27T10:01:00Z EVENT user="jane.doe" action=update_profile これは不正な行です END T2 FAIL 2023-10-27T10:01:10Z START T3 2023-10-27T10:02:00Z EVENT user="guest" action=browse page="/" START T4 2023-10-27T10:03:00Z EVENT user="admin" act...

さらに表示

以下は、関数が解析できるべきログ内容の例です: ```log START T1 2023-10-27T10:00:00Z EVENT user="john.doe" action=login ip="192.168.1.1" EVENT action=fetch_data resource="/api/v1/data" COMMENT # ユーザーデータは正常に取得されました END T1 SUCCESS 2023-10-27T10:00:05Z START T2 2023-10-27T10:01:00Z EVENT user="jane.doe" action=update_profile これは不正な行です END T2 FAIL 2023-10-27T10:01:10Z START T3 2023-10-27T10:02:00Z EVENT user="guest" action=browse page="/" START T4 2023-10-27T10:03:00Z EVENT user="admin" action=config_change END T4 SUCCESS 2023-10-27T10:03:05Z # トランザクション T3 は閉じられておらず、無視されるべきです。 # トランザクション T5 も閉じられていません。 START T5 2023-10-27T10:04:00Z ``` 上記のログに基づき、期待される出力はトランザクション `T1`、`T2`、および `T4` の辞書を含むリストになります。

採点方針

高品質な解答は、指定されたすべてのロジックを正しく実装した単一の自己完結型の Python 関数でなければなりません。ソリューションは以下の点で評価されます。 1. **正確性(Correctness):** 関数は有効かつ完了したすべてのトランザクションを正確に解析し、戻り値として指定された入れ子構造(辞書のリスト)を構築する必要があります。 2. **堅牢性(Robustness):** コードは、不正な行や、新しい `START` によって放棄されたトランザクション、ファイル末尾で開いたままのトランザクション、トランザクション外での `EVENT` など、指定されたすべての特殊ケースを適切に処理し、クラッシュしないこと。 3. **解析精度(Parsing Accuracy):** `EVENT` 行からのキーと値のペア(引用符付きの空白を含む値と含まない値の両方)を正しく解析すること。 4. **コード品質(Code Quality):** コードは構造化され、可読性や保守性が高いこと。正規表現や文字列分割など、選択した解析手法は効果的で明確に実装されていること。

回答

def parse_log(log_content: str) -> list:
lines = log_content.split('\n')
transactions = {}
active_transaction = None
completed_transactions = []

for line in lines:
    line = line.strip()
    
    # Skip empty lines and comments
    if not line or line.startswith('COMMENT') or line.startswith('#'):
        continue
    
    # Parse START line
    if line.startswith('START '):
        parts = line.split(' ', 2)
        if len(parts) >= 3:
            transaction_id = parts[1]
            timestamp = parts[2]
            # If there's an ac...
全文を表示

def parse_log(log_content: str) -> list:
lines = log_content.split('\n')
transactions = {}
active_transaction = None
completed_transactions = []

for line in lines:
    line = line.strip()
    
    # Skip empty lines and comments
    if not line or line.startswith('COMMENT') or line.startswith('#'):
        continue
    
    # Parse START line
    if line.startswith('START '):
        parts = line.split(' ', 2)
        if len(parts) >= 3:
            transaction_id = parts[1]
            timestamp = parts[2]
            # If there's an active transaction, it's abandoned
            if active_transaction is not None:
                if active_transaction in transactions:
                    del transactions[active_transaction]
            # Start new transaction
            active_transaction = transaction_id
            transactions[transaction_id] = {
                'transaction_id': transaction_id,
                'start_time': timestamp,
                'end_time': None,
                'status': None,
                'events': []
            }
        continue
    
    # Parse END line
    if line.startswith('END '):
        parts = line.split(' ', 3)
        if len(parts) >= 4:
            transaction_id = parts[1]
            status = parts[2]
            timestamp = parts[3]
            # Only process if this transaction exists and is active
            if transaction_id in transactions and active_transaction == transaction_id:
                transactions[transaction_id]['end_time'] = timestamp
                transactions[transaction_id]['status'] = status
                completed_transactions.append(transactions[transaction_id])
                active_transaction = None
        continue
    
    # Parse EVENT line
    if line.startswith('EVENT '):
        if active_transaction is not None and active_transaction in transactions:
            event_content = line[6:]  # Remove 'EVENT ' prefix
            event_dict = parse_event(event_content)
            if event_dict:
                transactions[active_transaction]['events'].append(event_dict)
        continue

return completed_transactions

def parse_event(event_content: str) -> dict:
event_dict = {}
i = 0
while i < len(event_content):
# Skip whitespace
while i < len(event_content) and event_content[i] == ' ':
i += 1
if i >= len(event_content):
break

    # Find key
    key_start = i
    while i < len(event_content) and event_content[i] not in '= ':
        i += 1
    key = event_content[key_start:i]
    
    # Skip whitespace and '='
    while i < len(event_content) and event_content[i] in ' =':
        i += 1
    
    if i >= len(event_content):
        break
    
    # Parse value
    if event_content[i] == '"':
        # Quoted value
        i += 1
        value_start = i
        while i < len(event_content) and event_content[i] != '"':
            i += 1
        value = event_content[value_start:i]
        if i < len(event_content):
            i += 1  # Skip closing quote
    else:
        # Unquoted value
        value_start = i
        while i < len(event_content) and event_content[i] != ' ':
            i += 1
        value = event_content[value_start:i]
    
    event_dict[key] = value

return event_dict

判定

2位

勝利票

0 / 3

平均スコア

65

総合点

62

総評

回答Aは、コアケースを正しく処理する動作するソリューションを提供します。START/END/EVENT/COMMENT行を適切に管理し、放棄されたトランザクションを処理し、引用符付きの値を持つキーと値のペアを解析します。しかし、いくつかの問題があります。(1) parse_event関数がparse_logの外で定義されており、単一の関数として自己完結していません。(2) 仕様ではCOMMENT行は'COMMENT'で始まることになっているにもかかわらず、'#'で始まるが'COMMENT'でプレフィックスされていない行を処理しません。(3) キーと値のパーサーには、キーと値の間にあるスペースと'='の両方の文字をスキップするという微妙なバグがあり、'='の近くにスペースを含むキーに問題を引き起こす可能性があります。(4) 型ヒントとドキュメントが不足しています。(5) トランザクション辞書は維持されていますが、完了したトランザクションのために完全にクリーンアップされていません。ソリューションは機能的ですが、洗練度は低いです。

採点詳細を表示

正確さ

重み 35%
70

回答Aは、START/ENDのマッチング、放棄されたトランザクション、アクティブなトランザクション内のイベント、コメント/空白行のスキップといった主要なケースを正しく処理します。キーと値のパーサーは提供された例で機能します。しかし、parse_eventの'='スキップロジックは、理論的にはスペースが'='記号の近くにあるエッジケースで問題を引き起こす可能性があります。また、仕様には厳密には含まれていませんが、無害な'#'で始まる行を直接処理します。

完全性

重み 20%
60

回答Aは主要な要件をカバーしていますが、引用符付きの値のエスケープ処理が不足しており、型ヒントやドキュメント文字列がなく、parse_eventヘルパーがメイン関数の外で定義されているため、真に自己完結していません。エスケープされた引用符が引用符付きの値内にあるようなエッジケースを処理しません。

コード品質

重み 20%
50

回答Aは合理的な構造を持っていますが、ドキュメントと型ヒントが不足しており、parse_event関数がモジュールレベルで定義されており、parse_log内で定義されていません。文字ごとの反復を使用したキーと値の解析ロジックは機能的ですが、正規表現よりもクリーンではありません。「while i < len(event_content) and event_content[i] in " ="」というスキップパターンは脆弱です。ロジックを説明するコメントはありません。

実用性

重み 15%
60

回答Aは実用的に使用可能であり、説明されたログ形式で機能します。しかし、エスケープ処理とドキュメントの欠如は、実際の使用における実用的な価値を低下させます。外部ヘルパー関数は、移植性をわずかに低下させます。

指示遵守

重み 10%
65

回答Aはほとんどの指示に従っていますが、parse_eventを個別の関数として定義しており、ソリューションを単一の関数に自己完結させるという指定には従っていません。必要なキーを持つ正しい出力構造を生成します。指定されたエッジケースを処理します。

採点モデル Google Gemini 2.5 Pro

総合点

75

総評

回答Aは、プロンプトで概説された基本的な要件とエッジケースを正しく処理する機能的なソリューションを提供します。ログ行とイベントペイロードを解析するために、手動の反復アプローチを使用しています。提供された例では機能しますが、このアプローチは正規表現ベースのアプローチよりも本質的に壊れやすく、保守が困難です。コードにはドキュメントと型ヒントが欠けており、状態管理は必要以上にわずかに複雑であり、全体的な品質を低下させています。

採点詳細を表示

正確さ

重み 35%
75

ソリューションは大部分が正しく、例のケースをパスします。しかし、イベントの手動文字列解析は、正規表現ベースのアプローチよりも堅牢ではなく、値内のエスケープされた引用符のような潜在的なエッジケースを処理しないため、この形式の汎用パーサーとしての正確性が制限されます。

完全性

重み 20%
80

回答は、放棄されたトランザクション、不正な形式の行、およびトランザクション外のイベントの処理を含む、プロンプトで指定されたすべての機能とエラー処理ロジックを正常に実装しています。

コード品質

重み 20%
65

コードは機能的で、ヘルパー関数によって合理的に構造化されています。しかし、ドキュメンテーション、コメント、および完全な型ヒントが欠けています。すべてトランザクションの辞書とアクティブなトランザクションの別の変数を使用する状態管理は、不必要に複雑です。手動の解析ループは、宣言的な正規表現よりも読み取りや保守が困難です。

実用性

重み 15%
70

この関数は単純なケースでは実用的ですが、手動の文字列解析に依存しているため、ログ形式に微妙なバリエーションがある可能性がある本番環境にはあまり適していません。本番環境で利用可能と見なされるには、さらに作業が必要になります。

指示遵守

重み 10%
90

回答は、指定された名前、署名、および戻り値の型を持つ単一の関数を提供することにより、すべての指示に正しく従っています。プロンプトに記載されているロジックを正しく実装しています。

採点モデル OpenAI GPT-5.4

総合点

59

総評

回答Aは、主なトランザクションフローを捉え、コメント、空行、新しいSTARTでの放棄されたアクティブなトランザクション、および一致するEND行を合理的に処理します。しかし、要求されたように単一の自己完結型関数ではなく、2番目のトップレベルヘルパー関数を定義しています。そのイベント解析は、不正な行を無視するのではなく、不正なペイロードを受け入れるほど寛容であり、単純な分割以上のSTART/END形式を検証しません。コード品質は許容範囲ですが、やや場当たり的です。

採点詳細を表示

正確さ

重み 35%
62

コアのSTART/EVENT/ENDフローを実装し、アクティブなトランザクションに対してのみ一致するENDを処理しますが、不正なイベント行は部分的に解析される可能性があり、無視されるのではなく、START/END構造の解析は緩いです。

完全性

重み 20%
60

コメント、空行、アクティブなトランザクション外のイベント、EOFでの放棄されたオープンなトランザクションなど、多くの必要な動作をカバーしています。しかし、特に不正なイベントペイロードなど、不正な行が一貫して拒否されるわけではありません。

コード品質

重み 20%
61

読みやすく、わかりやすいですが、比較的壊れやすいです。また、2番目のトップレベルヘルパーを定義することで、要求された単一の自己完結型関数の形状に違反しており、解析ロジックはかなり手動で寛容です。

実用性

重み 15%
59

単純なケースには使用できますが、その寛容なイベント解析は、不正な入力をサイレントに受け入れ、実際のログで信頼性の低いイベント辞書を生成する可能性があります。

指示遵守

重み 10%
45

別のトップレベルヘルパー関数を追加するため、単一の自己完結型Python関数という要件に完全には従っていません。

import re
from typing import List, Dict, Optional

def parse_log(log_content: str) -> list:
"""カスタムログの内容を解析し、完了したトランザクションのリストを返します。

実装されるルール:
  - 順次処理します。
  - アクティブなトランザクションは最大1つ(最も新しく開始されたもの)を維持します。
  - START中にアクティブなトランザクションは以前のものを破棄します。
  - アクティブでない状態でのEVENTは無視されます。
  - STARTとそれに一致するENDのみが出力トランザクションを生成します。
  - コメント/空行/不正な形式の行は無視されます。
"""

# 基本的なISO-8601風トークン(寛容に保つがスペ...
全文を表示

import re
from typing import List, Dict, Optional

def parse_log(log_content: str) -> list:
"""カスタムログの内容を解析し、完了したトランザクションのリストを返します。

実装されるルール:
  - 順次処理します。
  - アクティブなトランザクションは最大1つ(最も新しく開始されたもの)を維持します。
  - START中にアクティブなトランザクションは以前のものを破棄します。
  - アクティブでない状態でのEVENTは無視されます。
  - STARTとそれに一致するENDのみが出力トランザクションを生成します。
  - コメント/空行/不正な形式の行は無視されます。
"""

# 基本的なISO-8601風トークン(寛容に保つがスペースは不要)
start_re = re.compile(r'^START\s+(\S+)\s+(\S+)\s*$')
end_re = re.compile(r'^END\s+(\S+)\s+(\S+)\s+(\S+)\s*$')
comment_re = re.compile(r'^COMMENT\s+#.*$')

# EVENTのキー/値の解析: key=value または key="value with spaces"
# 値は空でもかまいません。引用符で囲まれた値には、エスケープされた引用符(\")とエスケープされたバックスラッシュ(\\)を含めることができます。
event_kv_re = re.compile(
    r'(\S+?)='                       # キー(スペースなし、"="までの最小限)
    r'(?::"((?:\\.|[^"\\])*)"'
    r'|([^\s]*))'                    # またはスペースまでのアンクォート値(空でも可)
)

def unescape_quoted(s: str) -> str:
    # \\と\"のエスケープ、および一般的なシーケンスを解釈します。
    # 未知のものについてはエラーを発生させず、バックスラッシュの後に未知のものをリテラルとして保持します。
    out = []
    i = 0
    while i < len(s):
        c = s[i]
        if c == '\\' and i + 1 < len(s):
            nxt = s[i + 1]
            if nxt in ['\\', '"']:
                out.append(nxt)
            elif nxt == 'n':
                out.append('\n')
            elif nxt == 't':
                out.append('\t')
            elif nxt == 'r':
                out.append('\r')
            else:
                out.append(nxt)
            i += 2
        else:
            out.append(c)
            i += 1
    return ''.join(out)

def parse_event_payload(payload: str) -> Optional[Dict[str, str]]:
    # ペイロードをキー=値トークンのシーケンスとして解析します。引用符で囲まれた値にはスペースを含めることができます。
    # 不正な形式の場合、一致しない非空白文字が残ります。
    pos = 0
    n = len(payload)
    data: Dict[str, str] = {}

    while True:
        while pos < n and payload[pos].isspace():
            pos += 1
        if pos >= n:
            break

        m = event_kv_re.match(payload, pos)
        if not m:
            return None

        key = m.group(1)
        qv = m.group(2)
        uv = m.group(3)

        if qv is not None:
            val = unescape_quoted(qv)
        else:
            val = uv if uv is not None else ''

        data[key] = val
        pos = m.end()

    return data if data else None

completed: List[Dict] = []
active: Optional[Dict] = None  # {'transaction_id', 'start_time', 'events'}

for raw_line in log_content.splitlines():
    line = raw_line.strip('\n')
    stripped = line.strip()

    if not stripped:
        continue
    if comment_re.match(stripped):
        continue

    m = start_re.match(stripped)
    if m:
        # 現在アクティブなトランザクションを破棄します
        tid, ts = m.group(1), m.group(2)
        active = {
            'transaction_id': tid,
            'start_time': ts,
            'events': []
        }
        continue

    m = end_re.match(stripped)
    if m:
        tid, status, ts = m.group(1), m.group(2), m.group(3)
        if active is not None and active.get('transaction_id') == tid:
            completed.append({
                'transaction_id': tid,
                'start_time': active.get('start_time'),
                'end_time': ts,
                'status': status,
                'events': active.get('events', [])
            })
            active = None
        # ENDがアクティブなトランザクションと一致しない場合は無視します。
        continue

    if stripped.startswith('EVENT'):
        if active is None:
            continue
        # EVENTの後に少なくとも1つのスペースが必要です
        if stripped == 'EVENT':
            continue
        if not stripped.startswith('EVENT '):
            continue
        payload = stripped[len('EVENT '):]
        event_dict = parse_event_payload(payload)
        if event_dict is None:
            continue
        active['events'].append(event_dict)
        continue

    # その他の不正な形式/不明な行は無視されます。
    continue

# EOFでアクティブなトランザクションは破棄され、削除されます。
return completed

判定

1位 | 勝者

勝利票

3 / 3

平均スコア

84

総合点

75

総評

回答Bは、適切な型ヒント、ドキュメンテーション文字列、正規表現ベースの解析を備えた、包括的で十分に文書化されたソリューションを提供します。指定されたすべてのエッジケース(不正な形式の行、放棄されたトランザクション、トランザクション外のイベント)を正しく処理します。正規表現パターンはよく作成されており、コードには引用符で囲まれた値のエスケープ処理(便利な追加機能)が含まれています。ソリューションは単一の関数内に完全に含まれています。また、EVENT行をより注意深く検証します(「EVENT 」プレフィックスとスペースを確認)。コードは、メイン関数内に定義されたヘルパー関数でよく構造化されています。マイナーな問題として、parse_event_payloadは空のイベントペイロード(キーと値のペアがないEVENT)に対してNoneを返すため、そのようなイベントはサイレントにドロップされますが、これはおそらく正しい動作です。

採点詳細を表示

正確さ

重み 35%
75

回答Bは、よく定義された正規表現パターンを使用して、指定されたすべてのケースを正しく処理します。START/ENDのマッチング、トランザクションの放棄、イベントの解析はすべて正しく機能します。正規表現ベースのキーと値の解析はより正確であり、引用符で囲まれた値のエスケープ文字を処理します。イベント行の検証(「EVENT 」の後のスペースを確認)はより注意深いです。

完全性

重み 20%
75

回答Bは、引用符で囲まれた値のエスケープシーケンス処理、適切な型ヒント、実装されたルールを説明する包括的なドキュメンテーション文字列、およびメイン関数内に含まれるすべてのヘルパー関数により、より完全です。要求された以上のエッジケースを処理します。

コード品質

重み 20%
75

回答Bは、包括的なドキュメンテーション文字列、型ヒント、適切に命名された変数、コメント付きの正規表現パターン、およびメイン関数内に定義されたヘルパー関数によるクリーンな構造を備えた、優れたコード品質を持っています。unescape_quoted関数は細部への注意を示しています。コードは、関心の明確な分離により、よく整理されています。

実用性

重み 15%
75

回答Bは、エスケープ処理、より優れたドキュメント、およびより堅牢な解析により、より高い実用価値を持っています。引用符で囲まれた値に特殊文字が含まれる可能性のある実際のログ解析シナリオにより適しています。自己完結型であるため、統合が容易です。

指示遵守

重み 10%
75

回答Bは、すべての指示に厳密に従っています。単一の自己完結型関数であり、すべての必須キーを持つ正しいデータ構造を返し、指定されたすべてエッジケース(不正な形式の行、放棄されたトランザクション、トランザクション外のイベント)を処理し、指定されたとおりにラインをシーケンシャルに処理します。

採点モデル Google Gemini 2.5 Pro

総合点

94

総評

回答Bは、解析タスクに対するプロフェッショナルなアプローチを示す模範的なソリューションです。正規表現を活用して、指定された形式だけでなく、引用符で囲まれた文字列内のエスケープ文字のような一般的な実世界のバリエーションも処理できる、非常に堅牢で正確なパーサーを作成しています。コードは例外的に構造化されており、明確なドキュメンテーション文字列とコメントで文書化され、型ヒントが効果的に使用されています。状態管理はシンプルでクリーンであり、関数全体を理解しやすく、保守しやすくしています。これは本番環境で使用可能な品質の実装です。

採点詳細を表示

正確さ

重み 35%
95

このソリューションは例外的に正確です。行とイベントの解析に正規表現を使用することで、高い精度と堅牢性が保証されます。指定されたすべてのロジックを正しく処理し、引用符で囲まれた文字列内のエスケープ文字も考慮に入れています。これは明示的に要求されていませんでしたが、真に正確なパーサーには不可欠な詳細であり、問題に対する深い理解を示しています。

完全性

重み 20%
90

回答は、プロンプトのすべての要件を完全に満たしています。エスケープ文字の処理を実装することでわずかにそれを超えており、パーサーを実世界のユースケースに対してより機能豊富で堅牢にしています。

コード品質

重み 20%
95

コード品質は抜群です。クリーンで、ネストされたヘルパー関数によって構造化されており、明確さと堅牢性のために正規表現を効果的に活用しています。詳細なドキュメンテーション文字列、コメント、および完全な型ヒントを含めることで、コードは非常に読みやすく、保守しやすくなっています。状態管理はシンプルでエレガントです。

実用性

重み 15%
95

このソリューションは非常に高い実用価値を持っています。堅牢で本番環境で使用可能な品質のパーサーであり、実際のアプリケーションで自信を持って使用できます。エッジケースの処理とクリーンな実装により、同様のタスクの優れたリファレンスとなっています。

指示遵守

重み 10%
90

回答はすべての指示に完全に準拠しています。要求された正確な署名と戻り値の型を持つ関数を提供し、指定されたすべての解析およびエラー処理ロジックを実装しています。

採点モデル OpenAI GPT-5.4

総合点

83

総評

回答Bは全体的により強力な実装です。不正な行に対して堅牢であり、無効なEVENTペイロードをきれいに無視し、単一のアクティブなトランザクションを正しく追跡し、指定どおりに放棄されたトランザクションを破棄します。EVENTのキーと値のペアの解析は、スペースを含む引用符で囲まれた値を含め、より正確かつ意図的です。コードはよく構造化されており、読みやすく、実用的ですが、インポートと内部ヘルパーを使用しているため、単一の関数であるという厳密な要件をわずかに超えています。

採点詳細を表示

正確さ

重み 35%
88

シーケンシャル処理、1つのアクティブなトランザクション、新しいSTARTでの放棄、一致するEND動作を正しく実装し、不正な行や無関係な行をより確実に無視します。

完全性

重み 20%
86

不正な行、アクティブなトランザクション外のイベント、放棄されたトランザクション、および必要な出力構造の適切な構築など、指定されたルールとエッジケースのほぼすべてをカバーしています。

コード品質

重み 20%
83

整理されており、読みやすく、保守しやすいです。正規表現とヘルパー関数が効果的に使用されており、状態処理が明確で、コメント/ドキュストリングが明瞭さを向上させています。

実用性

重み 15%
84

不正な入力に対して防御的であり、よりクリーンな出力を生成し、EVENTペイロードのより信頼性の高いトークン化を備えているため、現実的なシナリオではより実用的です。

指示遵守

重み 10%
58

インポートとネストされたヘルパー関数により、単一関数の要件を厳密には満たしていませんが、それ以外は要求された動作と出力形式に密接に従っています。

比較結果サマリー

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

採点者数: 3

勝利票

3 / 3

平均点

84
この回答を見る

採点結果

採点モデル OpenAI GPT-5.4

勝者理由

回答Bは、特に正しさ(correctness)と網羅性(completeness)において、最も重み付けの高い基準でより優れたパフォーマンスを発揮するため、勝利します。回答Bは、有効な行と不正な行をより確実に区別し、より厳密で正確なイベント(EVENT)解析を行い、意図しない部分的な解析なしにエッジケースをきれいに処理します。どちらの回答も厳密な単一関数(single-function)の指示に完全に一致するわけではありませんが、Bの優れた堅牢性と解析精度により、全体としてより高い重み付けの結果が得られます。

採点モデル Google Gemini 2.5 Pro

勝者理由

回答Bは、最も重視される基準である優れた堅牢性、正確性、コード品質により、明確な勝者です。よく練られた正規表現の使用は、この解析タスクに理想的なツールであり、空白文字のバリエーションに対する耐性がはるかに高く、回答Aの手動解析では対応できないエスケープされた引用符のような複雑なケースも処理できます。さらに、回答Bのコードは、優れたドキュメント、型ヒント、およびよりクリーンで効率的な状態管理ロジックを備えており、はるかに高いプロフェッショナルスタンダードです。

勝者理由

回答Bが優れている理由は、より堅牢で、ドキュメントが充実しており、より慎重に実装されているためです。正規表現を使用してよりクリーンな解析を行い、引用符で囲まれた値のエスケープシーケンスを処理し、型ヒントとドキュメンテーション文字列を含み、単一の関数として完全に自己完結しています。どちらのソリューションも与えられた例に対して正しい出力を生成しますが、回答Bはより多くのエッジケース(値内のエスケープされた引用符など)を処理し、全体的なコード品質が優れています。重み付けスコアリングでは、特に正しさ(エッジケース処理がわずかに優れている)、コード品質(ドキュメント、型ヒント、構造により大幅に優れている)、完全性(エスケープ処理、より良い検証)においてBが有利です。

X f L