Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <fstream>
- #include <iostream>
- #include <string>
- std::string GetFileContent();
- void ParseString(std::string & String);
- void Starling(std::string & String);
- void Kestrel(std::string & String);
- std::string GetArgument(std::string & String);
- int main()
- {
- std::string String = GetFileContent();
- ParseString(String);
- std::cout << String << std::endl;
- system("pause");
- }
- std::string GetFileContent()
- {
- std::ifstream Input("Input.txt");
- if (!Input.is_open())
- {
- std::cout << "Error opening Input File!" << std::endl;
- return "";
- }
- return std::string((std::istreambuf_iterator<char>(Input)), (std::istreambuf_iterator<char>()));
- }
- void ParseString(std::string & String)
- {
- // Reverse String for efficiency
- std::string ReversedString(String.rbegin(), String.rend());
- String.assign("");
- size_t TermCharacterPosition;
- while ((TermCharacterPosition = ReversedString.find_last_of("$^!")) != std::string::npos)
- {
- char Term = ReversedString[TermCharacterPosition];
- String.append(ReversedString.rbegin(),
- std::reverse_iterator<std::string::iterator>(ReversedString.begin() + TermCharacterPosition) - 1);
- ReversedString.erase(TermCharacterPosition);
- switch (Term)
- {
- case '$': // Sxyz = xz (yz)
- Starling(ReversedString);
- break;
- case '^': // Kxy = x
- Kestrel(ReversedString);
- break;
- case '!': // Ix = x
- break;
- }
- }
- String.append(ReversedString.rbegin(), ReversedString.rend());
- String.erase(std::remove(String.begin(), String.end(), '('), String.end());
- String.erase(std::remove(String.begin(), String.end(), ')'), String.end());
- }
- void Starling(std::string & String)
- {
- std::string Arg1 = GetArgument(String);
- std::string Arg2 = GetArgument(String);
- std::string Arg3 = GetArgument(String);
- String += ')' + Arg3 + Arg2 + '(' + Arg3 + Arg1;
- }
- void Kestrel(std::string & String)
- {
- std::string Arg1 = GetArgument(String);
- std::string Arg2 = GetArgument(String);
- String += Arg1;
- }
- std::string GetArgument(std::string & String)
- {
- if ((*String.rbegin()) == '(')
- {
- unsigned Count = 1;
- std::string::reverse_iterator Iter = String.rbegin() + 1;
- while (Count > 0)
- {
- switch (*Iter)
- {
- case '(': Count++;
- break;
- case ')': Count--;
- break;
- }
- ++Iter;
- }
- std::string Argument(Iter.base() + 1, String.end() - 1);
- String.erase(Iter.base(), String.end());
- return Argument;
- }
- else
- {
- std::string Argument(String.rbegin(), String.rbegin() + 1);
- String.erase(String.end() - 1);
- return Argument;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement