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