OCaml处理Advent of Code 2022输入时触发Invalid_argument错误求助
问题原因
你的错误来自read_lines函数返回的列表中包含空字符串。当文件末尾存在换行符时,String.split_on_char '\n'会把最后一个换行后的空内容也加入列表(比如你的input.txt最后一行可能带换行,导致列表变成["A X"; "B Y"; "C Z"; ""])。而scorer函数调用String.sub s 0 1和String.sub s 2 1时,空字符串的长度不足以支持这些操作,直接触发Invalid_argument异常。手动定义lines时不会包含空串,所以能正常运行。
修复方案
修改read_lines函数,过滤掉拆分后产生的空字符串:
let read_lines filename = let contents = In_channel.with_open_bin filename In_channel.input_all in contents |> String.split_on_char '\n' |> List.filter (fun s -> String.trim s <> "") (* 过滤空行,包括仅含空白的行 *)
如果确定输入行格式固定为3字符长度,也可以直接按长度过滤:
let read_lines filename = let contents = In_channel.with_open_bin filename In_channel.input_all in contents |> String.split_on_char '\n' |> List.filter (fun s -> String.length s >= 3)
额外优化建议
可以在scorer函数里增加输入合法性检查,避免异常崩溃:
let scorer s = if String.length s < 3 then 0 (* 或者抛出更明确的错误提示 *) else let theirs = match String.sub s 0 1 with | "A" -> "X" | "B" -> "Y" | "C" -> "Z" | _ -> assert false in let ours = String.sub s 2 1 in let played = match ours with "X" -> 1 | "Y" -> 2 | "Z" -> 3 | _ -> assert false in let result = match (theirs, ours) with | "X", "Y" | "Y", "Z" | "Z", "X" -> 6 | theirs, ours when theirs = ours -> 3 | _ -> 0 in played + result
内容的提问来源于stack exchange,提问作者bennouli
相关产品推荐
相关产品推荐

