Advertisement
Guest User

Untitled

a guest
Aug 10th, 2017
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.55 KB | None | 0 0
  1. string eng = "qwertyuiop[]asdfghjkl;'zxcvbnm,.QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>`~ёЁ";
  2. string ru = "йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮеЕеЕ";
  3. for (int i = 0; i < eng.Length; ++i)
  4. if (query.Contains(eng[i]))
  5. query = query.Replace(eng[i], ru[i]);
  6.  
  7. public sealed class Replacer
  8. {
  9. private readonly Dictionary<Char, Char> _dictionary;
  10.  
  11. public Replacer(String sourceSymbols, String targetSymbols)
  12. {
  13. if (sourceSymbols.Length != targetSymbols.Length)
  14. throw new NotSupportedException("sourceSymbols.Length != targetSymbols.Length");
  15.  
  16. Int32 count = sourceSymbols.Length;
  17.  
  18. Dictionary<Char, Char> dictionary = new Dictionary<Char, Char>(count);
  19. for (int i = 0; i < count; i++)
  20. dictionary.Add(sourceSymbols[i], targetSymbols[i]);
  21.  
  22. _dictionary = dictionary;
  23. }
  24.  
  25. public void FixCharacters(ref String query)
  26. {
  27. if (String.IsNullOrEmpty(query))
  28. return;
  29.  
  30. unsafe
  31. {
  32. Int32 index = query.Length - 1;
  33. fixed (Char* chPtr = query)
  34. {
  35. while (index >= 0)
  36. {
  37. Char oldChar = chPtr[index];
  38.  
  39. Char newChar;
  40. if (_dictionary.TryGetValue(oldChar, out newChar))
  41. chPtr[index] = newChar;
  42.  
  43. index--;
  44. }
  45. }
  46. }
  47. }
  48. }
  49.  
  50. static void Main(string[] args)
  51. {
  52. String eng = "qwertyuiop[]asdfghjkl;'zxcvbnm,.QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>`~ёЁ";
  53. String rus = "йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮеЕеЕ";
  54.  
  55. Replacer replacer = new Replacer(eng, rus);
  56.  
  57. for (int i = 0; i < 10; i++)
  58. {
  59. String query = $"Hello World {i}";
  60.  
  61. replacer.FixCharacters(ref query);
  62.  
  63. Console.WriteLine(query); // "Руддщ Цщкдв"
  64. }
  65. }
  66.  
  67. public static class LangConversion
  68. {
  69. private static readonly Dictionary<char, char> engToRu = new Dictionary<char, char>();
  70.  
  71. static LangConversion()
  72. {
  73. var eng = "qwertyuiop[]asdfghjkl;'zxcvbnm,.QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>`~ёЁ";
  74. var ru = "йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮеЕеЕ";
  75. for (var i = 0; i < eng.Length; i++)
  76. engToRu[eng[i]] = ru[i];
  77. }
  78.  
  79. public static string Fix(string str)
  80. {
  81. var sb = new StringBuilder(str.Length);
  82. foreach (char c in str)
  83. {
  84. char fixedChar;
  85. sb.Append(engToRu.TryGetValue(c, out fixedChar) ? fixedChar : c);
  86. }
  87. return sb.ToString();
  88. }
  89. }
  90.  
  91. public static class LangConversion2
  92. {
  93. public static string Fix(string str)
  94. {
  95. var sb = new StringBuilder(str.Length);
  96. foreach (char c in str)
  97. {
  98. sb.Append(Replace(c));
  99. }
  100. return sb.ToString();
  101. }
  102.  
  103. private static char Replace(char c)
  104. {
  105. switch (c)
  106. {
  107. case 'q': return 'й';
  108. ...
  109. case 'Ё': return 'Е';
  110. default: return c;
  111. }
  112. }
  113. }
  114.  
  115. public static class LangConversion3
  116. {
  117. private static readonly char[] engToRu;
  118.  
  119. static LangConversion3()
  120. {
  121. var eng = "qwertyuiop[]asdfghjkl;'zxcvbnm,.QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>`~ёЁ";
  122. var ru = "йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮеЕеЕ";
  123. int maxCharCode = 0;
  124. foreach (char c in eng)
  125. maxCharCode = c > maxCharCode ? c : maxCharCode;
  126. engToRu = new char[maxCharCode + 1];
  127. for (var i = 0; i < eng.Length; i++)
  128. engToRu[eng[i]] = ru[i];
  129. }
  130.  
  131. public static string Fix(string str)
  132. {
  133. var sb = new StringBuilder(str.Length);
  134. foreach (char c in str)
  135. {
  136. sb.Append(Replace(c));
  137. }
  138. return sb.ToString();
  139. }
  140.  
  141. private static char Replace(char c)
  142. {
  143. if (c >= engToRu.Length)
  144. return c;
  145. var fixedChar = engToRu[c];
  146. return fixedChar != 0 ? fixedChar : c;
  147. }
  148. }
  149.  
  150. Исходный вариант: 6480мс
  151. Dictionary: 2550мс
  152. Pointers (ответ @LunarWhisper): 1560мс
  153. Switch-case: 1520мс
  154. Array: 1310мс
  155. Pointers + array: 720мс
  156. Pointers + switch-case: 580мс
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement