FIX 风格 tag 取值:在管道分隔消息中取数字 tag 的首个值
FIX-Style Tag Extract: First Value for a Numeric Tag in a Pipe-Delimited Message
开始编码实现 solution(msg: str, tag: int) -> str。一条 FIX 风格的行情/订单消息由若干 key=value 键值对组成,键值对之间以 SOH 的替代字符 |(pipe)分隔,整体打成一个 ASCII 字符串。给定消息 msg 与一个整数 tag tag(>= 1),返回 tag 在消息中首个(最左侧)出现位置对应的 value;若 tag 不存在,返回 ""。
例如 solution("35=D|49=SENDER|56=TARGET|55=SYM-1|11=ORD-12345|", 11) 返回 "ORD-12345"。解析器从左向右扫一遍消息,将每段在首个 = 处切成 key/value 两半,并把整数 key 前缀与 str(tag) 比对。
需要明确的细节:tag <= 0 必须抛 ValueError,且这一校验最先执行——在检查 msg 之前(因此 solution("", 0) 抛 ValueError 而不是返回 "");tag 校验通过后,msg == "" 立即返回 "";尾部 | 合法,连续 || 也合法(空段静默跳过)。完全没有 = 的段(例如 "badpair")也静默跳过而非崩溃。空值(例如 "55=|")是合法的键值对,对 tag=55 返回 ""。同一个 tag 重复出现时,返回首次出现的值。
实现禁止使用 re 模块,只能用字符串索引与切片;解析器必须在 O(N) 内完成(N = len(msg))。
实现细节由 stubs/stub.py 提供。
实践背景
一个跑在 FIX session 上的行情归一化层每秒会看到成千上万条这样的 key=value 字符串:35=D 表示 new-order-single,11=ClOrdID,55=Symbol,49/56 是 sender/target comp ID 等。一个非常常见的工具函数就是"给我 tag X 的值,但不要重建整张 dict"——单条消息往往携带 30+ 个 tag,而每一跳通常只关心其中一两个,因此命中即返回的单趟扫描比把整段 split 成 dict 要明显便宜。之所以偏向"首次出现",是因为同一条消息体内 tag 重复多半是畸形喂送信号(或者是合规的 repeating-group,真正的 FIX 库会单独处理)——保留最早的那个值能让下游规则引擎依赖的原始顺序语义不被破坏。
约束条件
- 0 <= len(msg) <= 20000,其中 msg 为 FIX 风格管道分隔字符串
- 1 <= tag <= 99999;tag <= 0 必须抛 ValueError
- msg 使用 ASCII 可打印字符,结构分隔符只有 '|' 与 '='
- 允许尾部 '|';连续 '||' 视为一个空段并按畸形段静默跳过
- 输出为 Python str,使用精确比对;tag 不存在时返回 ""
样例
Case 1 · statement-example: tag 11 is ORD-12345
输入: ["35=D|49=SENDER|56=TARGET|55=SYM-1|11=ORD-12345|",11]
期望: "ORD-12345"
例题输入:tag 11 对应 ClOrdID,值为 'ORD-12345'。
Case 2 · visible: tag 35 at the very beginning is 'D'
输入: ["35=D|49=SENDER|56=TARGET|55=SYM-1|11=ORD-12345|",35]
期望: "D"
tag 35 位于首段,值为 'D'。
Case 3 · visible: tag 99 absent returns empty string
输入: ["35=D|49=SENDER|56=TARGET|55=SYM-1|11=ORD-12345|",99]
期望: ""
消息中不存在 tag 99,返回 ''。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · statement-example: tag 11 is ORD-12345
输入: ["35=D|49=SENDER|56=TARGET|55=SYM-1|11=ORD-12345|",11]
期望: "ORD-12345"
例题输入:tag 11 对应 ClOrdID,值为 'ORD-12345'。
Case 2 · visible: tag 35 at the very beginning is 'D'
输入: ["35=D|49=SENDER|56=TARGET|55=SYM-1|11=ORD-12345|",35]
期望: "D"
tag 35 位于首段,值为 'D'。
Case 3 · visible: tag 99 absent returns empty string
输入: ["35=D|49=SENDER|56=TARGET|55=SYM-1|11=ORD-12345|",99]
期望: ""
消息中不存在 tag 99,返回 ''。