Day 11
authorUmmon <greg.burri@gmail.com>
Mon, 11 Dec 2017 07:44:54 +0000 (08:44 +0100)
committerUmmon <greg.burri@gmail.com>
Mon, 11 Dec 2017 07:44:54 +0000 (08:44 +0100)
AdventOfCode2017/AdventOfCode2017.fsproj
AdventOfCode2017/Day11.fs [new file with mode: 0644]
AdventOfCode2017/Program.fs
Tests/Day11 tests.fs [new file with mode: 0644]
Tests/Tests.fsproj

index 6aa72c3..3596929 100644 (file)
@@ -25,7 +25,7 @@
     <PlatformTarget>AnyCPU</PlatformTarget>
     <DocumentationFile>bin\$(Configuration)\$(AssemblyName).XML</DocumentationFile>
     <Prefer32Bit>true</Prefer32Bit>
-    <StartArguments>10</StartArguments>
+    <StartArguments>11</StartArguments>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>pdbonly</DebugType>
@@ -66,6 +66,7 @@
     <Compile Include="Day8.fs" />
     <Compile Include="Day9.fs" />
     <Compile Include="Day10.fs" />
+    <Compile Include="Day11.fs" />
     <Compile Include="Program.fs" />
     <None Include="App.config" />
     <None Include="Data\day1.input">
@@ -92,7 +93,7 @@
     <None Include="Data\day9.input">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="Data\day10.input">
+    <None Include="Data\day11.input">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
     <Content Include="packages.config" />
diff --git a/AdventOfCode2017/Day11.fs b/AdventOfCode2017/Day11.fs
new file mode 100644 (file)
index 0000000..6adba52
--- /dev/null
@@ -0,0 +1,24 @@
+module AdventOfCode2017.Day11
+
+let parseInput (input : string) : string list = input.Split ',' |> List.ofArray
+
+let distanceInHex (moves : string list) =
+    let distance (x, y) =
+        let x, y = abs x, abs y
+        if y >= x then y + (x - y) / 2 else x
+
+    let rec next (x, y) further (moves : string list) =
+        let further' = distance (x, y) |> max further
+        match moves with
+        | "n"  :: xs -> next (x, y + 2) further' xs
+        | "ne" :: xs -> next (x + 1, y + 1) further' xs
+        | "se" :: xs -> next (x + 1, y - 1) further' xs
+        | "s"  :: xs -> next (x, y - 2) further' xs
+        | "sw" :: xs -> next (x - 1, y - 1) further' xs
+        | "nw" :: xs -> next (x - 1, y + 1) further' xs
+        | _ -> (x, y), further'
+
+    let destination, further = next (0, 0) 0 moves
+    distance destination, further
+
+
index f26861b..0c95606 100644 (file)
@@ -47,6 +47,11 @@ let day10 () =
     let input = "83,0,193,1,254,237,187,40,88,27,2,255,149,29,42,100"
     sprintf "part1 = %A, part2 = %A" (Day10.knotHash1 input 256) (Day10.knotHash2 input)
 
+let day11 () =
+    let input = File.ReadAllText "Data/day11.input" |> Day11.parseInput
+    let part1, part2 = Day11.distanceInHex input
+    sprintf "part1 = %A, part2 = %A" part1 part2
+
 let doDay (n : int) =
     let sw = Diagnostics.Stopwatch ()
     sw.Start ()
@@ -62,6 +67,7 @@ let doDay (n : int) =
         | 8 -> day8 ()
         | 9 -> day9 ()
         | 10 -> day10 ()
+        | 11 -> day11 ()
         | _ -> raise <| NotImplementedException ()
     printfn "Result of day %i: %s (time : %i ms)" n result sw.ElapsedMilliseconds
 
diff --git a/Tests/Day11 tests.fs b/Tests/Day11 tests.fs
new file mode 100644 (file)
index 0000000..4dc12bf
--- /dev/null
@@ -0,0 +1,23 @@
+namespace AdventOfCode2017.Tests
+
+open Xunit
+open Xunit.Abstractions
+open Swensen.Unquote
+
+open AdventOfCode2017
+
+type ``Day11 tests`` (output : ITestOutputHelper) =
+
+    [<Fact>]
+    let ``(Part1) From web page`` () =
+        Day11.distanceInHex (Day11.parseInput "ne,ne,ne") |> fst =! 3
+        Day11.distanceInHex (Day11.parseInput "ne,ne,sw,sw") |> fst =! 0
+        Day11.distanceInHex (Day11.parseInput "ne,ne,s,s") |> fst =! 2
+        Day11.distanceInHex (Day11.parseInput "se,sw,se,sw,sw") |> fst =! 3
+
+    [<Fact>]
+    let ``(Part2) From web page`` () =
+        Day11.distanceInHex (Day11.parseInput "ne,ne,ne") |> snd =! 3
+        Day11.distanceInHex (Day11.parseInput "ne,ne,sw,sw") |> snd =! 2
+        Day11.distanceInHex (Day11.parseInput "ne,ne,s,s") |> snd =! 2
+        Day11.distanceInHex (Day11.parseInput "se,sw,se,sw,sw") |> snd =! 3
\ No newline at end of file
index aec44f8..21e504c 100644 (file)
@@ -65,6 +65,7 @@
     <Compile Include="Day8 tests.fs" />
     <Compile Include="Day9 tests.fs" />
     <Compile Include="Day10 tests.fs" />
+    <Compile Include="Day11 tests.fs" />
     <Content Include="packages.config" />
     <Content Include="App.config" />
   </ItemGroup>