private static string PerformDanceMove(string programs, IDanceMove danceMove) { switch (danceMove.Type) { case DanceMoveType.Spin: SpinDanceMove spinDanceMove = (SpinDanceMove)danceMove; return(string.Join(string.Empty, programs.Skip(programs.Length - spinDanceMove.X)) + string.Join(string.Empty, programs.Take(programs.Length - spinDanceMove.X))); case DanceMoveType.Exchange: ExchangeDanceMove exchangeDanceMove = (ExchangeDanceMove)danceMove; char a = programs[exchangeDanceMove.A]; char b = programs[exchangeDanceMove.B]; char[] exchangeChars = programs.ToCharArray(); exchangeChars[exchangeDanceMove.B] = a; exchangeChars[exchangeDanceMove.A] = b; return(string.Join(string.Empty, exchangeChars)); case DanceMoveType.Partner: PartnerDanceMove partnerDanceMove = (PartnerDanceMove)danceMove; int idxA = programs.IndexOf(partnerDanceMove.A); int idxB = programs.IndexOf(partnerDanceMove.B); char[] partnerChars = programs.ToCharArray(); partnerChars[idxA] = programs[idxB]; partnerChars[idxB] = programs[idxA]; return(string.Join(string.Empty, partnerChars)); default: throw new ArgumentException(); } }
private IDanceMove ParseMove(string move) { IDanceMove parsedMove = null; switch (move[0]) { case 's': parsedMove = new Spin() { NumToMove = Int32.Parse(move.Substring(1)) }; break; case 'x': parsedMove = new Exchange() { PositionA = Int32.Parse(move.Substring(1, move.IndexOf('/') - 1)), PositionB = Int32.Parse(move.Substring( move.IndexOf('/') + 1 )) }; break; case 'p': parsedMove = new Partner() { PositionA = move.Substring(1, move.IndexOf('/') - 1), PositionB = move.Substring(move.IndexOf('/') + 1) }; break; default: throw new InvalidDataException("Dance move data is invalid."); } return(parsedMove); }