From 26ae755b1f3b17545195b97c1174bcb32b19b80a Mon Sep 17 00:00:00 2001 From: Rhiannon Morris Date: Sat, 5 Dec 2020 15:13:12 +0100 Subject: [PATCH] day 5 --- aoc2020.ml | 2 +- data/day5 | 774 +++++++++++++++++++++++++++++++++++++++++++++++++++++ day5.ml | 112 ++++++++ 3 files changed, 887 insertions(+), 1 deletion(-) create mode 100644 data/day5 create mode 100644 day5.ml diff --git a/aoc2020.ml b/aoc2020.ml index a2fe76b..79a1553 100644 --- a/aoc2020.ml +++ b/aoc2020.ml @@ -1,7 +1,7 @@ open Aoc2020 let days = - [|Day1.main; Day2.main; Day3.main; Day4.main|] + [|Day1.main; Day2.main; Day3.main; Day4.main; Day5.main|] let _ = match Array.to_list Sys.argv with diff --git a/data/day5 b/data/day5 new file mode 100644 index 0000000..6041632 --- /dev/null +++ b/data/day5 @@ -0,0 +1,774 @@ +FFFBFBFLRR +FFBBFFFRLL +FBFBFFBRLR +FFFBBFBRRL +BFFFBBFRRL +FFBFBFFLLR +FBFBBFFRLL +FFBBFBBLLL +BFFFBBFLLR +FBBFFBBRLR +FBFBBBBLLL +BFFBBBFLLR +BBFFBFBLRR +FBBBFFBRRL +FFFBFBBLRL +FFBFBFBRLR +FBBBBFFRRL +FBBBBFBLLR +BFBBBBFRRR +BFBFFBBLRL +FBBFBBFRLL +FFBBBFBRLR +FBBFFFBRLL +FBFBBFBLRR +FFFBBBFLLL +FBFFBBFLRL +BFFFBFFLLR +FBFBBBBLRL +FBBFBFFRLR +FBFBBBBRLL +FFBFFBFLLR +BFFBFFBRLL +FBBBBFFLRL +BFFBFBBRLR +FFBFFFFLLR +BBFFBBFRLR +BFBFBBBRRL +BFFBBBBLRR +FFBBBBBRLL +FFFBBFFRLR +BBFFFFBLRL +BFBBFBFRRL +BBFFBBFRRL +FBFFFFBRLR +FBBFBBBRLR +BBFBFFFLLL +BFBFBBBRLL +BFFFFFFLRL +FBFBFBFRRR +BBFFFFFLRR +FFFBBFBLLR +FBFFBFBRLL +BFBBFBFLLR +FFBFBFFLRL +BFBFFBFRRR +FBBBBBFRLR +FBBFFBBLLR +FBFBBFFLRL +FBFFFBFRRL +BFFBFFFLRR +FFBFBFBLRL +FBFFBBBLRR +BFBBFFFLLR +FBFBBBBRLR +FBFFFBBRRL +FFFBBBFRRL +FBBBBBBLRR +FBBBFBBRRL +FBBBFBBRRR +BFFFBFBLRL +FBBBFFBRLR +BFBFFFBRRR +BFBBFBBLRL +BBFFBBFLRR +FFFBFBFLLR +FFBBBBFRRL +BFBFBFFRRR +FBFBBBBRRR +BFFFBFFRLL +BFBBFBBLLL +FBFBFBBRLR +BFFFBFBRLL +FFBBFFBRLL +FBFFBBFRLL +FBFBFFFRRR +FFBFBBBLLL +BBFFBBBLRR +FBBFFBBRLL +BFFFFFBRRL +FBBFFBFLLL +FBFBFBFLRL +BFFFFBBLRL +BFFBBFBRLL +BFBFFBFRRL +BFBFFFFLRR +FBFFFBFRRR +BBFFBBBLLR +FBFBFBFRRL +BFFBFBBLRL +FFFBFBBRLR +BBFFFBFLRL +BFBFFBFLLR +BBFFBFBRRL +FBBFFFBRRL +FFBFFFFLLL +BFBFBFFLLL +BFBFFFBLRR +FBBBFFBLRR +FFBBFFBLLR +BBFFFBBLRR +BBFBFFBLRL +BFFFBBFRLL +FBFFBFFRRR +FFBBBFBLRL +FFBFBFFRRR +BFFFFFFLLR +BFFFFBBRRL +FBFBBBFLRL +BFFFFBFLRL +FBFBBBFRLL +FFBFBFBRRR +FFFBFBBRRR +FBBBFFBRLL +FBFFBBFRLR +FFBFBBFRLR +FBBFFFBLLL +BBFFBBBRLR +FBBFFFFLRR +BBFFFBFRLL +FBBBBBBRLR +BFBBFFBLLR +BFBFBBBLRR +FFBBFBBRLL +FFFBFBBLLL +BFBBBFFRLR +FBFBFFFLRL +BFFBBFBLLR +BFBBFFFLRL +BFBBFFBLRR +FBFFFFBLRL +FBFBFBFLRR +FBBFFFFLRL +FFBFBBBLLR +FBFBFBBRRR +BFBBBBFLRL +BFBFBFBLRL +BFFBFBFLRL +BBFFFFBRRL +FFBFFFBLRR +BBFBFFBRRL +FFBBBFFLRR +BFFBBBBLRL +FBBBFFFLLR +FFFBBBFRLR +BBFBFBFLLR +BFBFBFFRRL +FBFBFFBRRR +FBFFBFFLRL +FFBBFFFLLL +BFFBBFBLLL +BBFFFFFLRL +FFBFBBBRRR +FFBFFBFLLL +FFBBBBFLRL +FFBBFFFRLR +BFBFFFBLLL +FBFFFFFRRR +FBBFFBBLRL +BFFFFBFRRL +BFFFFBFRLR +FFBFBFFRLL +BBFFBFFRRL +FBFFBBBRRR +FFBBBFFRRR +BFFBBBBRLR +FFBBFBBRLR +BFBBFBBRLR +FBFFBBBLLR +BFFFFBBLRR +FBBFBFBRRL +FBBFBFBRLR +FBBBBFFLRR +FBFFFFBLRR +FFBFBBFLLL +FBBFFBBLRR +FBFBFFFLLL +FBFFFBBLRR +FBBFBFFLLL +FBBBFBFRLL +FFBBFBBLRL +BFBFFBBRRR +BFFBBBBLLR +FBFFBFBLRR +FBBBBBBLLR +FBBFBBFLRL +BFBFBFBRLR +FBBFFFFRLR +BFFBFBBLLL +BFBFFFBRLL +BFFBBBBRLL +BFBFBBFLLR +FBFFBFFRLR +BFFBBFBRRR +FBBBFFFLLL +BFFBFBFRRL +FBFFBFFRLL +FFBBBFFLRL +FBFFBFFRRL +BBFFBFBRLR +FBBFBBBRLL +FBFBBFBRRL +FBFBBFFLLR +BFFBFFBLRR +FFBBFBFRRR +BFFBBBFRRL +FFBFBFBRRL +BBFFBFFLLR +FBBBBFFLLR +FBBFBFBLLL +BFBBBBFRLL +FFBBBBFLLL +FBBBFBBRLL +BFFBFBFLLR +FBFFFFFLLR +FBBFBFBRLL +FBFBBBFLLR +FBFBFBBLLL +FFFBBBBLLR +FFBBBBFRRR +FBBFFFBLRL +BBFFBFBLLR +BFBBFFFRLR +BBFBFFBRLL +BFBBBFBLRL +BFBBBFFRRL +FBFBFFBRLL +BBFBFFFLRL +BFBFBFBRRL +BFFFBFFLLL +FBFFFFFLLL +FBFBBBBRRL +FBFFBFBRRL +BFBFBFFRLR +FBFBFFFRRL +BFBBBBFLLR +FBBBBBFLRL +FBBBFFBLLL +FBBBFFFRRL +BBFBFBFRRR +FFBFFBBRRL +FFBFBBFRRR +BBFFFBFLLL +BBFFBFBRRR +BFFBBBFLRR +FBFFFFBRLL +FBFFBBBLLL +FFFBBBFLLR +BBFBFFBLLL +FBFBFBFRLR +BFBFBFBLLL +BBFFFFBRRR +FBBBBFBRRR +FBFFFBBRLR +FFFBBFFLLL +FBBFFBFLRR +BFFFBBBRLL +FBBFBFBLRL +FFBFFFFLRL +FFBFFFBLLR +FBBFBBBRRL +BFBBFBFRLL +FFBBBBBLRR +BFFBBFFLRR +FFBFFFBRRR +BFFFFFFRLL +BFFBFFBRRR +FFFBBBFLRL +FFBFBFBRLL +BBFFBBBRRL +BBFBFFFRRR +BBFBFBFLRL +FBBFBBBLRR +FFBBFBFRLR +BFBFBFBLRR +FFFBBBBRRL +BFFFFBBLLL +FFFBBBFLRR +FFBBFFBRRL +FBFFBFFLRR +FBFFBBFRRL +BFBBFBBRRL +BBFFBFBRLL +FBBFFFFRRL +FFBBFFBRLR +BBFFFFBRLR +BBFBFBFRLL +FBBFBBBRRR +BFFBBBBRRL +BFFBBBBLLL +BFBBFBBRLL +BFFBBBFLRL +FBFFBFBLRL +BFFBBFFLLL +BFBFBBFRLL +FBBFFFBRRR +FFBFFBFLRL +FFBFFFFRLR +BFBBFBBLLR +BFBFBFBRRR +FBBFFFFLLR +FFBBFBBRRL +BFFBFFFRRL +FBFBBBFRRL +FBBFFFFLLL +BFFFFFFRRL +BFBFFFBLLR +BFBBFFBRRR +BFFBFFFLLR +FFBBBFBLLL +BFFBBBFLLL +FBFFFBBRRR +FBBBBBFLLL +BFBFFFFRRL +FFBBFFBRRR +BFBFBFFLLR +FFFBFBBLLR +BFBBFFBLRL +FBFBBFFRRR +BFBBBFFLLR +FBBFFFBLLR +BFFFBBFLRR +BFFFFBBRLR +FBFFFBBLRL +BFBBBFBLRR +FBFFBFBLLR +BFBBFFFRLL +FFBBFBFLLL +FFBFFFBRRL +FFBBFBBLRR +FFBFBBFLRL +FFFBBFFRRR +BFBFFBFLRR +BBFFFFBLRR +FFBFBBFLRR +FFFBBFFRLL +FBBBFBBRLR +BBFFFBBRRL +FFFBFBFRRL +FBBBBBBRRR +FFBBBFBLRR +FBBFBFFLRL +FBBBFFFRRR +FBBFFBBRRR +BFFFFBBRRR +FBBFFBFRLR +BFFBFBFRLR +BFBBBFFLRR +FFBFFBFLRR +BFBFFFBLRL +BFFBFBFRLL +FBBBBFBLLL +BBFBFFFRRL +FFBBFFBLLL +FFBFFBBRLR +FFBBBFBRRL +FFBBFFFLRR +BBFFBFFLRR +BFFFBFFRRL +FBFBBFBRRR +FBFFFBFLRL +BBFBFFBLRR +BFFBFBFRRR +BFFFFFFLLL +FBBBFFBLRL +FBBBFBFRRL +BFFBFFBRLR +BFBBBFFRRR +BFFBFFFRRR +FFFBBBBLLL +FFBBBFBRRR +FFBBFBFLLR +BFBBBFBLLL +FBBFBBBLLL +BBFBFBFLLL +BFBBBFBRRR +BFBFBBFRLR +FBFFBFBRLR +BFFBFFFRLL +BFBBFFBRRL +FFBBFBFLRR +FFBBBFBLLR +BBFBFFFRLR +FFBBFBBLLR +FBFFFBBLLR +FBBFBFBLLR +FFBBFBFRLL +BFFFFFBLLR +BFBFBFBLLR +BFBBFFBLLL +FBBBBFBLRR +BFBBBBFLLL +BFFBBFFLLR +FBFBFFFRLL +FBBBBBFLLR +BBFBFFBLLR +BFBFBFFLRR +FBBBBFFRLR +FFFBFBBRRL +FFFBBFBLLL +BFBBBBFLRR +BFBBBBBLRR +FBBFBBFLLL +BFFFBFBRLR +FBBFBFFLRR +FBFFFBBRLL +BFFFFFBRRR +BFFBBBFRLL +FFBFBFBLLL +BFBBFBFLRL +FBBBBFFLLL +FBBFBFFRRR +FFFBBBBRLR +BFBFBFFLRL +FFBBBFFRRL +BBFFBFFLRL +BFFFBBBRRL +FBFFFFFLRL +BBFFBFFRLL +BFFFBBFRLR +BFBFFBBRLR +FBFBFBBLLR +FBBFFBBRRL +BBFFBFFRLR +FFBFFBBRRR +BBFFFBBRLL +BFBFBFBRLL +FBFBBBBLLR +FBFBFBFLLL +FFBFBBBLRL +BFFBFBBLRR +BBFFFFFRRR +FFFBBFFLRL +BBFFFBFLRR +FFBFFBFRLL +FBFFBBFLLR +FBFFFFBLLR +FFBBBBFRLL +FFFBBFFLRR +BBFFFFFLLL +BBFBFBFLRR +FFBBBBFRLR +BBFFFBBLLL +FFBFBBFRLL +BFFFFFFLRR +FFBFFFBRLL +FBFFFFFRRL +BBFFFBBLLR +FFFBBFBRLR +BFFBBFFRRL +FBBBBFFRLL +BFBBFFBRLR +BFFFBFBLRR +BFBFFBBLLR +BFFBFBBRRR +BBFFFBFRRR +FFBBBFFRLL +BFBBFBBRRR +FFBBBBBRLR +BFFFBBBRLR +BFFFBBFLLL +FFBFFBBLRL +FFBBFBFLRL +FBFBFBBLRL +BFFBBFBRLR +FBBBBFBRRL +FBFBBBFRRR +BBFBFFBRRR +BBFBFBFRRL +FBBBBFBRLL +FBFFFBBLLL +BFBFBBFLLL +FBBBBFFRRR +FBBFBBFLRR +FFBFFFFRRL +FFFBFBFRLL +FBFBBFBRLR +FFBBBFFLLR +FBFFBBFLLL +FFFBBBBRRR +BFFFFBFRRR +BFBFFFFLRL +FBFBFFBLLL +BFFBBBBRRR +BFFBFBFLLL +FBFBBFFLLL +FBBFBBFLLR +FBBFBFFLLR +BBFFBFFRRR +FBBBBBFLRR +FFBFBBBRLL +FBBBBBBLLL +BFBBFBBLRR +FBFBFFFRLR +FFBBBBBRRL +FBFFFFBRRR +FBBFFBFRRR +FFFBBBBRLL +FBBFFFFRRR +BFFBFFBLRL +FFFBBBBLRR +BFBBBBFRRL +BFFFFBBLLR +BFFFFFFRLR +BFFBBFFRLR +BFFBBFBLRL +BBFFFFBLLL +BFFFFBBRLL +FBBFFBFRLL +FFFBBFBLRR +BBFBFFBRLR +BFFFBBBLRL +BFBBFFFRRL +BFBFFBFRLL +BFFBFBBRRL +FBFFBFFLLL +BFBBFFBRLL +BFBBBFFLRL +FFFBFBFRLR +BFFBFFBLLR +BBFFFFBLLR +FFBBFBBRRR +FBBFBBFRRR +FFBBBFFLLL +BFBBFFFLRR +FFBFFBFRRR +FBBFBBFRLR +FBFBFFBLRL +BBFFBFBLRL +BFFFFBFLRR +FBBBFFFRLL +FFFBBFFRRL +FFBFBFFRLR +FFBBBBBLLR +BFFBBFBRRL +BFFBFBFLRR +FFFBFBBRLL +FBFBBBBLRR +BFBFFFBRRL +FFBFBBBRRL +FFBFBFFLRR +FFBFBFBLRR +BFFBBFBLRR +FFFBFBFLRL +BFFBFBBRLL +BFFBFFFRLR +FFBBFFBLRR +FBBBBBFRLL +FBFBFBFRLL +BFBBBBBRRR +BBFBFFFLLR +FFBFFFFRLL +FFFBBFFLLR +BFBBFFFRRR +FBBBFBFLLR +BFBBBBBRRL +FBBBBBBLRL +FBBBFBFLLL +BFFBFFBLLL +BFFBFFBRRL +FBFFBFBRRR +FBFBFBBLRR +BFFFBFFRLR +FBFBFBBRRL +BFBBBBBLLL +FBFFBBFLRR +BBFFFBBRRR +FFFBFBBLRR +FBBFFBBLLL +BFFFFFBRLL +BBFBFBFRLR +BFFFBFFLRR +FBFBFFBLRR +BFBBBFBRLR +BBFFBFBLLL +FFBBBBFLLR +FBBBFBFRLR +FBBBBBFRRL +FBBBFFBRRR +FFBBBBFLRR +BBFFBBBRRR +BFFFFBFLLR +FBFFBBFRRR +BBFFFFFRRL +BBFFBBBRLL +FBFFFFBRRL +FBFFBBBLRL +BFFFFFFRRR +BFFFBBBLLR +FBFBBFBLRL +BFBFBBBLRL +FFBBFBFRRL +FBFFBBBRLR +BFFBBBFRLR +FFBFBBBLRR +BFFBFFFLLL +FBBBFFBLLR +BFBFBBFRRL +FFBFFBBLRR +BBFFFBBRLR +FFBFFBBRLL +FBFFFFFRLR +FBBBFBBLRL +BBFFFBFLLR +FBBFFFFRLL +BFFFBBFLRL +BFBBBBBRLR +BFFBFBBLLR +FFBBFFBLRL +BFBBBFBRLL +BFBBFBFRRR +FFBBFFFLRL +FFBFFFBLLL +FFBFFBBLLR +BBFFFBFRRL +BFFBBFFLRL +FBBFFBFLRL +BFFFBBBRRR +FFBBFFFRRL +FFBFBFFRRL +FBBBBFBLRL +BBFFBBFLLR +FBBBBFBRLR +BFBFFBFRLR +FFBFFBBLLL +FFBBBBBLLL +BFBFBBFRRR +BBFFFFFRLL +FBFFFBFRLR +BFBBBBFRLR +FBBFFFBRLR +BFFFFFBLRR +FBFFBBBRRL +FBBBFBFLRL +BFFFBFFLRL +BFBFBBFLRR +BFBBFBFRLR +FFBFFBFRLR +BBFFFBBLRL +BFBFFBFLLL +BBFFBBFRLL +FBBBBBBRRL +FFBBFFFLLR +FFFBBBBLRL +BBFFBFFLLL +FBBBFFFLRR +FBFBFBFLLR +FFBFBFFLLL +FFBFFFBLRL +BFBFFBBLLL +FBFBFFFLRR +BBFFBBFLRL +BFFFBFFRRR +FBFFBBBRLL +FFFBBBFRLL +FBFFFBFLLL +BBFFFBFRLR +BBFFBBFLLL +BBFBFFFRLL +BBFFBBBLLL +FBFBBFBLLL +FBBFBBBLRL +FBFFFFFLRR +FBFBBFBRLL +FFFBBFBRLL +FBBBFBFLRR +FBFBFFFLLR +FFBFFFFRRR +BFFBBFFRLL +BBFFFFBRLL +BFBBBFBLLR +BFBBFBFLLL +FBBBBBFRRR +FFBFBBBRLR +BFFFFBFLLL +BFFFFFBRLR +BFBFFFFLLL +BFBFFBBRRL +FFBFFBFRRL +FBBBFBBLRR +BFBFFBFLRL +FBBBBBBRLL +FFFBBFBLRL +FFBFBBFLLR +BFBFBBBLLR +FBFBBFFRLR +FBFBFFBLLR +BBFFBBBLRL +BFBFFBBLRR +FFBBFFFRRR +FBFBBBFRLR +BFBBFBFLRR +FBBFBFFRRL +FBFBBFFLRR +FBBFBFBRRR +FBFBBBFLRR +BFBBBBBLLR +FBFFFBFLLR +FBFBBFBLLR +FFBFFFFLRR +BFBFBBBRLR +FBFFFFFRLL +FFBBBBBLRL +BFBBBFFLLL +BBFFFFFLLR +BFFFBBFRRR +FBFBFFBRRL +FFFBBFBRRR +FBBBFBBLLR +BFFFFBFRLL +BFBFBFFRLL +BFBFBBFLRL +FFBBBFFRLR +BFBFBBBLLL +BFFFBBBLRR +BFBBFFFLLL +FBFBFBBRLL +BFFFFFBLLL +BBFBFFFLRR +BFBFFBBRLL +FFBFBBFRRL +FBFBBBFLLL +FBFFFFBLLL +FBFFBFFLLR +FBBFBBFRRL +BBFFBBFRRR +BFFFBFBRRL +BFBFFFBRLR +FBBFFBFLLR +BFBFFFFRLL +BFBFBBBRRR +BFBFFFFRLR +FFBFBFBLLR +FBFFFBFLRR +FFBBBBBRRR +FBBFFFBLRR +FFBFFFBRLR +BFFFBFBRRR +FBBFBBBLLR +BFBBBBBLRL +FBBBFFFLRL +BFFBBFFRRR +BFBBBFFRLL +BFBFFFFLLR +BFFBFFFLRL +BFBFFFFRRR +BBFFFFFRLR +FBFFFBFRLL +FFFBBBFRRR +BFFFBFBLLR +FBBFBFFRLL +FBBBFBBLLL +BFBBBBBRLL +BFFBBBFRRR +FFFBFBFRRR +BFBBBFBRRL +FBFFBFBLLL +FBBBFFFRLR +FBFBBFFRRL +FBBFFBFRRL +FBBFBFBLRR +BFFFFFBLRL +FBBBFBFRRR +BFFFBBBLLL +FFBBBFBRLL diff --git a/day5.ml b/day5.ml new file mode 100644 index 0000000..7f7c403 --- /dev/null +++ b/day5.ml @@ -0,0 +1,112 @@ +type half = L | H +type bounds = {lo: int; hi: int} +type result = Exact of int | Between of bounds + +let avg lo hi = (lo + hi) / 2 + +let rec find' ?(lo=0) ~hi = function + | [] -> if lo = hi then Exact hi else Between {lo; hi} + | L::hs -> find' ~lo ~hi:(avg lo hi) hs + | H::hs -> find' ~lo:(avg (lo+1) hi) ~hi hs + +exception Inexact of bounds * int option [@warn_on_literal_pattern] + +let find ?index ?lo ~hi halves = + match find' ?lo ~hi halves with + | Exact x -> x + | Between p -> raise (Inexact (p, index)) + + +type path = {rows: half list; cols: half list} + +exception Unknown_char of char * int option + +let path_of_string ?index str = + let revs {rows; cols} = List.{rows = rev rows; cols = rev cols} in + let put acc = function + | 'F' -> {acc with rows = L :: acc.rows} + | 'B' -> {acc with rows = H :: acc.rows} + | 'L' -> {acc with cols = L :: acc.cols} + | 'R' -> {acc with cols = H :: acc.cols} + | c -> raise (Unknown_char (c, index)) in + String.to_seq str |> Seq.fold_left put {rows = []; cols = []} |> revs + + +type seat = {row: int; col: int} + +let seat_of_path ?index {rows; cols} = + {row = find ?index ~hi:127 rows; + col = find ?index ~hi:7 cols} + +let seat_id {row; col} = (row * 8) + col + +let seat_id_of_string str = + path_of_string str |> seat_of_path |> seat_id + + +let%test_module _ = (module struct + let str = "FBFBBFFRLR" + let rows = [L;H;L;H;H;L;L] + let row = 44 + let cols = [H;L;H] + let col = 5 + let path = {rows; cols} + let seat = {row; col} + let id = 357 + + let%test _ = find' ~hi:1 [L] = Exact 0 + let%test _ = find' ~hi:1 [H] = Exact 1 + let%test _ = find' ~hi:127 [] = Between {lo = 0; hi = 127} + let%test _ = find' ~hi:127 rows = Exact row + let%test _ = find' ~hi:7 cols = Exact col + + let%test _ = find ~hi:127 rows = row + let%test _ = find ~hi:7 cols = col + let%test_unit _ = + try ignore (find ~hi:127 []); failwith "didn't raise" + with Inexact _ -> () + let%test _ = path_of_string str = path + + let%test _ = seat_of_path path = seat + + let%test _ = seat_id seat = id +end) + + +let infile_seats ~of_seq input = + Bracket.infile_lines input ~line:seat_id_of_string ~of_seq + +let main1 input = + infile_seats input ~of_seq:(Seq.fold_left max 0) + |> Format.printf "max id: %d\n" + +let%expect_test _ = + main1 "../../data/day5"; + [%expect{| max id: 855 |}] + + +let make_list cmp seq = List.(fast_sort cmp (of_seq seq)) + +let rec find_pair f = function + | [] | [_] -> None + | x::y::zs -> + match f x y with + | Some z -> Some z + | None -> find_pair f (y::zs) + +let find_gap lst = + let find_gap1 x y = if x + 1 <> y then Some (x + 1) else None in + find_pair find_gap1 lst + +let main2 input = + match find_gap (infile_seats input ~of_seq:(make_list Int.compare)) with + | Some x -> Format.printf "seat id: %d\n" x + | None -> raise Not_found + +let%expect_test _ = + main2 "../../data/day5"; + [%expect{| seat id: 552 |}] + + + +let main = Misc.main 5 [|main1; main2|]