Advertisement
Radfler

interpreter test (PL)

Feb 1st, 2016
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.50 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cstdint>
  3. #include <iostream>
  4. #include <utility>
  5. #include <vector>
  6.  
  7. enum class Token : std::uint8_t {
  8.    
  9.     EVEN_VALUE,
  10.     ODD_VALUE,
  11.     ADD,
  12.     MULT
  13.    
  14. };
  15.  
  16. using ValueType = int;
  17. using OperatorType = char;
  18. using TokenArray = std::vector<Token>;
  19.  
  20. Token valueToToken(ValueType value) {
  21.    
  22.     return (value % 2 == 0) ? (Token::EVEN_VALUE) : (Token::ODD_VALUE);
  23.    
  24. }
  25.  
  26. Token operatorToToken(OperatorType oper) {
  27.    
  28.     return (oper == '*') ? (Token::MULT) : (Token::ADD);
  29.    
  30. }
  31.  
  32. Token mult(Token lhs, Token rhs) {
  33.    
  34.     return (lhs == Token::ODD_VALUE and rhs == Token::ODD_VALUE) ? (Token::ODD_VALUE) : (Token::EVEN_VALUE);
  35.    
  36. }
  37.  
  38. Token add(Token lhs, Token rhs) {
  39.    
  40.     return (lhs == rhs) ? (Token::EVEN_VALUE) : (Token::ODD_VALUE);
  41.    
  42. }
  43.  
  44. void loadTokens(TokenArray& tokens) {
  45.    
  46.     ValueType value;
  47.     OperatorType oper;
  48.    
  49.     while(std::cin >> value >> oper) {
  50.        
  51.         tokens.push_back(valueToToken(value));
  52.        
  53.         if(oper == '=') {
  54.            
  55.             break;
  56.            
  57.         } else {
  58.            
  59.             tokens.push_back(operatorToToken(oper));
  60.            
  61.         }
  62.        
  63.     }
  64.    
  65. }
  66.  
  67. void parseMult(TokenArray& tokens) {
  68.    
  69.     TokenArray result;
  70.    
  71.     for(auto iterator = tokens.begin(); iterator != tokens.end(); ++iterator) {
  72.        
  73.         if(*iterator == Token::MULT) {
  74.            
  75.             // Get and remove last pushed value
  76.             Token lastValue = result.back();
  77.             result.pop_back();
  78.            
  79.             // Increment iterator to next value
  80.             ++iterator;
  81.            
  82.             // Add new value
  83.             result.push_back(mult(lastValue, *iterator));
  84.            
  85.         } else {
  86.            
  87.             result.push_back(*iterator);
  88.            
  89.         }
  90.        
  91.     }
  92.    
  93.     tokens = std::move(result);
  94.    
  95. }
  96.  
  97. void parseAdd(TokenArray& tokens) {
  98.    
  99.     // Remove +- operators
  100.     tokens.erase(std::remove(tokens.begin(), tokens.end(), Token::ADD), tokens.end());
  101.  
  102.     while(tokens.size() > 1) {
  103.        
  104.         // Get and remove last value
  105.         Token lastValue = tokens.back();
  106.         tokens.pop_back();
  107.        
  108.         // Add new value
  109.         tokens.back() = add(lastValue, tokens.back());
  110.        
  111.     }
  112.    
  113. }
  114.  
  115. void test() {
  116.    
  117.     TokenArray tokens;
  118.    
  119.     loadTokens(tokens);
  120.    
  121.     parseMult(tokens);
  122.     parseAdd(tokens);
  123.    
  124.     std::cout << ((tokens.at(0) == Token::EVEN_VALUE) ? ("TAK") : ("NIE")) << '\n';
  125.    
  126. }
  127.  
  128. int main() {
  129.    
  130.     int tests;
  131.     std::cin >> tests;
  132.    
  133.     while(tests--) {
  134.         test();
  135.     }
  136.    
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement