move grid parse & iter into Vec2
This commit is contained in:
1 parent
250d978a38
commit
fe5cd3666f
3 files changed
+24
-19
No files matched your search
+3
-18
@@ -1,28 +1,13 @@
|
|||||||
open Containers
|
open Containers
|
||||||
|
|
||||||
let parse_grid () =
|
let parse_grid () =
|
||||||
let lines = Utils.lines_of_input 8 in
|
Vec2.parse_grid Fun.(Char.to_string %> int_of_string) @@ Utils.lines_of_input 8
|
||||||
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
|
|
||||||
;;
|
;;
|
||||||
|
|
||||||
let part1 () =
|
let part1 () =
|
||||||
let grid = parse_grid () in
|
let grid = parse_grid () in
|
||||||
let num_visible = ref 0 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 start_height = Option.get_exn_or "unreachable" @@ Vec2.at grid start in
|
||||||
let rec walk_shorter_trees start step =
|
let rec walk_shorter_trees start step =
|
||||||
let next = Vec2.(start + step) in
|
let next = Vec2.(start + step) in
|
||||||
@@ -43,7 +28,7 @@ let part1 () =
|
|||||||
let part2 () =
|
let part2 () =
|
||||||
let grid = parse_grid () in
|
let grid = parse_grid () in
|
||||||
let best_score = ref 0 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 start_height = Option.get_exn_or "unreachable" @@ Vec2.at grid start in
|
||||||
let rec trees_in_view start in_view step =
|
let rec trees_in_view start in_view step =
|
||||||
let next = Vec2.(start + step) in
|
let next = Vec2.(start + step) in
|
||||||
|
|||||||
+17
@@ -1,6 +1,7 @@
|
|||||||
open Containers
|
open Containers
|
||||||
|
|
||||||
type t = int * int [@@deriving show]
|
type t = int * int [@@deriving show]
|
||||||
|
type 'a grid = 'a array array
|
||||||
|
|
||||||
let up = 0, 1
|
let up = 0, 1
|
||||||
let down = 0, -1
|
let down = 0, -1
|
||||||
@@ -19,3 +20,19 @@ let at grid point =
|
|||||||
let* row = Array.get_safe grid y in
|
let* row = Array.get_safe grid y in
|
||||||
Array.get_safe row x
|
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
|
||||||
|
;;
|
||||||
+4
-1
@@ -1,4 +1,5 @@
|
|||||||
type t [@@deriving show]
|
type t [@@deriving show]
|
||||||
|
type 'a grid
|
||||||
|
|
||||||
val up : t
|
val up : t
|
||||||
val down : 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 -> t
|
val ( - ) : t -> t -> t
|
||||||
val ( = ) : t -> t -> bool
|
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
|
||||||
Reference in new issue
Block a user