changeset 69:64fc8f99bddd

Day 14 Part 1
author Lewin Bormann <lbo@spheniscida.de>
date Thu, 28 Dec 2023 12:08:35 +0100
parents cd6e3d6c1338
children 0fc36f81531e
files 2023/day13.ml 2023/day14.ml 2023/dune 2023/input/14.txt 2023/input/14_test.txt
diffstat 5 files changed, 184 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/2023/day13.ml	Sat Dec 23 21:39:38 2023 +0100
+++ b/2023/day13.ml	Thu Dec 28 12:08:35 2023 +0100
@@ -169,4 +169,3 @@
   Out_channel.(
     printf "score = %d\n" score;
     printf "new score = %d\n" new_score)
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/2023/day14.ml	Thu Dec 28 12:08:35 2023 +0100
@@ -0,0 +1,67 @@
+open Angstrom
+open Base
+open Core
+
+type tile = Round | Cube | Empty [@@deriving show, eq]
+type field = { rows : int; cols : int; fields : tile array } [@@deriving show]
+
+let rc_to_ix field r c = (r * field.cols) + c
+let field_get field r c = field.fields.(rc_to_ix field r c)
+
+let field_column field c =
+  Array.init field.rows ~f:(fun r -> field_get field r c)
+
+let field_of_tiles r c tiles =
+  { rows = r; cols = c; fields = Array.of_list tiles }
+
+let print_field ?(ch = Out_channel.stdout) field =
+  Out_channel.(output_string ch (show_field field))
+
+module Parse = struct
+  let parse_tile = function
+    | 'O' -> Round
+    | '#' -> Cube
+    | '.' -> Empty
+    | _ -> failwith "invalid tile"
+
+  let parse_row s = String.to_list s |> List.map ~f:parse_tile
+
+  let parse_field s =
+    let lines = String.split_lines s in
+    let rows = List.length lines and cols = String.length (List.hd_exn lines) in
+    let tile_rows = List.map lines ~f:parse_row in
+    let tiles = List.concat tile_rows in
+    field_of_tiles rows cols tiles
+end
+
+module Part1 = struct
+  type load_state = { sum : int; last_stop : int; since : int }
+
+  let calculate_column_load rows col =
+    let f ix ({ sum; last_stop; since } as a) = function
+      | Empty -> a
+      | Cube -> { a with last_stop = ix; since = 0 }
+      | Round ->
+          {
+            a with
+            sum = sum + (rows - last_stop - since - 1);
+            since = since + 1;
+          }
+    in
+    let result = Array.foldi col ~init:{ sum = 0; last_stop = -1; since = 0 } ~f in
+    result.sum
+
+  let calculate_column_loads field =
+    Array.init field.cols ~f:(fun c -> calculate_column_load field.rows (field_column field c))
+
+  let calculate_load field =
+    let column_loads = calculate_column_loads field in
+    Array.fold column_loads ~init:0 ~f:Int.(+)
+end
+
+let () =
+  let inp = In_channel.(input_all stdin) in
+  let field = Parse.parse_field inp in
+  let load = Part1.calculate_load field in
+  Out_channel.printf "load: %d\n" load
+
--- a/2023/dune	Sat Dec 23 21:39:38 2023 +0100
+++ b/2023/dune	Thu Dec 28 12:08:35 2023 +0100
@@ -100,3 +100,10 @@
  (libraries base core angstrom)
  (preprocess
   (pps ppx_let ppx_sexp_conv ppx_compare ppx_deriving.show ppx_deriving.eq)))
+
+(executable
+ (name day14)
+ (modules day14)
+ (libraries base core angstrom)
+ (preprocess
+  (pps ppx_let ppx_sexp_conv ppx_compare ppx_deriving.show ppx_deriving.eq)))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/2023/input/14.txt	Thu Dec 28 12:08:35 2023 +0100
@@ -0,0 +1,100 @@
+...###.#OO..#.O......#...#...O..#.....#...O#..O#........O.#O#O..O.....O.......#O.............O#.O###
+O.OOO..##O....#O.O.OO#......O...#O.........O....O..OO....#OOO.#..#..........O.O...##...#........O..#
+.#..O..O.#.....O...O.....#O.OOOO..O.#.O#OO.........O.#.O#O.O.#...O#..........OOO.#...#..O#..####O.OO
+.#..O....#.#..O.....O..O......O......O.O.O.#..O..#.OO.O.OOO..O#.O.##...OO.#.#.O..#...####O..#..#O...
+.##.O......#.OO.O.O...O.....##O.#.#.......##.O....O...O.O.####...#.....O#.O....#O.#..O......O.......
+O.###.#.#.O.O........#O.#.#..O#.#.OO....#O....O..##.#O.#.O.###.#..#..#.#.O....#..O......OO.#OO#...O#
+.....O..O#..O.O...O....#O#.O.#O...O##OO.O.#O....#.#.....#..O#...#..##....#.OOO..#O.....#..#O#OO.O...
+#............O#O.#.#.....O.O..OO....#....#..OO#.#O.OOO..#O...O#.....#.O....O.O..#....O..#...#OO#....
+..#.#O#..OO.O...##..#......#OO.....#.#.#.....#.O.....O.......#.##.......#O..OOO...........O.....O.O.
+......O#O......OO#..O.#O..O..#....O..O.........O...#.#.##.O....O..O..O..O#.O.O.OOOOO....O#.O.......#
+O##...O#...#..#.O.....#.O.###.O......#..#..O.#.O..........O..#.O.......#O......#.O.##....#.#.#...#..
+#..#.O..#..........#.O.#.O....#O#...OOOO......#...#.O.....O.OO.O....#.......O.O....O.O#.#O.###O.OO.#
+OO.O#.O.......#.OO##....#O.#.O...O..#O.OO.....O..O#..##.O#...O...O.#.#O..O..O#........OO#.....O#..##
+......O....O...#O##....OOO..O.O..O.......OO#O....###..O..##...O#.#.O.O..O.OO##....O.O#..O.#.#O#.#...
+..O....#.....O..O.OO#..#.##..........#OO...#..#.O...O.O#...#....O.O..O...O....OO...O..OO#O....O..#O.
+O....OO............O#.#........#..O.O...#OOO#.............#...OO......O#......O..O....OO...O..O...O.
+...O##O.#..........O.O..##....O.##....O...#......O.O...O..O.O..O.##.#..#..O.O#.O.##..O..OO...OO.....
+#.O#.#....#....O..O.O.O.###..O.O......O...OO#..........OO.....#O..#........#..#..O.#...##OO.#O#.#.#.
+.##OO#...#O....O.O.#.#O....O.#...OO.....O...O.#.....O.OO.O..OO.....O...#..#.....#..#.....#..OOO..O##
+.O#.........O.#..O.O.....O#.O##.##......OO.O.#......#...O##.O..#.....O...................#...O..O.#.
+..###...#O...O#..#......OO#...##.#.O....#.##OO.....O..O......O#.O....O.#..O#.O#O.#.#O..##.O...O..O.#
+.........#O...#..O.##.OO.....#...#.....O.O.O....O..##.O.....##OOO..#..O.#....#.##..O..##.O..#...#.#O
+.O..#.#.O#..#OOOO#...#.O..#O#....OO....O..O..#...O..#...#........#O.O...#....O.#...#..#....O..OOOO.O
+....#.#O#.O.O.O.OO.#....OO.....O.#....#...#..........#.##...##.OO#..OO.....O.....O#..O.#.....OO..#..
+.....OOOOO...O.........#.#....#..OO##.##.....#O....O..##..O.......#.....#.O.....#..O..OO.........O..
+...#.#.O###..#...O....OO....O.#.O.....##OO.O#..#.##....O.....OO##...O#OO..O.OO...O.OO..O#..O#.O..#.#
+..OOO.OO...##O.O.O#.O...O..O#..OOO...##.#..#.#.#...O.#O#...O#O.OOO.O.OO.O..#.OOOO#.........#..OO...O
+O...O#.O.OO#.OO.##.....#....#...#.........###.O.#.........O......#OO..O...OO.#O..#..#..O..O..##....#
+O.OOO#....O..O#O....O...O.#......##O...OO..O.............#.#....O#..#O.#OO.O...OO...OOO...O.O.....O.
+..#..O.OOO.....O#....#.#..O.......O...#.......#.OO..O.....#.#.#..O....#.#...O.O....O.#.......#.O##..
+.#..O.....#.#..#.#.#..OO.O...O........OO#.O..O..#..O#.##O..#....#....OO.....#..#O.........#.O..O.O.O
+...O.##OO.#.......O...O.O.#.O.O..#.O...O.O..OO..O..#..OO..##....##.#.....#.O.#..........O.#.OOO#O...
+...O..O....##...#...O#.O....O.O...#OO..O.#OO#........#O...OO.#..OO.#O.O..#....O#.O....O#......O#...#
+..OO#O.O...#..#.#.......O.O...##....O..#.##..#...#...O...#.O#O.O....O......#....#...O..##..#O..O....
+.O...##O.#O.....O........O...O#....##......##....O.....##.....##......O....O..#..#O.#.O.OO#O#O....##
+.........#O.O.O.OO..#.O#.##.....#.#O.O..O#.O........O....#O#.##O.#.O....#..OO.O.#...OO.#.O.##O...O##
+..O##O.O......#O.O.#..O.#.........O...#..#..#..##OO....O..OO.#.#...OO...#O..#...O.###...O#.#......O.
+......O..#O....O##...O##..........O...O....O........O..#OOO...OO..#.....##O.#.O..#....OO....O...#O..
+O..#.O..#.O..OOO..O.O.#.O...#O..#.O..#O......O.OO..O.#..O..##.....##....O#OOO..#.#O...O##...OO.#O#.O
+O##.O...O.O.....O.#O..O..#.....#O.#.....###..OOO.OO#...#.O..O...........O.....O..#...O.#...#..O....O
+...O.OO.....#O..O..#O..#O....OO....O....#O..#OO...O.#...O..#....#....#..OO.O.##.O#O...O.#O...O#.....
+.....#...OO.........##OO.#.#........#..O..O.#.#.OO.#..#..#....#.O#..........#..O.O...O.#OO.....##...
+#...#.....OO.....OOOO...#..#O.#..##.#..#..O.O##.O#.O#.O.O...#........#...O#......O.O#O..#..#..O...#.
+.....O..#.OO.#O.O...#...#..#.......O#.##..OOOO.........OO.O.#O#...OO.#...O....###O..OO#.O.....#.##.O
+#O..O#O.#..O#.O.O.O...O...OO...#.##....O#.......OO.O...#.....###.......O..#.O..O...OO#.O.#O.O.O.O.O.
+OO.....O.............#.O...OO..##O.O#.#O.#....O..........O..O#.........#.........O#.#....#O#..#..##O
+#..#..#........O.OO....O.....O..#O..O#.#O#O...#.##O..O...O.#O.#OOOO#.OO.#..OO##..#O.#.O.O...O..O#...
+...#........O...O.O..O.O#.....#....O.#.#OO.#...#..O#O.##..#.##...O#.#.....O..O.....#..O#.....O......
+..O.O.O###..#..O.#..#........O..O#..##O#....#...#.....O.......OO...O....##......#.O..O..O.O.O.O..#O.
+..O..O..OOO.O##..O..O#..OO###.#....O..O...##..OOO...O.......#..#..OO..O...OO#.O.....O.O..O.OO.#....O
+O....O...#.O#O#....#.O....##...O.........O...#.#.#O.OO..O#....O.##.....#.#..#..#....#.#O..O.O.#..O..
+O................O#O.O......##..#O...O....O#.O..#....O......O.#..O....O.#...O.....O##.#.O....OOO.#.#
+...O#....#..O.O........O#.O#.#O.#.....#....O#....#..#......O.....#.....O#O..O..OO.#.#OOO#O.O.O#.....
+.#.#O..##.O.O.O#...O...#...#....O..OO..O..#..#....###.O#.OO.O....O....OOO...O....OOO#..#..O.....#.OO
+...OOO..O.O.....O#.##O#.#.#.O..#O.....#O....O#O...O....O#.O#..O#.O..#.#.#O..O..O.#....O.....#O.....#
+.O#...#...O.....O..#.O.#.....O...O#..#.....O.O#O..O.....#.#.O..O..#.OO..#O...O......#OOO..#.O..O..#.
+O.#.OO.#.O#O#...O....#...###OO..OOO.#O..O.O..O........##...O#...#...O##OO.O#....O.#O.O..O#.O..O.#..O
+...#...O.O.###.O#O......#.OOOO...O...##..#O.#.O.#O.###.#O....#.OO....O......#..OO.O.#.O...O.O....O..
+...O#.O..#......#...O#...O......O..........O..#..##...O.O....OO.O.#..#....#...#.#O.....#O.#O.....#.#
+....#........O#.O..##OO.O....##.O...OOO.....OOO#O.#..#.#.....#.O.#......##..........OO.O#..O....#.O.
+#.....O...OOO..##....OO..OO.##......O.O#...#...O...O.....O.OO.O.......OOO....#...O.##.....OO..O.....
+.#.O....O..OO....O.O#O...#OO#.#....#....OOO....#O#...#...................O.#O#.O.#....O...#...#O.#.#
+O...##O.#.O#....O....#O#.#.#.OO#...............#.##O...#.OO....OO...O....O#O...#.O...O..O.#.O.#...O#
+.O.#........O.#..O.O#...#.....#.......#O..OO...O..O....#....O..#..O#.O....#OOO#O....#.#.#O......O.O#
+.O.OOO.#O.#......O..#...........#.O.##OOOO##O.OOO#.......#....#...O..#..#..O...##.O.O.....O..#.O....
+.O..#..O..OO.#O.#O.OOO...#....#.#.O.#....OO...O....O..##...O#####O....#......O.#.#...O.#O.#O....O..O
+O..#OO#....O.....O..#O..O....#O.#OOO.#..#.O#.#.O....O.#...O....O.#.O..#O.OO....#.O.#..#OO...O.O.O#.O
+....#.#OO.....O...OO.#O.OO......#..###O#.#.........#O...#..O#..O.OO#OO#O.O..O#..#.#..O#.##...OOO....
+............OOO.O..#OO..O#......#..O...#....#O.....#O.....O.....OO#..OO#..O..#..O...O.O..#.##..#.#..
+..#.O.#.O.#.OO#...O.O.#O#O...OO.O..#O....O.OOO.#O.#.#.###.O...OO...........O......O..O.OO.O..#....O.
+......O.#O#..................OOO..##.O#.....O.O...#.O#....OOO.#.....O.#O...O.#OO.#..OOO.............
+O...O................O.....OO.O.#...#..OO....O.OO.O##O.....O...O..#....O...OOO#O......O........#O...
+.#O..###.O.##O......#.....#....O....#O..#......#.#O#O..O...O#.......#O....##..##OO.O.O#...OO.O##.O..
+.#..#.......O.....#O........O.#..O....O#...........O...#....O.#O#....O..#..OO..O##....OO...#.O....OO
+...O#.......OO#....#...O....O..#...##OO..O#..#O#.O.O.OO.OO....O#..##...#.##O..##OO#...#..O..O...O..#
+..#..##....O.#.O...O.#.O...##........#...O####...#O...##OO.........O.O..OO#O#.###...O.O....O...OO...
+##.#OO.O....#.OOO..O.....O....#O...O...OOO...O#...#....O.#O...#...O.O.#.#OO..O..#.....#O.#....##..#.
+......O.O..#.#.O...#........#..O........#O......O....OO.....O.OOO##....O.O..#.#..O#.O.......#.O..#..
+O..##.....O........#.#..#.....O....#.##...O.#.....O.OO##...#OO.#...O..O##.OO.#..O..O#.O.O...O..#....
+.O....O.##O....O#OOO.#.O..#..O.O....O.O#..##..O#O#.OO....##.O#.....##.....O..##OOO..#.......O...#O..
+O...#.O........O.##.....O...OO##....##..O#...O#.O#.#..#.#O..#........#O..#O.O.O.O.O.O....##...#O#.##
+.........###OO..O..#....#...............#..O..O.O.###..#OO......O.OO...#...#....O..O..#.#...OO......
+.OO.O.O..O...O......O...#...#..O.#...O.#.......O..O.......#.OOO...O..#.....#............O.....OO....
+O.OOO.O.#..#...#O...O.#.O#...#.#.#.OO...##...OO.O.O.#......O....O..O..OO....O..##..#.OO...O.#O.#O.##
+O..#......#.........#...#O..O.........O#.###..OO.O..OO.O.O.....#O....#O..#...O..O..OO.....O#OOO...#O
+....OO...O.#........#......#O#....O.O#....#OO#O.#.O...#........#....OO.........OO.....O.#.......O...
+..##..#..O#.....#.O....O..OO##.O.....O#..#O..O...OO..O##.O.OO....O....##O.OOOO#....#...#..O.O...O...
+O...#..O##.O..OO.O.O..#.#O.......O#.O.#..O.O...O.OO..#..O.....OO..O....O#O.#.#..#.O..O.......O..#...
+OOO...O.#.O....#OO..O......#....O.....O..#O##...O.O.O..OOO#...#....##.OO..##...O....#..#O..##..#....
+##.O#O#........#....##.#.OO.#...O.#...##.O...#..##..O#.#.O.#OO....#.O..O..#O....#.....O.O...#O#O.O.O
+....#.#O.O#O.OO...O..O#......#.#.O..O..OOO.OOOO...#O..#O..O..O.........O.#....O.#.........##O.....O.
+O...#..#O#OO....O#OO#...O..#..#.#.#...O...#...#.....#.#..............O.O...#.O...OO.#..#..........O.
+..O.....#OOOO.O.#...O#...#...#..O....O##.#.#..OOOO#OO...O......O..#O..#.O.O..#.#O...O.O.O#.#OOO..OO#
+...O......O........##O..#...........OO..#........OO#...#...#....#O........OOO#..O#.O..#..#.O.O...#O.
+.OO.#..###..#.O.O#.#...O#O.O.OO...O#....O#O#...#.O.O#.O..O.....##...#.#O.O#O.....#......O#O...##.OO.
+.O.##...#O...#.#...O.......#....OOO.....#.O....O..#..O#...O..O..O...O.O..O....#....##...OOO..O#O....
+#...#.#OO#.#O.OO#.#....#...O.O#...##.O#O....##..O..#......#.#....#OO#..#O....#O#..OO...O....OO..O...
+.OO#.......OO.....#.O...#O....#.....O........OOO.O.O.#.....O......#O#......##OO.#O..O#..........O...
+#.#O......O.O......#.#OO........#.O#...#.O.OO.#......O#.O.......O.O.O..#.O#.#.....O...OO#O......O.O.
+..O..O.O#.....OO......###.#........O#..#OO.OOO.#..O...#...#..O#.......O.#.##.#.............#O.......
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/2023/input/14_test.txt	Thu Dec 28 12:08:35 2023 +0100
@@ -0,0 +1,10 @@
+O....#....
+O.OO#....#
+.....##...
+OO.#O....O
+.O.....O#.
+O.#..O.#.#
+..O..#O..O
+.......O..
+#....###..
+#OO..#....