Compare commits

...

2 Commits

Author SHA1 Message Date
Rhiannon Morris 28af6b3b9e use Fun.protect in bracket 2020-12-03 16:49:28 +01:00
Rhiannon Morris 3c2e61176a just keep the strings 2020-12-03 16:48:58 +01:00
2 changed files with 11 additions and 25 deletions

View File

@ -1,7 +1,5 @@
let bracket ~make:(lazy x) ~act ~free = let bracket ~make:(lazy x) ~act ~free =
match act x with Fun.protect (fun () -> act x) ~finally:(fun () -> free x)
| result -> free x; result
| exception e -> free x; raise e
let infile ~act name = let infile ~act name =
bracket ~make:(lazy (open_in name)) ~act ~free:close_in_noerr bracket ~make:(lazy (open_in name)) ~act ~free:close_in_noerr

32
day3.ml
View File

@ -1,38 +1,26 @@
type space = Tree | Free type map = string array
type map = space array array
let (.%()) arr i = arr.(i mod Array.length arr) let (.%[]) str i = str.[i mod String.length str]
let (+=) r x = r := !r + x
let iter_map ?(step_x=1) ?(step_y=1) f arr = let iter_map ?(step_x=1) ?(step_y=1) f arr =
let i = ref 0 in let i = ref 0 in let j = ref 0 in
let j = ref 0 in
while !i < Array.length arr do while !i < Array.length arr do
f arr.(!i).%(!j); f arr.(!i).%[!j];
i := !i + step_x; i += step_x; j += step_y
j := !j + step_y
done done
exception Unknown_char of char let read_file = Bracket.infile_lines ~line:Fun.id ~of_seq:Array.of_seq
let make_line str =
Array.init (String.length str)
(fun i -> match str.[i] with
| '#' -> Tree
| '.' -> Free
| c -> raise (Unknown_char c))
let read_file = Bracket.infile_lines ~line:make_line ~of_seq:Array.of_seq
let count_trees ?step_x ?step_y map = let count_trees ?step_x ?step_y map =
let count = ref 0 in let count = ref 0 in
iter_map ?step_x ?step_y (function Tree -> incr count | _ -> ()) map; iter_map ?step_x ?step_y (fun c -> if c = '#' then incr count) map;
!count !count
let main1 input = let main1 input =
Format.printf "%d trees\n" Format.printf "%d\n" (count_trees ~step_y:3 (read_file input))
(count_trees ~step_y:3 (read_file input))
let main2 input = let main2 input =
let map = read_file input in let map = read_file input in
@ -47,7 +35,7 @@ let main = Misc.main 3 [|main1; main2|]
let%expect_test _ = let%expect_test _ =
main1 "../../data/day3"; main1 "../../data/day3";
[%expect{| 244 trees |}] [%expect{| 244 |}]
let%expect_test _ = let%expect_test _ =
main2 "../../data/day3"; main2 "../../data/day3";