aboutsummaryrefslogtreecommitdiff
path: root/aoc-2022-dotnet/Common/Util.fs
diff options
context:
space:
mode:
Diffstat (limited to 'aoc-2022-dotnet/Common/Util.fs')
-rw-r--r--aoc-2022-dotnet/Common/Util.fs43
1 files changed, 43 insertions, 0 deletions
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