Skip to content

Instantly share code, notes, and snippets.

@scoiatael
Created January 17, 2018 09:44
Show Gist options
  • Save scoiatael/b18cbbb3f4245b7cc04e1d775e6c6be9 to your computer and use it in GitHub Desktop.
Save scoiatael/b18cbbb3f4245b7cc04e1d775e6c6be9 to your computer and use it in GitHub Desktop.
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