Mercurial > lbo > hg > aoc22
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.......