Initial commit

This commit is contained in:
2022-06-01 20:14:50 +03:00
commit 8b9cce4739
1094 changed files with 68851 additions and 0 deletions

View File

@@ -0,0 +1,96 @@
#include <fstream>
#include <deque>
#include <unordered_map>
using namespace std;
ifstream input_stream;
ofstream output_stream;
unordered_map<char, int> numbers_map = {{'I', 1}, {'V', 5}, {'X', 10}, {'L', 50}, {'C', 100}, {'D', 500}, {'M', 1000}};
int64_t evaluateNum(string num) {
int64_t res = 0;
const int lim = num.length();
for (int i = 0; i < lim - 1; i++) {
if (numbers_map[num[i]] >= numbers_map[num[i + 1]]) {
res += numbers_map[num[i]];
} else {
res -= numbers_map[num[i]];
}
}
res += numbers_map[num[lim - 1]];
return res;
}
int main() {
input_stream.open("expresii.in");
output_stream.open("expresii.out");
string expression;
input_stream >> expression;
deque<int64_t> numbers;
deque<char> operations;
string currNumber = "";
const int lim = expression.length();
for (int i = 0; i < lim; i++) {
if (numbers_map[expression[i]] > 0) {
currNumber += expression[i];
} else {
numbers.push_back(evaluateNum(currNumber));
operations.push_back(expression[i]);
currNumber = "";
}
}
numbers.push_back(evaluateNum(currNumber));
// Evaluate multiplications
int pos = 0;
for (auto it = operations.begin(); it != operations.end(); it++) {
if (*it == '*') {
auto num1 = numbers.begin();
advance(num1, pos);
auto num2 = numbers.begin();
advance(num2, pos + 1);
*num1 = *num2 * *num1;
numbers.erase(num2);
pos--;
}
pos++;
}
// Evaluate other stuff
pos = 0;
int64_t res = numbers.front();
for (auto it = operations.begin(); it != operations.end(); it++) {
if (*it == '*') {
continue;
}
auto num = numbers.begin();
advance(num, pos + 1);
if (*it == '+') {
res += *num;
} else {
res -= *num;
}
pos++;
}
output_stream << res << endl;
input_stream.close();
output_stream.close();
return 0;
}