From 65b82a3f74beb844f8593d69de0391a22750cbd9 Mon Sep 17 00:00:00 2001 From: Smaug123 Date: Mon, 4 Dec 2023 23:40:02 +0000 Subject: [PATCH] Scaffolding --- .../AdventOfCode2023.FSharp.Lib.fsproj | 1 + .../AdventOfCode2023.FSharp.Lib/Day4.fs | 23 ++++++---- .../AdventOfCode2023.FSharp.Lib/Day5.fs | 16 +++++++ .../AdventOfCode2023.FSharp/Program.fs | 13 ++++++ AdventOfCode2023.FSharp/Test/Test.fsproj | 2 + AdventOfCode2023.FSharp/Test/TestDay5.fs | 43 +++++++++++++++++++ AdventOfCode2023.FSharp/Test/samples/day5.txt | 0 7 files changed, 89 insertions(+), 9 deletions(-) create mode 100644 AdventOfCode2023.FSharp/AdventOfCode2023.FSharp.Lib/Day5.fs create mode 100644 AdventOfCode2023.FSharp/Test/TestDay5.fs create mode 100644 AdventOfCode2023.FSharp/Test/samples/day5.txt diff --git a/AdventOfCode2023.FSharp/AdventOfCode2023.FSharp.Lib/AdventOfCode2023.FSharp.Lib.fsproj b/AdventOfCode2023.FSharp/AdventOfCode2023.FSharp.Lib/AdventOfCode2023.FSharp.Lib.fsproj index 29333a6..d989f2b 100644 --- a/AdventOfCode2023.FSharp/AdventOfCode2023.FSharp.Lib/AdventOfCode2023.FSharp.Lib.fsproj +++ b/AdventOfCode2023.FSharp/AdventOfCode2023.FSharp.Lib/AdventOfCode2023.FSharp.Lib.fsproj @@ -12,6 +12,7 @@ + diff --git a/AdventOfCode2023.FSharp/AdventOfCode2023.FSharp.Lib/Day4.fs b/AdventOfCode2023.FSharp/AdventOfCode2023.FSharp.Lib/Day4.fs index 50c2b3d..1f10a48 100644 --- a/AdventOfCode2023.FSharp/AdventOfCode2023.FSharp.Lib/Day4.fs +++ b/AdventOfCode2023.FSharp/AdventOfCode2023.FSharp.Lib/Day4.fs @@ -1,15 +1,21 @@ namespace AdventOfCode2023 open System -open System.Collections.Generic [] module Day4 = + let inline parseByte (chars : ReadOnlySpan) : byte = + // Byte.Parse (chars, NumberStyles.None, NumberFormatInfo.InvariantInfo) + let mutable answer = 0uy + for c in chars do + answer <- answer * 10uy + (byte c - 48uy) + answer + let part1 (s : string) = use lines = StringSplitEnumerator.make '\n' s let mutable total = 0 - let winningNumbers = HashSet () + let winningNumbers = ResizeArray () for line in lines do if not (line.IsWhiteSpace ()) then @@ -30,14 +36,14 @@ module Day4 = if split.Current.[0] = '|' then accumulatingWinning <- false else - winningNumbers.Add (Int32.Parse split.Current) |> ignore + winningNumbers.Add (parseByte split.Current) split.MoveNext () |> ignore let mutable answer = 0 while split.MoveNext () do if not split.Current.IsEmpty then - let n = Int32.Parse split.Current + let n = parseByte split.Current if winningNumbers.Contains n then answer <- answer + 1 @@ -51,9 +57,8 @@ module Day4 = let part2 (s : string) = use lines = StringSplitEnumerator.make '\n' s - let mutable total = 0 - let winningNumbers = HashSet () - let winners = ResizeArray () + let winningNumbers = ResizeArray () + let winners = ResizeArray () for line in lines do if not (line.IsWhiteSpace ()) then @@ -74,14 +79,14 @@ module Day4 = if split.Current.[0] = '|' then accumulatingWinning <- false else - winningNumbers.Add (Int32.Parse split.Current) |> ignore + winningNumbers.Add (parseByte split.Current) split.MoveNext () |> ignore let mutable answer = 0 while split.MoveNext () do if not split.Current.IsEmpty then - let n = Int32.Parse split.Current + let n = parseByte split.Current if winningNumbers.Contains n then answer <- answer + 1 diff --git a/AdventOfCode2023.FSharp/AdventOfCode2023.FSharp.Lib/Day5.fs b/AdventOfCode2023.FSharp/AdventOfCode2023.FSharp.Lib/Day5.fs new file mode 100644 index 0000000..7afa4cd --- /dev/null +++ b/AdventOfCode2023.FSharp/AdventOfCode2023.FSharp.Lib/Day5.fs @@ -0,0 +1,16 @@ +namespace AdventOfCode2023 + +open System +open System.Collections.Generic + +[] +module Day5 = + + let part1 (s : string) = + use lines = StringSplitEnumerator.make '\n' s + 0 + + let part2 (s : string) = + use lines = StringSplitEnumerator.make '\n' s + + 0 diff --git a/AdventOfCode2023.FSharp/AdventOfCode2023.FSharp/Program.fs b/AdventOfCode2023.FSharp/AdventOfCode2023.FSharp/Program.fs index 0f1bfbb..000ca44 100644 --- a/AdventOfCode2023.FSharp/AdventOfCode2023.FSharp/Program.fs +++ b/AdventOfCode2023.FSharp/AdventOfCode2023.FSharp/Program.fs @@ -98,6 +98,19 @@ module Program = Console.WriteLine (part2.ToString ()) Console.Error.WriteLine ((1_000.0 * float sw.ElapsedTicks / float Stopwatch.Frequency).ToString () + "ms") + do + let input = Path.Combine (dir.FullName, "day5.txt") |> File.ReadAllText + sw.Restart () + let part1 = Day5.part1 input + sw.Stop () + Console.WriteLine (part1.ToString ()) + Console.Error.WriteLine ((1_000.0 * float sw.ElapsedTicks / float Stopwatch.Frequency).ToString () + "ms") + sw.Restart () + let part2 = Day5.part2 input + sw.Stop () + Console.WriteLine (part2.ToString ()) + Console.Error.WriteLine ((1_000.0 * float sw.ElapsedTicks / float Stopwatch.Frequency).ToString () + "ms") + endToEnd.Stop () Console.Error.WriteLine ( diff --git a/AdventOfCode2023.FSharp/Test/Test.fsproj b/AdventOfCode2023.FSharp/Test/Test.fsproj index bb7f579..aa21125 100644 --- a/AdventOfCode2023.FSharp/Test/Test.fsproj +++ b/AdventOfCode2023.FSharp/Test/Test.fsproj @@ -13,11 +13,13 @@ + + diff --git a/AdventOfCode2023.FSharp/Test/TestDay5.fs b/AdventOfCode2023.FSharp/Test/TestDay5.fs new file mode 100644 index 0000000..dc38b6b --- /dev/null +++ b/AdventOfCode2023.FSharp/Test/TestDay5.fs @@ -0,0 +1,43 @@ +namespace AdventOfCode2023.Test + +open AdventOfCode2023 +open NUnit.Framework +open FsUnitTyped +open System.IO + +[] +module TestDay5 = + + let sample = Assembly.getEmbeddedResource typeof.Assembly "day5.txt" + + [] + let part1Sample () = sample |> Day5.part1 |> shouldEqual 0 + + [] + let part2Sample () = sample |> Day5.part2 |> shouldEqual 0 + + [] + let part1Actual () = + let s = + try + File.ReadAllText (Path.Combine (__SOURCE_DIRECTORY__, "../../inputs/day5.txt")) + with + | :? DirectoryNotFoundException + | :? FileNotFoundException -> + Assert.Inconclusive () + failwith "unreachable" + + Day5.part1 s |> shouldEqual 0 + + [] + let part2Actual () = + let s = + try + File.ReadAllText (Path.Combine (__SOURCE_DIRECTORY__, "../../inputs/day5.txt")) + with + | :? DirectoryNotFoundException + | :? FileNotFoundException -> + Assert.Inconclusive () + failwith "unreachable" + + Day5.part2 s |> shouldEqual 0 diff --git a/AdventOfCode2023.FSharp/Test/samples/day5.txt b/AdventOfCode2023.FSharp/Test/samples/day5.txt new file mode 100644 index 0000000..e69de29