Cod sursă (job #342822)

Utilizator avatar skenia Tirla Ovidiu skenia IP ascuns
Problemă Bizar (clasele 9-10) Compilator cpp | 3,57 kb
Rundă Arhiva de probleme Status evaluat
Dată 23 ian. 2018 20:19:46 Scor 100
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>

std::ifstream fin("bizar.in");
std::ofstream fout("bizar.out");

char exp[100005];
char *expIt;

int evaluate(int repeat);

int value(int repeat);

void checkForSpaces();

bool isDigit(char toCheck);

void createVecElem(std::vector<int> &arr);

int evaluateIterative();

int main() {
    fin.getline(exp, 100005, '\r');
    expIt = exp;
//    int repeat = 0;
//    while (isDigit(*expIt)) {
//        repeat = repeat * 10 + (*expIt - '0');
//        expIt++;
//    }
//    fout << evaluate(repeat) << '\n';
    fout << evaluateIterative();

    fin.close();
    fout.close();
    return 0;
}

int evaluateIterative() {
    int result[100005];
    int resLen = 0;
    while (*expIt) {
        if (*expIt == '(' and result[resLen - 1] != -1) {
            result[resLen++] = -1;
        } else if (isDigit(*expIt)) {
            int tmp = 0;
            while (isDigit(*expIt)) {
                tmp = tmp * 10 + (*expIt - '0');
                expIt++;
            }
            expIt--;
            result[resLen++] = tmp;
        } else if (*expIt == ')') {
            int it = resLen - 1;
            while (result[it] != -1) {
                it--;
            }
            int numbers = resLen - it - 1;
            int repeat = result[it - 1];
            if (repeat <= numbers) {
                result[it - 1] = result[it + repeat];
            } else if (repeat % numbers == 0) {
                result[it - 1] = result[it + numbers];
            } else {
                result[it - 1] = result[it + repeat % numbers];
            }
            resLen = it;
        }
        expIt++;
    }
    return result[0];
}

int evaluate(int repeat) {
    checkForSpaces();
    expIt++;
    checkForSpaces();
    int tmp = value(repeat);
    expIt++;
    checkForSpaces();
    while (*expIt == '(') {
        expIt++;
        tmp = value(tmp);
        expIt++;
        checkForSpaces();
    }
    return tmp;
}

int value(int repeat) {
//    int arr[50005];
//    int arrLen = 0;
    std::vector<int> elements;
    createVecElem(elements);
    checkForSpaces();
    while (*expIt == ',') {
        expIt++;
        createVecElem(elements);
        checkForSpaces();
    }
    while (*expIt == '(' or *expIt == ',') {
        expIt++;
        elements.back() = value(elements.back());
        checkForSpaces();
        while (*expIt == ',') {
            expIt++;
            createVecElem(elements);
            checkForSpaces();
        }
        if (*expIt == ')')
            expIt++;
    }
//    for (int &element : elements) {
//        std::cout<< element <<' ';
//    }
//    std::cout<<repeat<<'\n';
    int elementsSize = elements.size();
    if (repeat <= elementsSize) {
        return elements.at(repeat - 1);
    } else if (repeat % elementsSize == 0) {
//        std::cout<<elementsSize<<'\n';
        return elements.at(elementsSize - 1);
    } else {
        return elements.at(repeat % elementsSize - 1);
    }
}

void createVecElem(std::vector<int> &arr) {
    while (*expIt != ')') {
        checkForSpaces();
        if (isDigit(*expIt)) {
            int tmp = 0;
            while (isDigit(*expIt)) {
                checkForSpaces();
                tmp = tmp * 10 + (*expIt - '0');
                expIt++;
            }
            arr.push_back(tmp);
            checkForSpaces();
            if (*expIt == ',') {
                expIt++;
            }
        } else {
            return;
        }
    }
}

bool isDigit(char toCheck) {
    return toCheck >= '0' and toCheck <= '9';
}

void checkForSpaces() {
    while (*expIt == ' ')
        expIt++;
}