Day 8
authorGreg Burri <greg.burri@gmail.com>
Fri, 8 Dec 2017 05:50:58 +0000 (06:50 +0100)
committerGreg Burri <greg.burri@gmail.com>
Fri, 8 Dec 2017 05:50:58 +0000 (06:50 +0100)
AdventOfCode2017/AdventOfCode2017.fsproj
AdventOfCode2017/Day8.fs [new file with mode: 0644]
AdventOfCode2017/Program.fs
Tests/Day8 tests.fs [new file with mode: 0644]
Tests/Tests.fsproj

index dcabd03..b0c1b37 100644 (file)
@@ -25,7 +25,7 @@
     <PlatformTarget>AnyCPU</PlatformTarget>
     <DocumentationFile>bin\$(Configuration)\$(AssemblyName).XML</DocumentationFile>
     <Prefer32Bit>true</Prefer32Bit>
-    <StartArguments>7</StartArguments>
+    <StartArguments>8</StartArguments>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>pdbonly</DebugType>
@@ -63,6 +63,7 @@
     <Compile Include="Day5.fs" />
     <Compile Include="Day6.fs" />
     <Compile Include="Day7.fs" />
+    <Compile Include="Day8.fs" />
     <Compile Include="Program.fs" />
     <None Include="App.config" />
     <None Include="Data\day1.input">
@@ -83,6 +84,9 @@
     <None Include="Data\day7.input">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
+    <None Include="Data\day8.input">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
     <Content Include="packages.config" />
   </ItemGroup>
   <ItemGroup>
diff --git a/AdventOfCode2017/Day8.fs b/AdventOfCode2017/Day8.fs
new file mode 100644 (file)
index 0000000..04ec413
--- /dev/null
@@ -0,0 +1,30 @@
+module AdventOfCode2017.Day8
+
+open System
+
+type Instruction = string * string * int * string * string * int
+
+let parseInput (lines : string[]) : Instruction list =
+    lines
+    |> List.ofArray
+    |> List.map (
+        fun line ->
+            let line = line.Split ([| '\r'; '\t'; ' ' |], StringSplitOptions.RemoveEmptyEntries)
+            ( line.[0], line.[1], int line.[2], line.[4], line.[5], int line.[6])
+    )
+
+let execute (input : Instruction list) : int * int =
+    let highest, register =
+        input
+        |> List.fold (
+            fun (highest, register) (reg, ins, value, regCond, op, valueCond) ->
+                let regCondValue = register |> Map.tryFind regCond |> Option.defaultValue 0
+                let op' = match op with ">" -> (>) | "<" -> (<) | ">=" -> (>=) | "<=" -> (<=) | "!=" -> (<>) | "==" | _ -> (=)
+                if op' regCondValue valueCond then
+                    let regValue = register |> Map.tryFind reg |> Option.defaultValue 0
+                    let regValue' = match ins with "inc" -> regValue + value | "dec" -> regValue - value | _ -> regValue
+                    max highest regValue', register |> Map.add reg regValue'
+                else
+                    highest, register
+        ) (Int32.MinValue, Map.empty)
+    highest, (register |> Map.toList |> List.map snd |> List.max)
index 7344c5c..a53a948 100644 (file)
@@ -33,6 +33,11 @@ let day7 () =
     let tower = Day7.buildTower input
     sprintf "part1 = %A, part2 = %A" tower.Name (Day7.findUnbalanced tower |> Option.map (fun (t, w) -> t.Name, w))
 
+let day8 () =
+    let input = File.ReadAllLines "Data/day8.input" |> Day8.parseInput
+    let part1, part2 = Day8.execute input
+    sprintf "part1 = %A, part2 = %A" part1 part2
+
 let doDay (n : int) =
     let sw = Diagnostics.Stopwatch ()
     sw.Start ()
@@ -45,6 +50,7 @@ let doDay (n : int) =
         | 5 -> day5 ()
         | 6 -> day6 ()
         | 7 -> day7 ()
+        | 8 -> day8 ()
         | _ -> raise <| NotImplementedException ()
     printfn "Result of day %i: %s (time : %i ms)" n result sw.ElapsedMilliseconds
 
@@ -57,4 +63,6 @@ let main argv =
     else
         for d = 1 to 25 do
             doDay d
+
+    Console.ReadKey () |> ignore
     0
diff --git a/Tests/Day8 tests.fs b/Tests/Day8 tests.fs
new file mode 100644 (file)
index 0000000..823ca8d
--- /dev/null
@@ -0,0 +1,33 @@
+namespace AdventOfCode2017.Tests
+
+open Xunit
+open Xunit.Abstractions
+open Swensen.Unquote
+
+open AdventOfCode2017
+
+type ``Day8 tests`` (output : ITestOutputHelper) =
+
+    [<Fact>]
+    let ``(Part1) From web page`` () =
+        let input =
+            [|
+                "b inc 5 if a > 1"
+                "a inc 1 if b < 5"
+                "c dec -10 if a >= 1"
+                "c inc -20 if c == 10"
+            |]
+        let p1, _ = Day8.execute (Day8.parseInput input)
+        p1 = 1
+
+    [<Fact>]
+    let ``(Part2) From web page`` () =
+        let input =
+            [|
+                "b inc 5 if a > 1"
+                "a inc 1 if b < 5"
+                "c dec -10 if a >= 1"
+                "c inc -20 if c == 10"
+            |]
+        let _, p2 = Day8.execute (Day8.parseInput input)
+        p2 = 10
\ No newline at end of file
index 0bec47c..fe9fc9c 100644 (file)
@@ -62,6 +62,7 @@
     <Compile Include="Day5 tests.fs" />
     <Compile Include="Day6 tests.fs" />
     <Compile Include="Day7 tests.fs" />
+    <Compile Include="Day8 tests.fs" />
     <Content Include="packages.config" />
     <Content Include="App.config" />
   </ItemGroup>