diff options
Diffstat (limited to 'solutions/day10.fs')
-rw-r--r-- | solutions/day10.fs | 66 |
1 files changed, 32 insertions, 34 deletions
diff --git a/solutions/day10.fs b/solutions/day10.fs index 799850d..59ede91 100644 --- a/solutions/day10.fs +++ b/solutions/day10.fs @@ -1,34 +1,32 @@ -namespace Solutions - -module Day10 = - open System.IO - open System.Text.RegularExpressions - - let (|InstRegex|_|) pattern line = - let matched = Regex.Match(line, pattern) - if matched.Success then - matched.Groups |> Seq.tail |> Seq.map (fun x -> x.Value) |> List.ofSeq |> Some - else None - - let parseInst line = - match line with - | InstRegex "noop" [] -> [0] - | InstRegex "addx (-?\d+)" x -> [0; (int x[0])] - | _ -> failwith "invalid input" - - let changes = File.ReadLines("inputs/day10.txt") |> Seq.map parseInst |> List.concat - - let executeInsts changes = - List.scan (+) 1 changes - - let getStateSum cycles (states: int list) = - cycles |> List.map (fun x -> x * states[x-1]) |> List.sum - - let part1 () = executeInsts changes |> getStateSum [20; 60; 100; 140; 180; 220] - - let part2 () = executeInsts changes - |> List.mapi (fun pixel signal -> abs (signal - (pixel % 40)) <= 1) - |> List.map (fun x -> if x then "#" else " ") - |> List.chunkBySize 40 - |> List.map (String.concat "") - |> List.iter (printf "%s\n") \ No newline at end of file +module Solutions.Day10 +open System.IO +open System.Text.RegularExpressions + +let (|InstRegex|_|) pattern line = + let matched = Regex.Match(line, pattern) + if matched.Success then + matched.Groups |> Seq.tail |> Seq.map (fun x -> x.Value) |> List.ofSeq |> Some + else None + +let parseInst line = + match line with + | InstRegex "noop" [] -> [0] + | InstRegex "addx (-?\d+)" x -> [0; (int x[0])] + | _ -> failwith "invalid input" + +let changes = File.ReadLines("inputs/day10.txt") |> Seq.map parseInst |> List.concat + +let executeInsts changes = + List.scan (+) 1 changes + +let getStateSum cycles (states: int list) = + cycles |> List.map (fun x -> x * states[x-1]) |> List.sum + +let part1 () = executeInsts changes |> getStateSum [20; 60; 100; 140; 180; 220] + +let part2 () = executeInsts changes + |> List.mapi (fun pixel signal -> abs (signal - (pixel % 40)) <= 1) + |> List.map (fun x -> if x then "#" else " ") + |> List.chunkBySize 40 + |> List.map (String.concat "") + |> List.iter (printf "%s\n") \ No newline at end of file |