Advertisement
Guest User

SKI Giveaway Solution

a guest
Jul 30th, 2016
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.58 KB | None | 0 0
  1. #include <algorithm>
  2. #include <fstream>
  3. #include <iostream>
  4. #include <string>
  5.  
  6. std::string GetFileContent();
  7. void ParseString(std::string & String);
  8.  
  9. void Starling(std::string & String);
  10. void Kestrel(std::string & String);
  11. std::string GetArgument(std::string & String);
  12.  
  13. int main()
  14. {
  15.     std::string String = GetFileContent();
  16.  
  17.     ParseString(String);
  18.     std::cout << String << std::endl;
  19.  
  20.     system("pause");
  21. }
  22.  
  23. std::string GetFileContent()
  24. {
  25.     std::ifstream Input("Input.txt");
  26.  
  27.     if (!Input.is_open())
  28.     {
  29.         std::cout << "Error opening Input File!" << std::endl;
  30.         return "";
  31.     }
  32.  
  33.     return std::string((std::istreambuf_iterator<char>(Input)), (std::istreambuf_iterator<char>()));
  34. }
  35.  
  36. void ParseString(std::string & String)
  37. {
  38.     // Reverse String for efficiency
  39.     std::string ReversedString(String.rbegin(), String.rend());
  40.     String.assign("");
  41.  
  42.     size_t TermCharacterPosition;
  43.  
  44.     while ((TermCharacterPosition = ReversedString.find_last_of("$^!")) != std::string::npos)
  45.     {
  46.         char Term = ReversedString[TermCharacterPosition];
  47.         String.append(ReversedString.rbegin(),
  48.             std::reverse_iterator<std::string::iterator>(ReversedString.begin() + TermCharacterPosition) - 1);
  49.         ReversedString.erase(TermCharacterPosition);
  50.  
  51.         switch (Term)
  52.         {
  53.         case '$': // Sxyz = xz (yz)
  54.             Starling(ReversedString);
  55.             break;
  56.         case '^': // Kxy = x
  57.             Kestrel(ReversedString);
  58.             break;
  59.         case '!': // Ix = x
  60.             break;
  61.         }
  62.  
  63.     }
  64.  
  65.     String.append(ReversedString.rbegin(), ReversedString.rend());
  66.  
  67.     String.erase(std::remove(String.begin(), String.end(), '('), String.end());
  68.     String.erase(std::remove(String.begin(), String.end(), ')'), String.end());
  69. }
  70.  
  71. void Starling(std::string & String)
  72. {
  73.     std::string Arg1 = GetArgument(String);
  74.     std::string Arg2 = GetArgument(String);
  75.     std::string Arg3 = GetArgument(String);
  76.  
  77.     String += ')' + Arg3 + Arg2 + '(' + Arg3 + Arg1;
  78. }
  79.  
  80. void Kestrel(std::string & String)
  81. {
  82.     std::string Arg1 = GetArgument(String);
  83.     std::string Arg2 = GetArgument(String);
  84.  
  85.     String += Arg1;
  86. }
  87.  
  88. std::string GetArgument(std::string & String)
  89. {
  90.     if ((*String.rbegin()) == '(')
  91.     {
  92.         unsigned Count = 1;
  93.         std::string::reverse_iterator Iter = String.rbegin() + 1;
  94.  
  95.         while (Count > 0)
  96.         {
  97.             switch (*Iter)
  98.             {
  99.             case '(': Count++;
  100.                 break;
  101.             case ')': Count--;
  102.                 break;
  103.             }
  104.  
  105.             ++Iter;
  106.         }
  107.  
  108.         std::string Argument(Iter.base() + 1, String.end() - 1);
  109.         String.erase(Iter.base(), String.end());
  110.         return Argument;
  111.     }
  112.     else
  113.     {
  114.         std::string Argument(String.rbegin(), String.rbegin() + 1);
  115.         String.erase(String.end() - 1);
  116.         return Argument;
  117.     }
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement