From fe5cd3666f148ad4a53b97b693c889f5e3a1da09 Mon Sep 17 00:00:00 2001 From: ryan Date: Mon, 9 Oct 2023 13:58:53 -0700 Subject: [PATCH] move grid parse & iter into Vec2 --- src/day8.ml | 21 +++------------------ src/vec2.ml | 17 +++++++++++++++++ src/vec2.mli | 5 ++++- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/day8.ml b/src/day8.ml index 13a74a1..5583f15 100644 --- a/src/day8.ml +++ b/src/day8.ml @@ -1,28 +1,13 @@ open Containers let parse_grid () = - let lines = Utils.lines_of_input 8 in - lines - |> Array.of_list - |> Array.map - Fun.(String.to_seq %> Seq.map (Char.to_string %> int_of_string) %> Seq.to_array) -;; - -let solve grid fn = - let grid_h = Array.length grid in - let grid_w = Array.length grid.(0) in - for y = 0 to grid_h - 1 do - for x = 0 to grid_w - 1 do - let start = Vec2.of_tuple (x, y) in - fn start - done - done + Vec2.parse_grid Fun.(Char.to_string %> int_of_string) @@ Utils.lines_of_input 8 ;; let part1 () = let grid = parse_grid () in let num_visible = ref 0 in - solve grid (fun start -> + Vec2.iter_grid grid (fun start -> let start_height = Option.get_exn_or "unreachable" @@ Vec2.at grid start in let rec walk_shorter_trees start step = let next = Vec2.(start + step) in @@ -43,7 +28,7 @@ let part1 () = let part2 () = let grid = parse_grid () in let best_score = ref 0 in - solve grid (fun start -> + Vec2.iter_grid grid (fun start -> let start_height = Option.get_exn_or "unreachable" @@ Vec2.at grid start in let rec trees_in_view start in_view step = let next = Vec2.(start + step) in diff --git a/src/vec2.ml b/src/vec2.ml index 020b938..775caf9 100644 --- a/src/vec2.ml +++ b/src/vec2.ml @@ -1,6 +1,7 @@ open Containers type t = int * int [@@deriving show] +type 'a grid = 'a array array let up = 0, 1 let down = 0, -1 @@ -19,3 +20,19 @@ let at grid point = let* row = Array.get_safe grid y in Array.get_safe row x ;; + +let parse_grid parse_char lines = + lines + |> Array.of_list + |> Array.map Fun.(String.to_seq %> Seq.map parse_char %> Seq.to_array) +;; + +let iter_grid grid callback = + let grid_h = Array.length grid in + let grid_w = Array.length grid.(0) in + for y = 0 to Int.(grid_h - 1) do + for x = 0 to Int.(grid_w - 1) do + callback (x, y) + done + done +;; diff --git a/src/vec2.mli b/src/vec2.mli index 0550c17..c7ecd57 100644 --- a/src/vec2.mli +++ b/src/vec2.mli @@ -1,4 +1,5 @@ type t [@@deriving show] +type 'a grid val up : t val down : t @@ -10,4 +11,6 @@ val to_tuple : t -> int * int val ( + ) : t -> t -> t val ( - ) : t -> t -> t val ( = ) : t -> t -> bool -val at : 'a array array -> t -> 'a option +val at : 'a grid -> t -> 'a option +val parse_grid : (char -> 'a) -> string list -> 'a grid +val iter_grid : 'a grid -> (t -> unit) -> unit