|
|
@@ -0,0 +1,162 @@
|
|
|
+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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|