blob: 96ff4869abc83ad46d5c3699b1e7728c0c208587 (
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
63
64
|
(* 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" ]
[]
|