From 91714cfa874f1ba6f8a16d400702ab7b074dc5b5 Mon Sep 17 00:00:00 2001 From: Brian Chu Date: Sun, 4 Dec 2022 22:15:10 -0800 Subject: solution for day 5 --- solutions/day5.fs | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 solutions/day5.fs (limited to 'solutions') diff --git a/solutions/day5.fs b/solutions/day5.fs new file mode 100644 index 0000000..6c8bce3 --- /dev/null +++ b/solutions/day5.fs @@ -0,0 +1,61 @@ +namespace Solutions + +module Day5 = + open System.IO + open System.Text.RegularExpressions + + // forgive me lord for what i'm about to do + // too lazy to figure out how to parse initial state so hardcoding instead + let initState = [| + ['D'; 'T'; 'W'; 'N'; 'L']; + ['H'; 'P'; 'C']; + ['J'; 'M'; 'G'; 'D'; 'N'; 'H'; 'P'; 'W']; + ['L'; 'Q'; 'T'; 'N'; 'S'; 'W'; 'C']; + ['N'; 'C'; 'H'; 'P']; + ['B'; 'Q'; 'W'; 'M'; 'D'; 'N'; 'H'; 'T']; + ['L'; 'S'; 'G'; 'J'; 'R'; 'B'; 'M']; + ['T'; 'R'; 'B'; 'V'; 'G'; 'W'; 'N'; 'Z']; + ['L'; 'P'; 'N'; 'D'; 'G'; 'W'] + |] + + type instruction = { + amount: int; + source: int; + target: int + } + + let getInstruction inst = + let matches = Regex.Matches(inst, "move (\d+) from (\d+) to (\d+)") + |> Seq.head + |> fun x -> x.Groups + |> List.ofSeq |> List.tail + |> List.map (fun x -> int x.Value) + assert (List.length matches = 3) + {amount = matches[0]; source = matches[1] - 1; target = matches[2] - 1} + + let instructions = File.ReadLines("inputs/day5.txt") + |> Array.ofSeq + |> fun x -> Array.splitAt (Array.findIndex ((=) "") x) x + |> snd |> Array.tail |> Array.map getInstruction + + let executeInstruction1 (state: list[]) inst = + for _ in 1..inst.amount do + match state[inst.source] with + | top::bottom -> + state[inst.source] <- bottom + state[inst.target] <- top::state[inst.target] + | _ -> failwith "this shouldn't happen" + + let part1 () = + let mutable currentState = initState + Array.iter (executeInstruction1 currentState) instructions + Array.map (List.head >> string) currentState |> String.concat "" + + let executeInstruction2 (state: char [] []) inst = + state[inst.target] <- Array.append state[inst.source].[..inst.amount-1] state[inst.target] + state[inst.source] <- state[inst.source][inst.amount..] + + let part2 () = + let mutable currentState = initState |> Array.map Array.ofList + Array.iter (executeInstruction2 currentState) instructions + Array.map (Array.head >> string) currentState |> String.concat "" \ No newline at end of file -- cgit 1.4.1-2-gfad0