Guest User

day14pt2

a guest
Dec 14th, 2021
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.11 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <map>
  5. using namespace std;
  6.  
  7. typedef struct element
  8. {
  9.     char element_letter;
  10.     bool inserted;
  11.     struct element *next_element;
  12.     element() : element_letter('\0'), inserted(true), next_element(nullptr) {}
  13.     element(char x) : element_letter(x), inserted(true), next_element(nullptr) {}
  14.     void reset_inserted()
  15.     {
  16.         inserted = false;
  17.         for (element *p = next_element; p != nullptr; p = p->next_element)
  18.             p->inserted = false;
  19.     }
  20. } element;
  21.  
  22. typedef struct rule
  23. {
  24.     string elements_rule;
  25.     char insert;
  26.  
  27.     void apply_rule(map<string, size_t> &current_applied_rules, map<string, size_t> &added_rules, size_t *amount_elements)
  28.     {
  29.         if (current_applied_rules.find(elements_rule) != current_applied_rules.end())
  30.         {
  31.             size_t amount = current_applied_rules[elements_rule];
  32.             current_applied_rules.erase(elements_rule);
  33.             string add_rule_1 = elements_rule.substr(0, 1);
  34.             add_rule_1 += insert;
  35.             string add_rule_2;
  36.             add_rule_2 += insert;
  37.             add_rule_2 += elements_rule.substr(1);
  38.             if (added_rules.find(add_rule_1) != added_rules.end())
  39.                 added_rules[add_rule_1] += amount;
  40.             else
  41.                 added_rules.insert(make_pair(add_rule_1, amount));
  42.             if (added_rules.find(add_rule_2) != added_rules.end())
  43.                 added_rules[add_rule_2] += amount;
  44.             else
  45.                 added_rules.insert(make_pair(add_rule_2, amount));
  46.  
  47.             amount_elements[(size_t)insert - 65] += amount;
  48.             cout << elements_rule << " triggered " << amount << "times, added: "<< add_rule_1 << " and "<< add_rule_2 << endl;
  49.            
  50.         }
  51.     }
  52.     rule(string in, char i) : elements_rule(in), insert(i) {}
  53. } rule;
  54.  
  55. int main(int argc, char **argv)
  56. {
  57.     fstream file(argv[1], ios_base::in);
  58.     string input;
  59.     bool input_switch = true;
  60.     vector<rule> rules;
  61.     size_t max_iteration = stoi(argv[2]);
  62.     size_t amount_elements[26] = {0};
  63.     map<string, size_t> current_rules;
  64.     map<string, size_t> to_add_rules;
  65.     while (getline(file, input, '\n'))
  66.     {
  67.         if (input == "")
  68.             input_switch = false;
  69.         else if (input_switch)
  70.         {
  71.             for (size_t j = 0; j < input.length() - 1; j++)
  72.             {
  73.                 string new_rule = input.substr(j, 2);
  74.                 current_rules.insert(make_pair(new_rule, 1));
  75.                 amount_elements[(size_t)input[j] - 65]++;
  76.             }
  77.             amount_elements[(size_t)input[input.length() - 1] - 65]++;
  78.         }
  79.         else
  80.         {
  81.             char insert = input[input.length() - 1];
  82.             rule r(input.substr(0, 2), insert);
  83.             rules.push_back(r);
  84.         }
  85.     }
  86.     //cout << "input handled" << endl;
  87.     for (size_t j = 0; j < max_iteration; j++)
  88.     {
  89.         for (map<string, size_t>::iterator ptr = to_add_rules.begin(); ptr != to_add_rules.end(); ptr++)
  90.             {
  91.                 if(current_rules.find(ptr->first)!=current_rules.end())
  92.                     current_rules[ptr->first] += ptr->second;
  93.                 else
  94.                     current_rules.insert(make_pair(ptr->first,ptr->second));
  95.             }
  96.         cout << "iteration: " << j << endl;
  97.         to_add_rules.clear();
  98.  
  99.            
  100.         for (auto _r : rules)
  101.         {
  102.             _r.apply_rule(current_rules, to_add_rules, amount_elements);
  103.         }
  104.         for (map<string, size_t>::iterator ptr = current_rules.begin(); ptr != current_rules.end(); ptr++)
  105.         {
  106.            
  107.             cout <<"current rules "<< ptr->first << ": " << ptr->second << endl;
  108.             ptr++;
  109.         }
  110.     }
  111.     size_t max = 0, min = 99999999999999999;
  112.     for (size_t j = 0; j < 26; j++)
  113.     {
  114.         if (max < amount_elements[j])
  115.             max = amount_elements[j];
  116.         if (min > amount_elements[j] && amount_elements[j] != 0)
  117.             min = amount_elements[j];
  118.     }
  119.     cout << max - min << endl;
  120.     cout << max << endl;
  121.     cout << min << endl;
  122. }
Advertisement
Add Comment
Please, Sign In to add comment