|  | @@ -1,16 +1,7 @@
 | 
	
		
			
				|  |  |  open Base
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -let sample_list : int list = [
 | 
	
		
			
				|  |  | -    1721;
 | 
	
		
			
				|  |  | -    979;
 | 
	
		
			
				|  |  | -    366;
 | 
	
		
			
				|  |  | -    299;
 | 
	
		
			
				|  |  | -    675;
 | 
	
		
			
				|  |  | -    1456;
 | 
	
		
			
				|  |  | -]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  (* load the provided filename *)
 | 
	
		
			
				|  |  | -let load_list (filename : string) : int list =
 | 
	
		
			
				|  |  | +let load_list filename =
 | 
	
		
			
				|  |  |    let open Stdio.In_channel in
 | 
	
		
			
				|  |  |    let lines = with_file ~f:input_lines filename
 | 
	
		
			
				|  |  |    in List.map ~f:Int.of_string lines
 | 
	
	
		
			
				|  | @@ -19,31 +10,30 @@ let load_list (filename : string) : int list =
 | 
	
		
			
				|  |  |     have a non-parenthesized foreach! *)
 | 
	
		
			
				|  |  |  let (>>=) list fn = let _ = List.map ~f:fn list in None
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +let print_result = function
 | 
	
		
			
				|  |  | +  | None -> Stdio.printf "Unable to find result\n"
 | 
	
		
			
				|  |  | +  | Some xs ->
 | 
	
		
			
				|  |  | +     let lst = String.concat ~sep:" * " (List.map ~f:Int.to_string xs)
 | 
	
		
			
				|  |  | +     in Stdio.printf "Got (%s) = %d\n" lst (List.fold ~init:1 ~f:(fun x y -> x * y) xs)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  let part_one source =
 | 
	
		
			
				|  |  | -  let res = Base.With_return.with_return (fun r ->
 | 
	
		
			
				|  |  | +  With_return.with_return (fun r ->
 | 
	
		
			
				|  |  |      source >>= fun a ->
 | 
	
		
			
				|  |  |      source >>= fun b ->
 | 
	
		
			
				|  |  | -      if a <> b && a + b = 2020 then r.return (Some (a, b))
 | 
	
		
			
				|  |  | -    ) in
 | 
	
		
			
				|  |  | -  match res with
 | 
	
		
			
				|  |  | -  | None -> Stdio.printf "Unable to find result\n"
 | 
	
		
			
				|  |  | -  | Some (x, y) -> Stdio.printf "Got (%d * %d) = %d\n" x y (x * y)
 | 
	
		
			
				|  |  | +      if a <> b && a + b = 2020 then r.return (Some [a; b])
 | 
	
		
			
				|  |  | +    )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  let part_two source =
 | 
	
		
			
				|  |  | -  let res = Base.With_return.with_return (fun r ->
 | 
	
		
			
				|  |  | +  With_return.with_return (fun r ->
 | 
	
		
			
				|  |  |      source >>= fun a ->
 | 
	
		
			
				|  |  |      source >>= fun b ->
 | 
	
		
			
				|  |  |      source >>= fun c ->
 | 
	
		
			
				|  |  | -      if a <> b && b <> c && a <> c && a + b + c = 2020 then r.return (Some (a, b, c))
 | 
	
		
			
				|  |  | -    ) in
 | 
	
		
			
				|  |  | -  match res with
 | 
	
		
			
				|  |  | -  | None -> Stdio.printf "Unable to find result\n"
 | 
	
		
			
				|  |  | -  | Some (x, y, z) ->
 | 
	
		
			
				|  |  | -     Stdio.printf "Got (%d * %d * %d) = %d\n" x y z (x * y * z)
 | 
	
		
			
				|  |  | +      if a <> b && b <> c && a <> c && a + b + c = 2020 then r.return (Some [a; b; c])
 | 
	
		
			
				|  |  | +    )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  let main() =
 | 
	
		
			
				|  |  |    let source = load_list "input" in
 | 
	
		
			
				|  |  | -  part_one source;
 | 
	
		
			
				|  |  | -  part_two source
 | 
	
		
			
				|  |  | +  print_result (part_one source);
 | 
	
		
			
				|  |  | +  print_result (part_two source)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  let () = main()
 |