From 967e964f453fc031816270b90d6eab38410769a3 Mon Sep 17 00:00:00 2001 From: Tomasz Chojnacki Date: Fri, 9 Dec 2022 19:31:24 +0100 Subject: Extract common functions to util module --- aoc-2022-dotnet/Common/Common.fsproj | 4 +++- aoc-2022-dotnet/Common/Library.fs | 8 ------- aoc-2022-dotnet/Common/Util.fs | 43 ++++++++++++++++++++++++++++++++++++ aoc-2022-dotnet/Common/Vec2.fs | 13 +++++++++++ 4 files changed, 59 insertions(+), 9 deletions(-) delete mode 100644 aoc-2022-dotnet/Common/Library.fs create mode 100644 aoc-2022-dotnet/Common/Util.fs create mode 100644 aoc-2022-dotnet/Common/Vec2.fs (limited to 'aoc-2022-dotnet/Common') diff --git a/aoc-2022-dotnet/Common/Common.fsproj b/aoc-2022-dotnet/Common/Common.fsproj index c8a185a..32057cf 100644 --- a/aoc-2022-dotnet/Common/Common.fsproj +++ b/aoc-2022-dotnet/Common/Common.fsproj @@ -6,11 +6,13 @@ - + + + diff --git a/aoc-2022-dotnet/Common/Library.fs b/aoc-2022-dotnet/Common/Library.fs deleted file mode 100644 index 7354509..0000000 --- a/aoc-2022-dotnet/Common/Library.fs +++ /dev/null @@ -1,8 +0,0 @@ -module Common - -open FParsec - -let parse parser input = - match run parser input with - | Success (result, _, _) -> result - | _ -> failwith "Invalid input format!" diff --git a/aoc-2022-dotnet/Common/Util.fs b/aoc-2022-dotnet/Common/Util.fs new file mode 100644 index 0000000..a9f3a1e --- /dev/null +++ b/aoc-2022-dotnet/Common/Util.fs @@ -0,0 +1,43 @@ +namespace Common + +module Util = + open System.Globalization + open FParsec + open FSharpPlus + + let parse parser input = + match run parser input with + | Success (result, _, _) -> result + | _ -> failwith "Invalid input format!" + + let countDistinct seq = seq |> Set |> Set.count + + let countWhere pred = Seq.filter pred >> Seq.length + + let charToInt = CharUnicodeInfo.GetDigitValue + + let cutInHalf xs = + let half = Seq.length xs / 2 + [ Seq.take half xs; Seq.skip half xs ] + + let splitStringToTuple sep str = + match Seq.toList <| String.split [ sep ] str with + | [ x; y ] -> x, y + | _ -> failwith "Invalid string format!" + + let topN n xs = + let rec insertSorted x = + function + | h :: t -> min h x :: (insertSorted (max h x) t) + | _ -> [ x ] + + Seq.fold + (fun acc x -> + if List.length acc < n then + insertSorted x acc + elif List.head acc < x then + insertSorted x <| List.tail acc + else + acc) + List.empty + xs diff --git a/aoc-2022-dotnet/Common/Vec2.fs b/aoc-2022-dotnet/Common/Vec2.fs new file mode 100644 index 0000000..20b9956 --- /dev/null +++ b/aoc-2022-dotnet/Common/Vec2.fs @@ -0,0 +1,13 @@ +namespace Common + +type Vec2 = + | Vec2 of int * int + + static member zero = Vec2(0, 0) + + static member (+)(Vec2 (x1, y1), Vec2 (x2, y2)) = Vec2(x1 + x2, y1 + y2) + static member (-)(Vec2 (x1, y1), Vec2 (x2, y2)) = Vec2(x1 - x2, y1 - y2) + + static member apply f (Vec2 (x, y)) = Vec2(f x, f y) + static member sign = Vec2.apply sign + static member chebyshevDist (Vec2 (x1, y1)) (Vec2 (x2, y2)) = max (abs <| x2 - x1) (abs <| y2 - y1) -- cgit v1.2.3