Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <iostream>
- #include <optional>
- #include <string>
- #include <sstream>
- #include <string_view>
- #include <vector>
- #include <ctime>
- #include <iomanip>
- #include <unordered_map>
- #include <array>
- #include "test_runner.h"
- using namespace std;
- class Date {
- public:
- Date() = default;
- Date(int year, int month, int day)
- :year_(year),
- month_(month),
- day_(day) {};
- time_t AsTimestamp() const {
- tm t;
- t.tm_sec = 0;
- t.tm_min = 0;
- t.tm_hour = 0;
- t.tm_mday = day_;
- t.tm_mon = month_ - 1;
- t.tm_year = year_ - 1900;
- t.tm_isdst = 0;
- return mktime(&t);
- };
- int getYear() const {
- return year_;
- };
- int getMonth()const {
- return month_;
- };
- int getDay() const {
- return day_;
- };
- private:
- int year_;
- int month_;
- int day_;
- };
- static const Date START_DATE = Date(2000, 01, 01);
- static const Date END_DATE = Date(2100, 01, 01);
- int ComputeDaysDiff(const Date& date_from, const Date& date_to) {
- const time_t timestamp_to = date_to.AsTimestamp();
- const time_t timestamp_from = date_from.AsTimestamp();
- static const int SECONDS_IN_DAY = 60 * 60 * 24;
- return ((timestamp_to - timestamp_from) / SECONDS_IN_DAY);
- }
- size_t ComputeDayIndex(const Date& date) {
- return ComputeDaysDiff(START_DATE, date);
- }
- istream & operator>>(istream & is, Date & date) {
- string year_, month_, day_;
- string string_date;
- is >> string_date;
- istringstream date_stream(string_date);
- getline(date_stream, year_, '-');
- getline(date_stream, month_, '-');
- getline(date_stream, day_, ' ');
- date = Date(stoi(year_),
- stoi(month_),
- stoi(day_));
- return is;
- }
- class PersonalBudgetManager {
- public:
- PersonalBudgetManager() {
- earn_.assign(36'600,0);
- spend_.assign(36'600,0);
- };
- double ComputeIncome(Date from, Date to) {
- double result = 0;
- size_t FROM = ComputeDayIndex(from);
- size_t TO = ComputeDayIndex(to) + 1;
- for (size_t i = FROM; i < TO; ++i) {
- result += earn_[i];
- result -= spend_[i];
- }
- return result;
- };
- void Earn(Date from, Date to, double value) {
- double per_day = value / (ComputeDaysDiff(from, to) + 1);
- size_t FROM = ComputeDayIndex(from);
- size_t TO = ComputeDayIndex(to) + 1;
- for (size_t i = FROM; i < TO; ++i) {
- earn_[i] += per_day;
- }
- };
- void Spend(Date from, Date to, double value) {
- double per_day = value / (ComputeDaysDiff(from, to) + 1);
- size_t FROM = ComputeDayIndex(from);
- size_t TO = ComputeDayIndex(to) + 1;
- for (size_t i = FROM; i < TO; ++i) {
- spend_[i] += per_day;
- }
- };
- void PayTax(Date from, Date to, int percentage) {
- size_t FROM = ComputeDayIndex(from);
- size_t TO = ComputeDayIndex(to) + 1;
- for (size_t i = FROM; i < TO; ++i) {
- earn_[i] *= ((100 - static_cast<double>(percentage)) / 100);
- }
- };
- private:
- vector<double> earn_;
- vector<double> spend_;
- };
- int main() {
- //cout << ComputeDayIndex(START_DATE) << endl;
- //cout << ComputeDayIndex(END_DATE) << endl;
- PersonalBudgetManager pbm;
- //pbm.Earn(START_DATE, Date(2000, 01, 02),10);
- //cout << pbm.ComputeIncome(START_DATE, START_DATE) << endl;
- int k = 0;
- cin >> k;
- for (int i = 0; i < k; ++i) {
- string query;
- cin >> query;
- Date from, to;
- cin >> from >> to;
- if (query == "Earn") {
- double value = 0;
- cin >> value;
- pbm.Earn(from, to, value);
- }
- else if (query == "Spend") {
- double value = 0;
- cin >> value;
- pbm.Spend(from, to, value);
- }
- else if (query == "ComputeIncome") {
- cout.precision(25);
- cout << pbm.ComputeIncome(from, to) << endl;
- }
- else if (query == "PayTax") {
- int percentage = 0;
- cin >> percentage;
- pbm.PayTax(from, to, percentage);
- }
- else {
- throw invalid_argument("");
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement