implement sand dropping logic & pretty visuals

This commit is contained in:
ryan 2023-11-01 12:10:15 -07:00
parent c5c9b584c0
commit ceb0f04a78

View File

@ -5,12 +5,18 @@ type tile =
| Rock | Rock
| Sand | Sand
| Start | Start
| Path_D
| Path_L
| Path_R
let char_of_tile = function let char_of_tile = function
| Empty -> '.' | Empty -> ' '
| Rock -> '#' | Rock -> '#'
| Sand -> 'o' | Sand -> 'o'
| Start -> 'v' | Start -> 'v'
| Path_D -> '|'
| Path_L -> '/'
| Path_R -> '\\'
;; ;;
let parse_line line = let parse_line line =
@ -20,7 +26,18 @@ let parse_line line =
Result.get_or_failwith @@ parse_string ~consume:All vec_list line Result.get_or_failwith @@ parse_string ~consume:All vec_list line
;; ;;
let parse_lines lines start = let draw_rocks grid points =
let open Grid in
let _ =
points
|> List.reduce (fun a b ->
iter_region grid a b (fun pos -> grid.%(pos) <- Rock);
b)
in
()
;;
let parse_grid lines start =
let points = List.map parse_line lines in let points = List.map parse_line lines in
let lx, hx, ly, hy = let lx, hx, ly, hy =
points points
@ -40,209 +57,258 @@ let parse_lines lines start =
let width = hx - lx + (pad_x * 2) + 1 in let width = hx - lx + (pad_x * 2) + 1 in
let height = hy - ly + 1 in let height = hy - ly + 1 in
let start = Vec2.(start - extra) in let start = Vec2.(start - extra) in
let points = let open Grid in
points let grid = init ~width ~height (fun _ -> Empty) in
|> List.map (fun points -> points |> List.map (fun point -> Vec2.(point - extra))) grid.%(start) <- Start;
in points
points, start, width, height |> List.iter Fun.(List.map (fun point -> Vec2.(point - extra)) %> draw_rocks grid);
grid, start
;; ;;
let draw_rocks grid points = let rec drop_sand grid start draw_path =
let d = Vec2.(start + down) in
let l = Vec2.(d + left) in
let r = Vec2.(d + right) in
let open Grid in let open Grid in
let _ = match grid.%(start), grid.%(l), grid.%(d), grid.%(r) with
points | _, _, Some Empty, _ ->
|> List.reduce (fun a b -> if draw_path then grid.%(d) <- Path_D;
iter_region grid a b (fun pos -> grid.%(pos) <- Rock); drop_sand grid d draw_path
b) | _, Some Empty, _, _ ->
in if draw_path then grid.%(l) <- Path_L;
() drop_sand grid l draw_path
| _, _, _, Some Empty ->
if draw_path then grid.%(r) <- Path_R;
drop_sand grid r draw_path
| _, _, None, _ -> Error ()
| Some Empty, _, _, _ ->
grid.%(start) <- Sand;
Ok ()
| _, _, _, _ -> failwith "pain"
;;
let rec drop_all_sand grid start =
match drop_sand grid start false with
| Ok () -> drop_all_sand grid start
| Error _ -> ()
;;
let%expect_test "Day 14 example" =
let lines = [ "498,4 -> 498,6 -> 496,6"; "503,4 -> 502,4 -> 502,9 -> 494,9" ] in
let start = Vec2.of_tuple (500, 0) in
let grid, start = parse_grid lines start in
let show_grid () = Printf.printf "%s" @@ Grid.draw grid char_of_tile in
show_grid ();
[%expect
{|
v
# ##
# #
### #
#
#
######### |}];
drop_all_sand grid start;
let _ = drop_sand grid start true in
show_grid ();
[%expect
{|
v
|
/o
/ooo
/#ooo##
/o#ooo#
/###ooo#
| oooo#
/o ooooo#
/######### |}]
;; ;;
let%expect_test "Day 14 example" = let%expect_test "Day 14 example" =
(* let lines = [ "498,4 -> 498,6 -> 496,6"; "503,4 -> 502,4 -> 502,9 -> 494,9" ] in *)
let lines = Utils.lines_of_input 14 in let lines = Utils.lines_of_input 14 in
let start = Vec2.of_tuple (500, 0) in let start = Vec2.of_tuple (500, 0) in
let points, start, width, height = parse_lines lines start in let grid, start = parse_grid lines start in
let grid = Grid.init ~width ~height (fun _ -> Empty) in drop_all_sand grid start;
points |> List.iter @@ draw_rocks grid; let _ = drop_sand grid start true in
grid.Grid.%(start) <- Start;
Printf.printf "w %d h %d\n" width height;
Printf.printf "%s" @@ Grid.draw grid char_of_tile; Printf.printf "%s" @@ Grid.draw grid char_of_tile;
[%expect [%expect
{| {|
w 75 h 174 v
..........v................................................................ |
........................................................................... |
........................................................................... |
........................................................................... |
........................................................................... |
........................................................................... |
........................................................................... |
........................................................................... |
........................................................................... oo\
........................................................................... oooo\
........................................................................... oooooo\
........................................................................... oooooooo\
........................................................................... ooo#oo#ooo\
........#..#............................................................... oooo#oo#oooo\
........#..#............................................................... #######oo######\
..#######..######.......................................................... # oooo #o\
..#.............#.......................................................... # oooooo #oo\
..#.............#.......................................................... # oooooooo #ooo\
..#.............#.......................................................... # oooooooooo #oooo\
..#.............#.......................................................... # oooooooooooo#ooooo\
..#.............#.......................................................... #ooooooooooooo#oooooo\
..#.............#.......................................................... #ooooooooooooo#ooooooo\
..#.............#.......................................................... ###############oooooooo\
..###############.......................................................... oooooooooo\
........................................................................... oooooooooooo\
........................................................................... ######oooooooo\
..............######....................................................... oooooooooo\
........................................................................... ###### ######oooooo\
...........######.######................................................... oooooooo\
........................................................................... ###### ###### ######oooo\
........######.######.######............................................... oooooo\
........................................................................... ###### ###### ###### ######oo\
.....######.######.######.######........................................... oooo\
........................................................................... ###### ###### ###### ###### ######\
..######.######.######.######.######....................................... |
........................................................................... |
........................................................................... |
........................................................................... |
........................................................................... /# #
....................................#.#.................................... /o# #
....................................#.#.................................... /#o# #
..................................#.#.#.................................... /o#o# #
..................................#.#.#.................................... /#o#o# #
................................#.#.#.#.................................... |#o#o# #
................................#.#.#.#.................................... |#o#o# #
................................#.#.#.#.................................... |#o#o# #
................................#.#.#.#.................................... |#######
................................#######.................................... |
........................................................................... oo\
........................................................................... #ooo\
.............................#............................................. #oooo\
.............................#............................................. # #ooooo\
.........................#...#............................................. # #ooo#o#\
.........................#...#...#.#....................................... # #ooo#o#|
.........................#...#...#.#....................................... # # #ooo#o#|
.........................#.#.#...#.#....................................... # # #o#o#o#|
.........................#.#.#.#.#.#....................................... # # #o#o#o#|
.........................#.#.#.#.#.#....................................... # # #o#o#o#|
.........................#.#.#.#.#.#....................................... # # #o#o#o#|
.........................#.#.#.#.#.#....................................... ###########|
.........................###########....................................... oo\
........................................................................... oooo\
........................................................................... #oooo#\
.................................#....#.................................... #oooo#|
.................................#....#.................................... #oooo#|
.................................#....#.................................... #########oooo##\
.........................#########....##................................... # oooooo#|
.........................#.............#................................... # ooooooo#|
.........................#.............#................................... # oooooooo#|
.........................#.............#................................... # ooooooooo#|
.........................#.............#................................... ###############|
.........................###############................................... |
........................................................................... |
........................................................................... #oo\
......................................#.................................... # #ooo\
..................................#...#.................................... # # #oooo\
................................#.#...#.................................... # # #ooo#o\
................................#.#...#...#................................ # # #ooo#o#\
................................#.#...#...#.#.............................. # # #o#o#o#o\
................................#.#...#.#.#.#.............................. # # #o#o#o#o#\
................................#.#...#.#.#.#.#............................ # # # #o#o#o#o#|
................................#.#.#.#.#.#.#.#............................ # # # #o#o#o#o#o\
................................#.#.#.#.#.#.#.#............................ # # # #o#o#o#o#oo\
................................#.#.#.#.#.#.#.#............................ ###############ooo\
................................###############............................ ooooo\
........................................................................... ooooooo\
........................................................................... # ooooooooo\
.........................................#................................. #############\
.........................................#############..................... oo\
........................................................................... oooo\
........................................................................... ######\
...................................................######.................. /o
........................................................................... /ooo
........................................................................... ######/######
................................................######.######.............. /o
........................................................................... /ooo
........................................................................... ######/###### ######
.............................................######.######.######.......... /o
........................................................................... /ooo
........................................................................... ######/###### ###### ######
..........................................######.######.######.######...... /o
........................................................................... /ooo
........................................................................... ######/###### ###### ###### ######
.......................................######.######.######.######.######.. |
........................................................................... |
........................................................................... /o
........................................................................... /ooo
........................................................................... /#oooo#
...........................................#....#.......................... /o######
...........................................######.......................... /ooo
........................................................................... /ooooo
........................................................................... /#ooooo#
.......................................#.....#............................. |#ooooo#
.......................................#.....#............................. /o#ooooo#
.......................................#.....#............................. /oo#ooooo#
.......................................#.....#............................. /####ooooo#######
....................................####.....#######....................... |# ooooooo #
....................................#..............#....................... |# ooooooooo #
....................................#..............#....................... |#ooooooooooo #
....................................#..............#....................... |#oooooooooooo #
....................................#..............#....................... |#ooooooooooooo #
....................................#..............#....................... |################
....................................################....................... /o
........................................................................... /ooo
........................................................................... /ooooo
........................................................................... /oo#ooo#
..................................#...#.................................... /ooo#####
..................................#####.................................... /ooooo
........................................................................... /ooooooo
........................................................................... /oo#oooo#o
..............................#....#....................................... /ooo#oooo#oo
..............................#....#....................................... /oooo#oooo#ooo
..............................#....#....................................... /######oooo#########
.........................######....#########............................... |# oooooo #
.........................#.................#............................... |# oooooooo #
.........................#.................#............................... |# oooooooooo #
.........................#.................#............................... /o# oooooooooooo #
.........................#.................#............................... /oo###################
.........................###################............................... /oooo
........................................................................... /oooooo
........................................................................... /######oo
....................######................................................. | oooo
........................................................................... | oooooo
........................................................................... | ######oo
.......................######.............................................. | oooo
........................................................................... /o###### ######
....................######.######.......................................... /ooo
........................................................................... /###### ###### ######
.................######.######.######...................................... |
........................................................................... |
........................................................................... |
........................................................................... # oo\
...........#............................................................... # oooo\
...........#............................................................... # oooo#o\
...........#.....#......................................................... #ooo#o#o#\
...........#...#.#.#....................................................... #ooo#o#o#|
...........#...#.#.#....................................................... #o#o#o#o#|
...........#.#.#.#.#....................................................... #o#o#o#o#|
...........#.#.#.#.#....................................................... #o#o#o#o#|
...........#.#.#.#.#....................................................... #o#o#o#o#|
...........#.#.#.#.#....................................................... #########|
...........#########....................................................... oo\
........................................................................... oooo\
........................................................................... ######\
.................######.................................................... /o
........................................................................... /ooo
........................................................................... ######/######
..............######.######................................................ /o
........................................................................... /ooo
........................................................................... ######/###### ######
...........######.######.######............................................ /o
........................................................................... /ooo
........................................................................... ######/###### ###### ###### |}]
........######.######.######.######........................................ |}]
;; ;;