More concise
authorUmmon <greg.burri@gmail.com>
Fri, 8 Dec 2017 07:31:04 +0000 (08:31 +0100)
committerUmmon <greg.burri@gmail.com>
Fri, 8 Dec 2017 07:31:04 +0000 (08:31 +0100)
AdventOfCode2017/Day8.fs

index fcdda30..b9f6789 100644 (file)
@@ -2,15 +2,15 @@
 
 open System
 
-type Instruction = string * string * int * string * string * int
+type Instruction = string * string * int * string * (int -> int -> bool) * 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 line = line.Split ' '
+            line.[0], line.[1], int line.[2], line.[4], (match line.[5] with ">" -> (>) | "<" -> (<) | ">=" -> (>=) | "<=" -> (<=) | "!=" -> (<>) | "==" | _ -> (=)), int line.[6]
     )
 
 let execute (input : Instruction list) : int * int =
@@ -18,9 +18,7 @@ let execute (input : Instruction list) : int * int =
         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
+                if op (register |> Map.tryFind regCond |> Option.defaultValue 0) valueCond then
                     let regValue' = (register |> Map.tryFind reg |> Option.defaultValue 0) + match ins with "inc" -> value | "dec" -> -value | _ -> 0
                     max highest regValue', register |> Map.add reg regValue'
                 else