| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- 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);
- }
- }
- }
|