Pagini recente »
Istoria paginii utilizator/armeanuprintesa
|
Istoria paginii utilizator/cristinacristea
|
Istoria paginii utilizator/adrianschiopu
|
Monitorul de evaluare
|
Cod sursă (job #342822)
Cod sursă (job
#342822)
#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++;
}