Day 9
authorGreg Burri <greg.burri@gmail.com>
Sat, 9 Dec 2017 10:55:10 +0000 (11:55 +0100)
committerGreg Burri <greg.burri@gmail.com>
Sat, 9 Dec 2017 10:55:10 +0000 (11:55 +0100)
AdventOfCode2017/AdventOfCode2017.fsproj
AdventOfCode2017/Day9.fs [new file with mode: 0644]
AdventOfCode2017/Program.fs
Tests/Day9 tests.fs [new file with mode: 0644]
Tests/Tests.fsproj

index b0c1b37..d8c9d47 100644 (file)
@@ -25,7 +25,7 @@
     <PlatformTarget>AnyCPU</PlatformTarget>
     <DocumentationFile>bin\$(Configuration)\$(AssemblyName).XML</DocumentationFile>
     <Prefer32Bit>true</Prefer32Bit>
-    <StartArguments>8</StartArguments>
+    <StartArguments>9</StartArguments>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>pdbonly</DebugType>
@@ -64,6 +64,7 @@
     <Compile Include="Day6.fs" />
     <Compile Include="Day7.fs" />
     <Compile Include="Day8.fs" />
+    <Compile Include="Day9.fs" />
     <Compile Include="Program.fs" />
     <None Include="App.config" />
     <None Include="Data\day1.input">
@@ -87,6 +88,9 @@
     <None Include="Data\day8.input">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
+    <None Include="Data\day9.input">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
     <Content Include="packages.config" />
   </ItemGroup>
   <ItemGroup>
diff --git a/AdventOfCode2017/Day9.fs b/AdventOfCode2017/Day9.fs
new file mode 100644 (file)
index 0000000..eba06af
--- /dev/null
@@ -0,0 +1,13 @@
+module AdventOfCode2017.Day9
+
+let score (input : string) =
+    let rec next (l : int) (lSum : int) (gb : bool) (gbSize : int) =
+        function
+        | '{' :: tail when not gb -> next (l + 1) (lSum + l) gb gbSize tail
+        | '}' :: tail when not gb -> next (l - 1) lSum gb gbSize tail
+        | '<' :: tail when not gb -> next l lSum true gbSize tail
+        | '!' :: _ :: tail when gb -> next l lSum gb gbSize tail
+        | '>' :: tail when gb -> next l lSum false gbSize tail
+        | a :: tail -> next l lSum gb (gbSize + if gb then 1 else 0) tail
+        | [] -> lSum, gbSize
+    List.ofSeq input |> next 1 0 false 0
\ No newline at end of file
index a53a948..a3d56fb 100644 (file)
@@ -38,6 +38,11 @@ let day8 () =
     let part1, part2 = Day8.execute input
     sprintf "part1 = %A, part2 = %A" part1 part2
 
+let day9 () =
+    let input = File.ReadAllText "Data/day9.input"
+    let part1, part2 = Day9.score input
+    sprintf "part1 = %A, part2 = %A" part1 part2
+
 let doDay (n : int) =
     let sw = Diagnostics.Stopwatch ()
     sw.Start ()
@@ -51,6 +56,7 @@ let doDay (n : int) =
         | 6 -> day6 ()
         | 7 -> day7 ()
         | 8 -> day8 ()
+        | 9 -> day9 ()
         | _ -> raise <| NotImplementedException ()
     printfn "Result of day %i: %s (time : %i ms)" n result sw.ElapsedMilliseconds
 
diff --git a/Tests/Day9 tests.fs b/Tests/Day9 tests.fs
new file mode 100644 (file)
index 0000000..8f60226
--- /dev/null
@@ -0,0 +1,30 @@
+namespace AdventOfCode2017.Tests
+
+open Xunit
+open Xunit.Abstractions
+open Swensen.Unquote
+
+open AdventOfCode2017
+
+type ``Day9 tests`` (output : ITestOutputHelper) =
+
+    [<Fact>]
+    let ``(Part1) From web page`` () =
+        Day9.score "{}" |> fst =! 1
+        Day9.score "{{{}}}" |> fst =! 6
+        Day9.score "{{},{}}" |> fst =! 5
+        Day9.score "{{{},{},{{}}}}" |> fst =! 16
+        Day9.score "{<a>,<a>,<a>,<a>}" |> fst =! 1
+        Day9.score "{{<ab>},{<ab>},{<ab>},{<ab>}}" |> fst =! 9
+        Day9.score "{{<!!>},{<!!>},{<!!>},{<!!>}}" |> fst =! 9
+        Day9.score "{{<a!>},{<a!>},{<a!>},{<ab>}}" |> fst =! 3
+
+    [<Fact>]
+    let ``(Part2) From web page`` () =
+        Day9.score "<>" |> snd =! 0
+        Day9.score "<random characters>" |> snd =! 17
+        Day9.score "<<<<>" |> snd =! 3
+        Day9.score "<{!>}>" |> snd =! 2
+        Day9.score "<!!>" |> snd =! 0
+        Day9.score "<!!!>>" |> snd =! 0
+        Day9.score """<{o"i!a,<{i<a>""" |> snd =! 10
\ No newline at end of file
index fe9fc9c..0bbea9f 100644 (file)
@@ -63,6 +63,7 @@
     <Compile Include="Day6 tests.fs" />
     <Compile Include="Day7 tests.fs" />
     <Compile Include="Day8 tests.fs" />
+    <Compile Include="Day9 tests.fs" />
     <Content Include="packages.config" />
     <Content Include="App.config" />
   </ItemGroup>