using System; using System.Collections; using System.IO; using System.Linq; namespace D21._1 { public class R : StreamReader, IEnumerable { public R(Stream stream) : base(stream) { } public IEnumerator GetEnumerator() { while (true) { var line = ReadLine(); if (line == null) break; yield return line; } } } public class Program { public static char[] Swap(char[] input, int x, int y) { var result = input.Clone() as char[]; var tmp = result[x]; result[x] = result[y]; result[y] = tmp; return result; } public static char[] Swap(char[] input, char x, char y) { var result = new char[input.Length]; for (var i = 0; i < input.Length; i++) { if (input[i] == x) result[i] = y; else if (input[i] == y) result[i] = x; else result[i] = input[i]; } return result; } public static char[] RotateLeft(char[] input, int x) => Rotate(input, 1, x); public static char[] RotateRight(char[] input, int x) => Rotate(input, -1, x); static char[] Rotate(char[] input, int dir, int x) { var result = new char[input.Length]; for (var i = 0; i < input.Length; i++) { int source = i + (dir * x); while (source < 0) source += input.Length; while (source >= input.Length) source -= input.Length; result[i] = input[source]; } return result; } public static int IndexOf(char[] input, char l) { int index = -1; for (int i = 0; i < input.Length; i++) { char c = input[i]; if (c == l) { index = i; break; } } return index; } public static char[] Rotate(char[] input, char x) { var index = IndexOf(input, x); if (index == -1) throw new Exception(); return RotateRight(input, (index >= 4 ? index + 2 : index + 1)); } public static char[] Reverse(char[] input, int x, int y) { var result = new char[input.Length]; for (var i = 0; i < x; i++) result[i] = input[i]; for (int i = x, j = y; i <= y; i++, j--) result[i] = input[j]; for (var i = y + 1; i < input.Length; i++) result[i] = input[i]; return result; } public static char[] Move(char[] input, int x, int y) { var result = input.Clone() as char[]; if (x < y) Array.Copy(result, x + 1, result, x, y - x); else Array.Copy(result, y, result, y + 1, x - y); result[y] = input[x]; return result; } static void Main(string[] args) { var scrambling = "abcdefgh".ToCharArray(); using (var file = new R(File.OpenText(args[0]).BaseStream)) { foreach (string line in file) { if (line.StartsWith("swap position ")) { var i = int.Parse(line.Split(" ")[2]); var j = int.Parse(line.Split(" ")[5]); scrambling = Swap(scrambling, i, j); } else if (line.StartsWith("swap letter ")) { var i = line.Split(" ")[2][0]; var j = line.Split(" ")[5][0]; scrambling = Swap(scrambling, i, j); } else if (line.StartsWith("rotate right ")) { var i = int.Parse(line.Split(" ")[2]); scrambling = RotateRight(scrambling, i); } else if (line.StartsWith("rotate left ")) { var i = int.Parse(line.Split(" ")[2]); scrambling = RotateLeft(scrambling, i); } else if (line.StartsWith("rotate based on position of letter ")) { scrambling = Rotate(scrambling, line.Last()); } else if (line.StartsWith("reverse positions ")) { var i = int.Parse(line.Split(" ")[2]); var j = int.Parse(line.Split(" ")[4]); scrambling = Reverse(scrambling, i, j); } else if (line.StartsWith("move position ")) { var i = int.Parse(line.Split(" ")[2]); var j = int.Parse(line.Split(" ")[5]); scrambling = Move(scrambling, i, j); } } } Console.WriteLine(scrambling); } } }