Created
January 17, 2018 09:44
-
-
Save scoiatael/b18cbbb3f4245b7cc04e1d775e6c6be9 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 | |
let runOnce state = Array.fold (|>) state input | |
let runi n = [1..n] |> Seq.fold (fun st _ -> runOnce st) startingPattern |> System.String | |
// You can run it on OS X/Linux with | |
// fsharpc Script.fsx; and time mono ./Script.exe | |
let () = | |
printf "Solution is %s\n" <| runi 1000 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment