Untitled

 avatar
unknown
c_cpp
2 years ago
3.1 kB
4
Indexable
#include <bits/stdc++.h>
using namespace std;

int main() {
    unordered_map<string,string> operands = {{"zero","0"},{"one","1"},{"two","2"},{"three","3"},{"four","4"},{"five","5"},{"six","6"},{"seven","7"},{"eight","8"},{"nine","9"}};
    unordered_map<string,int> operators = {{"mul",1},{"div",1},{"add",1},{"sub",1},{"rem",1},{"pow",1}};
    string expression ;
    getline(cin,expression);
    stringstream ss(expression);
    string word;
    int nums=0,ops=0;
    bool error=false;
    vector<string> simplified;
    while(ss>>word){
        if(operators.find(word)!=operators.end()){
            simplified.push_back(word);
        }
        else{
            stringstream n(word);
            string w;
            string number="";
            while(getline(n, w, 'c'))
            {
               if(operands.find(w)==operands.end()){
                   error=true;
                   break;
               }
               else{
                   number+=operands[w];
               }
               
            }
            simplified.push_back(number);
        }
        if(error){
            cout<<"expression evaluation stopped invalid words present";
            return 0;
        }
    }
    
    while(true){
    int opt_idx=-1, opd_idx1=-1,opd_idx2=-1;
        int count=0;
        for(int i=0;i<simplified.size();i++){
            string w=simplified[i];
            if(operators.find(w)!=operators.end()) opt_idx=i;
            else if(w=="-1") {
                count++;
                continue;
            }
            else if(opd_idx1==-1) opd_idx1=i;
            else opd_idx2 = i;
            if(opt_idx!=-1&&opd_idx1!=-1&&opd_idx2!=-1){
                if(opt_idx>opd_idx1||opt_idx>opd_idx2){
                    cout<<"expression is not complete or invalid";
                    return 0;
                }
                string opt = simplified[opt_idx];
                string ans;
                if(opt=="mul"){
                     ans = to_string(stoi(simplified[opd_idx1])*stoi(simplified[opd_idx2]));
                }
                else if(opt=="div"){
                    ans = to_string(stoi(simplified[opd_idx1])/stoi(simplified[opd_idx2]));
                }else if(opt=="add"){
                    ans = to_string(stoi(simplified[opd_idx1])+stoi(simplified[opd_idx2]));
                }else if(opt=="sub"){
                    ans = to_string(stoi(simplified[opd_idx1])-stoi(simplified[opd_idx2]));
                }else if(opt=="rem"){
                    ans = to_string(stoi(simplified[opd_idx1])%stoi(simplified[opd_idx2]));
                }else if(opt=="pow"){
                    ans = to_string(pow(stoi(simplified[opd_idx1]),stoi(simplified[opd_idx2])));
                }
                simplified[opt_idx]=ans;
                simplified[opd_idx1]="-1";
                simplified[opd_idx2]="-1";
                break;
            }
        }
        if(count==simplified.size()-1) break;
    }
    string gg="";
    for(auto s:simplified) if(s!="-1") gg=s;
    cout<<gg<<endl;
	return 0;
}
Editor is loading...
Leave a Comment