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";
]
[]
|