Day 7, part 1.
authorGrégory Burri <gregory.burri@matisa.ch>
Fri, 7 Dec 2018 13:02:29 +0000 (14:02 +0100)
committerGrégory Burri <gregory.burri@matisa.ch>
Fri, 7 Dec 2018 13:02:29 +0000 (14:02 +0100)
AdventOfCode2018.fsproj
Day07.fs [new file with mode: 0644]
Program.fs
Tests/Day07 tests.fs [new file with mode: 0644]
Tests/Tests.fsproj

index 7026dc3..e78a65c 100644 (file)
@@ -4,6 +4,7 @@
     <TargetFramework>netcoreapp2.1</TargetFramework>\r
   </PropertyGroup>\r
   <ItemGroup>\r
+    <Compile Include="Day07.fs" />\r
     <Compile Include="Day06.fs" />\r
     <Compile Include="Day05.fs" />\r
     <Compile Include="Day04.fs" />\r
@@ -11,6 +12,9 @@
     <Compile Include="Day02.fs" />\r
     <Compile Include="Day01.fs" />\r
     <Compile Include="Program.fs" />\r
+    <Content Include="Data/day07.input">\r
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r
+    </Content>\r
     <Content Include="Data/day06.input">\r
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r
     </Content>\r
diff --git a/Day07.fs b/Day07.fs
new file mode 100644 (file)
index 0000000..9274501
--- /dev/null
+++ b/Day07.fs
@@ -0,0 +1,26 @@
+module AdventOfCode2018.Day07\r
+\r
+open System\r
+\r
+type Constraint = char * char\r
+\r
+let parseInput (str : string) : Constraint array =\r
+    str.Split ([| '\r'; '\n'; |], StringSplitOptions.RemoveEmptyEntries)\r
+    |> Array.map (\r
+        fun line ->\r
+            let trimmedLine = line.Trim  ()\r
+            trimmedLine.[5], trimmedLine.[36]\r
+    )\r
+\r
+let order (constraints : Constraint array) : char array =\r
+    let constraints = constraints |> Array.sortBy fst\r
+\r
+    let rec loop (constraints : Constraint array) : char list =\r
+        match constraints with\r
+        | [| (a, b) |] -> [ a; b ]\r
+        | _ ->\r
+            let next = constraints |> Array.pick (fun (a, _) -> if constraints |> Array.forall (fun (_, b) -> a <> b) then Some a else None)\r
+            let rest = constraints |> Array.filter (fst >> ((<>) next))\r
+            next :: (loop rest)\r
+\r
+    loop constraints |> Array.ofList
\ No newline at end of file
index fcb5fc1..ac4a5d3 100644 (file)
@@ -29,6 +29,10 @@ let day06 () =
     let coords = File.ReadAllText "Data/day06.input" |> Day06.parseInput\r
     sprintf "part1 = %A, part2 = %A" (Day06.getLargestArea coords) (Day06.getAreaWithTotalDistanceLessThan 10000 coords)\r
 \r
+let day07 () =\r
+    let constraints = File.ReadAllText "Data/day07.input" |> Day07.parseInput\r
+    sprintf "part1 = %A, part2 =" (Day07.order constraints |> String.Concat)\r
+\r
 let days : Map<int, unit -> string> =\r
     [\r
         1, day01\r
@@ -37,6 +41,7 @@ let days : Map<int, unit -> string> =
         4, day04\r
         5, day05\r
         6, day06\r
+        7, day07\r
     ] |> Map.ofList\r
 \r
 let doDay (n : int) =\r
diff --git a/Tests/Day07 tests.fs b/Tests/Day07 tests.fs
new file mode 100644 (file)
index 0000000..6a96601
--- /dev/null
@@ -0,0 +1,29 @@
+namespace AdventOfCode2018.Tests\r
+\r
+open System\r
+\r
+open Xunit\r
+open Xunit.Abstractions\r
+open Swensen.Unquote\r
+\r
+open AdventOfCode2018\r
+\r
+type ``Day07 tests`` (output : ITestOutputHelper) =\r
+    let input =\r
+        """Step C must be finished before step A can begin.\r
+           Step C must be finished before step F can begin.\r
+           Step A must be finished before step B can begin.\r
+           Step A must be finished before step D can begin.\r
+           Step B must be finished before step E can begin.\r
+           Step D must be finished before step E can begin.\r
+           Step F must be finished before step E can begin."""\r
+\r
+    [<Fact>]\r
+    let ``(Part1) From web page`` () =\r
+        let constrains = Day07.parseInput input\r
+        Day07.order constrains |> String.Concat =! "CABDFE"\r
+\r
+    [<Fact>]\r
+    let ``(Part2) From web page`` () =\r
+        ()\r
+\r
index 0042788..b905858 100644 (file)
@@ -6,6 +6,7 @@
     <ProjectReference Include="..\AdventOfCode2018.fsproj" />\r
   </ItemGroup>\r
   <ItemGroup>\r
+    <Compile Include="Day07 tests.fs" />\r
     <Compile Include="Day06 tests.fs" />\r
     <Compile Include="Day05 tests.fs" />\r
     <Compile Include="Day04 tests.fs" />\r