diff options
author | Brian Chu <brianmchu42@gmail.com> | 2022-12-04 22:15:10 -0800 |
---|---|---|
committer | Brian Chu <brianmchu42@gmail.com> | 2022-12-04 22:15:10 -0800 |
commit | 91714cfa874f1ba6f8a16d400702ab7b074dc5b5 (patch) | |
tree | 092e4858e0f4fefb979140917dadb4dc8f161439 | |
parent | d47a200ff9bef16b5d0a6258dc0e963b44db366d (diff) | |
download | AdventOfCode2022-91714cfa874f1ba6f8a16d400702ab7b074dc5b5.tar.gz |
solution for day 5
-rw-r--r-- | Program.fs | 2 | ||||
-rw-r--r-- | solutions/day5.fs | 61 |
2 files changed, 63 insertions, 0 deletions
diff --git a/Program.fs b/Program.fs index 7a64584..de1421b 100644 --- a/Program.fs +++ b/Program.fs @@ -16,5 +16,7 @@ match (day, part) with | (3, 2) -> Day3.part2 () |> printf "%A\n" | (4, 1) -> Day4.part1 () |> printf "%A\n" | (4, 2) -> Day4.part2 () |> printf "%A\n" +| (5, 1) -> Day5.part1 () |> printf "%A\n" +| (5, 2) -> Day5.part2 () |> printf "%A\n" | (x, y) when (1 <= x && x <= 25) && (y = 1 || y = 2) -> raise (NotImplemented("not implemented yet")) | _ -> raise (NotImplemented("invalid values")) \ No newline at end of file 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<char>[]) 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 |