Created
January 17, 2018 09:46
-
-
Save scoiatael/19bcd3179f74e147dba33263417ca025 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module Dancers | |
type Circle = char array | |
type Move = Circle -> Circle | |
let startingPattern : Circle = Array.ofList ['a'..'p'] | |
let spin (n : int) : Move = | |
fun circle -> | |
let len = Array.length circle in | |
Array.append circle.[(len-n)..(len-1)] circle.[0..(len-n-1)] | |
let exchange (a : int, b : int) : Move = | |
fun circle -> | |
let valA = circle.[a] in | |
circle.[a] <- circle.[b]; | |
circle.[b] <- valA; | |
circle | |
let partner (a : char, b : char) : Move = | |
fun circle -> | |
let idxA = Array.findIndex ((=) a) circle in | |
let idxB = Array.findIndex ((=) b) circle in | |
exchange (idxA, idxB) circle | |
let parseMove (input : string) : Move = | |
let cmd = input.[0] in | |
let args = input.[1..] in | |
let pairOfArray [|a; b|] = (a, b) in | |
let parseExchange = Array.map int >> pairOfArray in | |
let firstChar (x : string) = x.[0] in | |
let parsePartner = Array.map firstChar >> pairOfArray | |
match cmd with | |
| 's' -> args |> int |> spin | |
| 'x' -> args.Split '/' |> parseExchange |> exchange | |
| 'p' -> args.Split '/' |> parsePartner |> partner | |
let parse (input : string) = | |
input.Split ',' | |
|> Array.map parseMove | |
let solve = Array.fold (|>) startingPattern >> System.String | |
let input = System.IO.File.ReadAllText "input.txt" |> parse |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment