Day 5.
authorGrégory Burri <gregory.burri@matisa.ch>
Wed, 5 Dec 2018 12:30:57 +0000 (13:30 +0100)
committerGrégory Burri <gregory.burri@matisa.ch>
Wed, 5 Dec 2018 12:30:57 +0000 (13:30 +0100)
Day05.fs
Program.fs
Tests/Day05 tests.fs

index f2a0f10..accb3f9 100644 (file)
--- a/Day05.fs
+++ b/Day05.fs
@@ -1,7 +1,21 @@
 module AdventOfCode2018.Day05\r
 \r
 open System\r
-open System.Collections.Generic\r
 \r
-let parseInput (str : string) : string =\r
-    ""\r
+let diffMajMin = int 'A' - int 'a'\r
+\r
+let reduce (polymer : string) : string =\r
+    Seq.foldBack (\r
+        fun a result ->\r
+            match result with\r
+            | b :: rest when int a - int b |> abs = diffMajMin -> rest\r
+            | _ -> a :: result\r
+    ) polymer [ ]\r
+    |> Array.ofList\r
+    |> String.Concat\r
+\r
+let findShortestPolymer (polymer : string) : string =\r
+    polymer.ToLower()\r
+    |> Seq.distinct\r
+    |> Seq.map (fun unit -> polymer.Replace(string unit, "", StringComparison.InvariantCultureIgnoreCase) |> reduce)\r
+    |> Seq.minBy String.length\r
index 418610f..2ff2dd3 100644 (file)
@@ -22,8 +22,8 @@ let day04 () =
     sprintf "part1 = %A, part2 = %A" (sleepestGuardId * sleepestTime) (sleepestGuardIdSameTime * sleepestTimeSameTime)\r
 \r
 let day05 () =\r
-    let foo = File.ReadAllText "Data/day05.input" |> Day05.parseInput\r
-    sprintf "part1 = , part2 = "\r
+    let reduced = (File.ReadAllText "Data/day05.input").Trim () |> Day05.reduce\r
+    sprintf "part1 = %A, part2 = %A" reduced.Length (Day05.findShortestPolymer reduced).Length\r
 \r
 let days : Map<int, unit -> string> =\r
     [\r
index aa0794c..6c47069 100644 (file)
@@ -12,9 +12,11 @@ type ``Day05 tests`` (output : ITestOutputHelper) =
 \r
     [<Fact>]\r
     let ``(Part1) From web page`` () =\r
-        ()\r
+        let input = "dabAcCaCBAcCcaDA"\r
+        Day05.reduce input =! "dabCBAcaDA"\r
 \r
     [<Fact>]\r
     let ``(Part2) From web page`` () =\r
-        ()\r
+        let input = "dabAcCaCBAcCcaDA"\r
+        Day05.findShortestPolymer input =! "daDA"\r
 \r