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