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