Make ints_of_string generic and move to lib.

This commit is contained in:
2024-12-05 15:43:18 +00:00
parent 3052751eb6
commit c6fb838463
3 changed files with 8 additions and 8 deletions

View File

@@ -39,13 +39,12 @@ let rec is_page_order_valid m pages =
encountering an empty line. Returns a pair [(rule_map, tail)]. encountering an empty line. Returns a pair [(rule_map, tail)].
[tail] starts the line after the empty line. *) [tail] starts the line after the empty line. *)
let parse_rules = let parse_rules =
let re = Str.regexp_string "|" in
let m = Hashtbl.create 17 in let m = Hashtbl.create 17 in
let rec impl = function let rec impl = function
| "" :: t -> (m, t) | "" :: t -> (m, t)
| [] -> failwith "parse_rules.impl" | [] -> failwith "parse_rules.impl"
| h :: t -> ( | h :: t -> (
match List.map int_of_string (Str.split re h) with match Aoc.ints_of_string ~sep:"|" h with
| [ a; b ] -> | [ a; b ] ->
add_rule a b m; add_rule a b m;
impl t impl t
@@ -55,10 +54,9 @@ let parse_rules =
(** [parse_page_orders lst] parses a list of page orders. *) (** [parse_page_orders lst] parses a list of page orders. *)
let parse_page_orders = let parse_page_orders =
let re = Str.regexp_string "," in
let rec impl acc = function let rec impl acc = function
| [] -> acc | [] -> acc
| h :: t -> impl (List.map int_of_string (Str.split re h) :: acc) t | h :: t -> impl (Aoc.ints_of_string ~sep:"," h :: acc) t
in in
impl [] impl []

View File

@@ -1,4 +1,6 @@
let ints_of_string s = List.map int_of_string (Str.split (Str.regexp " +") s) let ints_of_string ?(sep = " ") s =
List.map int_of_string (Str.split (Str.regexp sep) s)
let distance1 a b = abs (a - b) let distance1 a b = abs (a - b)
let strings_of_file fname = let strings_of_file fname =

View File

@@ -1,6 +1,6 @@
val ints_of_string : string -> int list val ints_of_string : ?sep:string -> string -> int list
(** [nums_from_string s] takes a string of space separated integers and gives (** [nums_from_string ?sep s] takes a string of integers separated by [sep] and
back a list of the integers. *) gives back a list of the integers. By default [sep] is " " *)
val distance1 : int -> int -> int val distance1 : int -> int -> int
(** [distance1 a b] returns the absolute difference between [a] and [b]. *) (** [distance1 a b] returns the absolute difference between [a] and [b]. *)