(* Day 5: Part 1 *) module StringMap = Map.Make (String) let inverse_page_rule page_rule = String.split_on_char '|' page_rule |> fun lst -> match lst with [] -> "" | _ :: _ -> String.concat "|" (List.rev lst) (** [parse_aux acc page_rules] is a map of all invalid transitions as defined by [page_rules] *) let rec get_invalid_transitions_aux acc page_rules : unit StringMap.t = match page_rules with | [] -> acc | h :: t -> get_invalid_transitions_aux (acc |> StringMap.add (inverse_page_rule h) ()) t let get_invalid_transitions page_rules = get_invalid_transitions_aux StringMap.empty page_rules (** [solve page_rules updates] is the solution for this puzzle, given the [page_rules] and a list of [updates]. BELOW DOESN'T WORK: no guarantee that second page comes immediately after the first - pass in updates to solve - make sliding window of 2 elements - invert element order and concat - check if key is in map from [parse page_rules], - if yes, then it is an illegal transition - if no, then add the list to a list for further processing *) let solve page_rules _ = let[@warning "-26"] invalid_transitions = get_invalid_transitions page_rules in () let _ = solve [ "47|53" ; "97|13" ; "97|61" ; "97|47" ; "75|29" ; "61|13" ; "75|53" ; "29|13" ; "97|29" ; "53|29" ; "61|53" ; "97|53" ; "61|29" ; "47|13" ; "75|47" ; "97|75" ; "47|61" ; "75|61" ; "47|29" ; "75|13" ; "53|13" ] []