day 10
parent
0b6976dd86
commit
6541e2362a
@ -0,0 +1,73 @@
|
|||||||
|
(* Common util. Should probably put this in a module or something.. *)
|
||||||
|
let get_one_line file =
|
||||||
|
try Some (input_line file) with
|
||||||
|
End_of_file -> None
|
||||||
|
|
||||||
|
let get_lines file =
|
||||||
|
let rec input lines =
|
||||||
|
match get_one_line file with
|
||||||
|
Some line -> input (line :: lines)
|
||||||
|
| None -> List.rev lines
|
||||||
|
in input []
|
||||||
|
|
||||||
|
let read_file file =
|
||||||
|
let channel = open_in(file) in
|
||||||
|
get_lines channel
|
||||||
|
|
||||||
|
let (>>) f g x = g(f(x))
|
||||||
|
|
||||||
|
let list_max l = List.fold_left (fun acc x -> if x > acc then x else acc) (List.hd l) l
|
||||||
|
|
||||||
|
let map_tuple f (a, b) = (f a, f b)
|
||||||
|
|
||||||
|
let memo_rec f =
|
||||||
|
let h = Hashtbl.create 1000 in
|
||||||
|
let rec g x =
|
||||||
|
try Hashtbl.find h x
|
||||||
|
with Not_found ->
|
||||||
|
let y = f g x in
|
||||||
|
Hashtbl.add h x y;
|
||||||
|
y
|
||||||
|
in g
|
||||||
|
|
||||||
|
(* --- *)
|
||||||
|
|
||||||
|
let rec collect_diffs = function
|
||||||
|
| x :: y :: [] -> [y - x] (* 2 elemnts left *)
|
||||||
|
| x :: y :: z -> y - x :: collect_diffs (y :: z)
|
||||||
|
|
||||||
|
let count_steps = (* returns a tuple of counts of 1's and 3's *)
|
||||||
|
List.partition (Int.equal 1)
|
||||||
|
>> map_tuple List.length
|
||||||
|
|
||||||
|
let count_valid self = function
|
||||||
|
| x :: y :: [] -> if y - x < 4 then 1 else 0
|
||||||
|
| x :: y :: rest ->
|
||||||
|
if y - x > 3
|
||||||
|
then 0
|
||||||
|
else self (x :: rest) + self (y :: rest)
|
||||||
|
|
||||||
|
let count_valid_memo = memo_rec count_valid
|
||||||
|
|
||||||
|
let () =
|
||||||
|
let lines = read_file "day10.txt"
|
||||||
|
|> List.map int_of_string
|
||||||
|
in
|
||||||
|
|
||||||
|
let adapter_jolts = 3 + list_max lines in
|
||||||
|
|
||||||
|
let sorted = lines
|
||||||
|
|> List.cons adapter_jolts (* add our adapter *)
|
||||||
|
|> List.cons 0 (* add the outlet *)
|
||||||
|
|> List.sort (fun x y -> if x > y then 1 else if x < y then -1 else 0)
|
||||||
|
in
|
||||||
|
|
||||||
|
sorted
|
||||||
|
|> collect_diffs
|
||||||
|
|> count_steps
|
||||||
|
|> fun (x, y) -> x * y
|
||||||
|
|> Printf.printf "prod: %i\n";
|
||||||
|
|
||||||
|
sorted
|
||||||
|
|> count_valid_memo
|
||||||
|
|> Printf.printf "\nsum: %i\n"
|
@ -0,0 +1,110 @@
|
|||||||
|
160
|
||||||
|
34
|
||||||
|
123
|
||||||
|
159
|
||||||
|
148
|
||||||
|
93
|
||||||
|
165
|
||||||
|
56
|
||||||
|
179
|
||||||
|
103
|
||||||
|
171
|
||||||
|
44
|
||||||
|
110
|
||||||
|
170
|
||||||
|
147
|
||||||
|
98
|
||||||
|
25
|
||||||
|
37
|
||||||
|
137
|
||||||
|
71
|
||||||
|
5
|
||||||
|
6
|
||||||
|
121
|
||||||
|
28
|
||||||
|
19
|
||||||
|
134
|
||||||
|
18
|
||||||
|
7
|
||||||
|
66
|
||||||
|
90
|
||||||
|
88
|
||||||
|
181
|
||||||
|
89
|
||||||
|
41
|
||||||
|
156
|
||||||
|
46
|
||||||
|
8
|
||||||
|
61
|
||||||
|
124
|
||||||
|
9
|
||||||
|
161
|
||||||
|
72
|
||||||
|
13
|
||||||
|
172
|
||||||
|
111
|
||||||
|
59
|
||||||
|
105
|
||||||
|
51
|
||||||
|
109
|
||||||
|
27
|
||||||
|
152
|
||||||
|
117
|
||||||
|
52
|
||||||
|
68
|
||||||
|
95
|
||||||
|
164
|
||||||
|
116
|
||||||
|
75
|
||||||
|
78
|
||||||
|
180
|
||||||
|
81
|
||||||
|
47
|
||||||
|
104
|
||||||
|
12
|
||||||
|
133
|
||||||
|
175
|
||||||
|
16
|
||||||
|
149
|
||||||
|
135
|
||||||
|
99
|
||||||
|
112
|
||||||
|
38
|
||||||
|
67
|
||||||
|
53
|
||||||
|
153
|
||||||
|
2
|
||||||
|
136
|
||||||
|
113
|
||||||
|
17
|
||||||
|
145
|
||||||
|
106
|
||||||
|
31
|
||||||
|
45
|
||||||
|
169
|
||||||
|
146
|
||||||
|
168
|
||||||
|
26
|
||||||
|
36
|
||||||
|
118
|
||||||
|
62
|
||||||
|
65
|
||||||
|
142
|
||||||
|
130
|
||||||
|
1
|
||||||
|
140
|
||||||
|
84
|
||||||
|
94
|
||||||
|
141
|
||||||
|
122
|
||||||
|
22
|
||||||
|
48
|
||||||
|
102
|
||||||
|
60
|
||||||
|
178
|
||||||
|
127
|
||||||
|
73
|
||||||
|
74
|
||||||
|
87
|
||||||
|
182
|
||||||
|
35
|
Loading…
Reference in New Issue