summaryrefslogtreecommitdiff
path: root/2024/ocaml/lib/day_05/part_01.ml
blob: f32bef1de52d62a0aaaf13c9e96449479ada1908 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
(* 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 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";
    ]
    []