Program.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. using System;
  2. using System.Collections;
  3. using System.IO;
  4. using System.Linq;
  5. namespace D21._1
  6. {
  7. public class R : StreamReader, IEnumerable
  8. {
  9. public R(Stream stream) : base(stream) { }
  10. public IEnumerator GetEnumerator()
  11. {
  12. while (true)
  13. {
  14. var line = ReadLine();
  15. if (line == null) break;
  16. yield return line;
  17. }
  18. }
  19. }
  20. public class Program
  21. {
  22. public static char[] Swap(char[] input, int x, int y)
  23. {
  24. var result = input.Clone() as char[];
  25. var tmp = result[x];
  26. result[x] = result[y];
  27. result[y] = tmp;
  28. return result;
  29. }
  30. public static char[] Swap(char[] input, char x, char y)
  31. {
  32. var result = new char[input.Length];
  33. for (var i = 0; i < input.Length; i++)
  34. {
  35. if (input[i] == x) result[i] = y;
  36. else if (input[i] == y) result[i] = x;
  37. else result[i] = input[i];
  38. }
  39. return result;
  40. }
  41. public static char[] RotateLeft(char[] input, int x) => Rotate(input, 1, x);
  42. public static char[] RotateRight(char[] input, int x) => Rotate(input, -1, x);
  43. static char[] Rotate(char[] input, int dir, int x)
  44. {
  45. var result = new char[input.Length];
  46. for (var i = 0; i < input.Length; i++)
  47. {
  48. int source = i + (dir * x);
  49. while (source < 0) source += input.Length;
  50. while (source >= input.Length) source -= input.Length;
  51. result[i] = input[source];
  52. }
  53. return result;
  54. }
  55. public static int IndexOf(char[] input, char l)
  56. {
  57. int index = -1;
  58. for (int i = 0; i < input.Length; i++)
  59. {
  60. char c = input[i];
  61. if (c == l)
  62. {
  63. index = i;
  64. break;
  65. }
  66. }
  67. return index;
  68. }
  69. public static char[] Rotate(char[] input, char x)
  70. {
  71. var index = IndexOf(input, x);
  72. if (index == -1) throw new Exception();
  73. return RotateRight(input, (index >= 4 ? index + 2 : index + 1));
  74. }
  75. public static char[] Reverse(char[] input, int x, int y)
  76. {
  77. var result = new char[input.Length];
  78. for (var i = 0; i < x; i++) result[i] = input[i];
  79. for (int i = x, j = y; i <= y; i++, j--) result[i] = input[j];
  80. for (var i = y + 1; i < input.Length; i++) result[i] = input[i];
  81. return result;
  82. }
  83. public static char[] Move(char[] input, int x, int y)
  84. {
  85. var result = input.Clone() as char[];
  86. if (x < y) Array.Copy(result, x + 1, result, x, y - x);
  87. else Array.Copy(result, y, result, y + 1, x - y);
  88. result[y] = input[x];
  89. return result;
  90. }
  91. static void Main(string[] args)
  92. {
  93. var scrambling = "abcdefgh".ToCharArray();
  94. using (var file = new R(File.OpenText(args[0]).BaseStream))
  95. {
  96. foreach (string line in file)
  97. {
  98. if (line.StartsWith("swap position "))
  99. {
  100. var i = int.Parse(line.Split(" ")[2]);
  101. var j = int.Parse(line.Split(" ")[5]);
  102. scrambling = Swap(scrambling, i, j);
  103. }
  104. else if (line.StartsWith("swap letter "))
  105. {
  106. var i = line.Split(" ")[2][0];
  107. var j = line.Split(" ")[5][0];
  108. scrambling = Swap(scrambling, i, j);
  109. }
  110. else if (line.StartsWith("rotate right "))
  111. {
  112. var i = int.Parse(line.Split(" ")[2]);
  113. scrambling = RotateRight(scrambling, i);
  114. }
  115. else if (line.StartsWith("rotate left "))
  116. {
  117. var i = int.Parse(line.Split(" ")[2]);
  118. scrambling = RotateLeft(scrambling, i);
  119. }
  120. else if (line.StartsWith("rotate based on position of letter "))
  121. {
  122. scrambling = Rotate(scrambling, line.Last());
  123. }
  124. else if (line.StartsWith("reverse positions "))
  125. {
  126. var i = int.Parse(line.Split(" ")[2]);
  127. var j = int.Parse(line.Split(" ")[4]);
  128. scrambling = Reverse(scrambling, i, j);
  129. }
  130. else if (line.StartsWith("move position "))
  131. {
  132. var i = int.Parse(line.Split(" ")[2]);
  133. var j = int.Parse(line.Split(" ")[5]);
  134. scrambling = Move(scrambling, i, j);
  135. }
  136. }
  137. }
  138. Console.WriteLine(scrambling);
  139. }
  140. }
  141. }