shushus

Спринт 10. Зови меня по имени. Задание 1.

Mar 8th, 2023
393
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.79 KB | None | 0 0
  1. -----------------------------------------------------------------------
  2. json.cpp
  3. -----------------------------------------------------------------------
  4. #include "json.h"
  5.  
  6. using namespace std;
  7.  
  8. Node::Node(vector<Node> array)
  9.     : as_array_(move(array)) {
  10. }
  11.  
  12. Node::Node(map<string, Node> map)
  13.     : as_map_(move(map)) {
  14. }
  15.  
  16. Node::Node(int value)
  17.     : as_int_(value) {
  18. }
  19.  
  20. Node::Node(string value)
  21.     : as_string_(move(value)) {
  22. }
  23.  
  24. const vector<Node>& Node::AsArray() const {
  25.     return as_array_;
  26. }
  27.  
  28. const map<string, Node>& Node::AsMap() const {
  29.     return as_map_;
  30. }
  31.  
  32. int Node::AsInt() const {
  33.     return as_int_;
  34. }
  35.  
  36. const string& Node::AsString() const {
  37.     return as_string_;
  38. }
  39.  
  40. Document::Document(Node root)
  41.     : root_(move(root)) {
  42. }
  43.  
  44. const Node& Document::GetRoot() const {
  45.     return root_;
  46. }
  47.  
  48. Node LoadNode(istream& input);
  49.  
  50. Node LoadArray(istream& input) {
  51.     vector<Node> result;
  52.  
  53.     for (char c; input >> c && c != ']';) {
  54.         if (c != ',') {
  55.             input.putback(c);
  56.         }
  57.         result.push_back(LoadNode(input));
  58.     }
  59.  
  60.     return Node(move(result));
  61. }
  62.  
  63. Node LoadInt(istream& input) {
  64.     int result = 0;
  65.     while (isdigit(input.peek())) {
  66.         result *= 10;
  67.         result += input.get() - '0';
  68.     }
  69.     return Node(result);
  70. }
  71.  
  72. Node LoadString(istream& input) {
  73.     string line;
  74.     getline(input, line, '"');
  75.     return Node(move(line));
  76. }
  77.  
  78. Node LoadDict(istream& input) {
  79.     map<string, Node> result;
  80.  
  81.     for (char c; input >> c && c != '}';) {
  82.         if (c == ',') {
  83.             input >> c;
  84.         }
  85.  
  86.         string key = LoadString(input).AsString();
  87.         input >> c;
  88.         result.insert({move(key), LoadNode(input)});
  89.     }
  90.  
  91.     return Node(move(result));
  92. }
  93.  
  94. Node LoadNode(istream& input) {
  95.     char c;
  96.     input >> c;
  97.  
  98.     if (c == '[') {
  99.         return LoadArray(input);
  100.     } else if (c == '{') {
  101.         return LoadDict(input);
  102.     } else if (c == '"') {
  103.         return LoadString(input);
  104.     } else {
  105.         input.putback(c);
  106.         return LoadInt(input);
  107.     }
  108. }
  109.  
  110. Document Load(istream& input) {
  111.     return Document{LoadNode(input)};
  112. }
  113. -----------------------------------------------------------------------
  114. main.cpp
  115. -----------------------------------------------------------------------
  116. #include <algorithm>
  117. #include <cassert>
  118. #include <iostream>
  119. #include <numeric>
  120. #include <vector>
  121.  
  122. #include "json.h"
  123.  
  124. using namespace std;
  125.  
  126. struct Spending {
  127.     string category;
  128.     int amount;
  129. };
  130.  
  131. int CalculateTotalSpendings(const vector<Spending>& spendings) {
  132.     return accumulate(
  133.         spendings.begin(), spendings.end(), 0, [](int current, const Spending& spending){
  134.             return current + spending.amount;
  135.         });
  136. }
  137.  
  138. string FindMostExpensiveCategory(const vector<Spending>& spendings) {
  139.     assert(!spendings.empty());
  140.     auto compare_by_amount = [](const Spending& lhs, const Spending& rhs) {
  141.         return lhs.amount < rhs.amount;
  142.     };
  143.     return max_element(begin(spendings), end(spendings), compare_by_amount)->category;
  144. }
  145.  
  146. vector<Spending> LoadFromJson(istream& input) {
  147.     std::vector<Spending> result;
  148.    
  149.     auto nod = Load(input).GetRoot().AsArray();
  150.    
  151.     for (auto node : nod) {
  152.         for (auto& [amount_, category_] : node.AsMap()) {
  153.            
  154.             Spending helper;
  155.            
  156.             if (category_.AsString().empty()) {
  157.                 continue;
  158.             }
  159.             helper.amount = category_.AsInt();
  160.             helper.category = category_.AsString();
  161.            
  162.             result.push_back(move(helper));
  163.         }
  164.     }
  165.     return result;
  166. }
  167.  
  168. int main() {
  169.     const vector<Spending> spendings = LoadFromJson(cin);
  170.     cout << "Total "sv << CalculateTotalSpendings(spendings) << '\n';
  171.     cout << "Most expensive is "sv << FindMostExpensiveCategory(spendings) << '\n';
  172. }
  173. -----------------------------------------------------------------------
  174. json.h
  175. -----------------------------------------------------------------------
  176. #pragma once
  177.  
  178. #include <istream>
  179. #include <map>
  180. #include <string>
  181. #include <unordered_map>
  182. #include <vector>
  183.  
  184. class Node {
  185. public:
  186.     explicit Node(std::vector<Node> array);
  187.     explicit Node(std::map<std::string, Node> map);
  188.     explicit Node(int value);
  189.     explicit Node(std::string value);
  190.  
  191.     const std::vector<Node>& AsArray() const;
  192.     const std::map<std::string, Node>& AsMap() const;
  193.     int AsInt() const;
  194.     const std::string& AsString() const;
  195.  
  196. private:
  197.     std::vector<Node> as_array_;
  198.     std::map<std::string, Node> as_map_;
  199.     int as_int_;
  200.     std::string as_string_;
  201. };
  202.  
  203. class Document {
  204. public:
  205.     explicit Document(Node root);
  206.  
  207.     const Node& GetRoot() const;
  208.  
  209. private:
  210.     Node root_;
  211. };
  212.  
  213. Document Load(std::istream& input);
Advertisement
Add Comment
Please, Sign In to add comment