Advertisement
Guest User

Untitled

a guest
Apr 4th, 2020
318
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.78 KB | None | 0 0
  1. /*
  2. There is a book with N pages (indexed from 1 to N). Each page has a certain number of words.
  3. Now play a game with a player machine. Every time you send a message to it, the message contains
  4. the information  "the sum of words in pages from i to j (1 <= i <= j <= N) is odd or even".
  5. The player can save this information and check whether the coming message has conflict with
  6. the information from ALL the previous messages.  If so, return false and the game ends.
  7. If there is no conflict, save this information and return true.
  8.  
  9. Example:
  10.   Game one:
  11.      [3, 5, odd] -> true
  12.      [6, 8, even] -> true
  13.      [3, 8, even] -> false
  14.   Game Two:
  15.      [2, 10, odd] -> true
  16.      [8, 14, even] -> true
  17.      [2, 14, even] -> true
  18.      [8, 10, even] -> false
  19. */
  20. #include <iostream>
  21. #include <vector>
  22. #include <map>
  23. #include <unordered_map>
  24. #include <set>
  25. using namespace std;
  26.  
  27. enum EvenOdd {Even, Odd};
  28.  
  29. class PagesEvenOdd {
  30.     public:
  31.         int open;
  32.         int close;
  33.         EvenOdd evenOdd;
  34.         PagesEvenOdd (int o, int c, EvenOdd evenOdd) {
  35.             open = o;
  36.             close = c;
  37.             this->evenOdd = evenOdd;
  38.         }
  39.  
  40.         void print() const {
  41.             cout << open << " " << close << " : " << (evenOdd == Odd ? "Odd" : "Even") << endl;
  42.         }
  43. };
  44.  
  45. size_t hashIntervalFunc(const pair<int,int> &interval) {
  46.     int a = 1 + interval.second;
  47.     int b = interval.first;
  48.     // a > b
  49.     return hash<int>()(a*a + b);
  50. }
  51.  
  52. struct hashInterval {
  53.     size_t operator()(const pair<int,int> &interval) const {
  54.         return hashIntervalFunc(interval);
  55.     }
  56. };
  57.  
  58. bool isConsistentRec(
  59.     const PagesEvenOdd &p,
  60.     unordered_map<int, vector<pair<int,int>> > &openTimeIntervals,
  61.     unordered_map<int, vector<pair<int,int>> > &closeTimeIntervals,
  62.     unordered_map<pair<int,int>, EvenOdd, hashInterval> &intervalIsEvenOdd ) {
  63.     //unordered_map<pair<int,int>, EvenOdd, decltype(hashIntervalFunc)*> &intervalIsEvenOdd ) {
  64.     pair<int,int> interval(p.open, p.close);
  65.  
  66.     if(intervalIsEvenOdd.find(interval)!=intervalIsEvenOdd.end()) {
  67.         if(intervalIsEvenOdd[interval]==p.evenOdd)
  68.             return true;
  69.         cout << "Inconsistency=> ";
  70.         p.print();
  71.         return false;
  72.     }
  73.  
  74.     p.print();
  75.     openTimeIntervals[p.open].push_back(interval);
  76.     closeTimeIntervals[p.close].push_back(interval);
  77.     intervalIsEvenOdd[interval] = p.evenOdd;
  78.  
  79.     if(openTimeIntervals[p.open].size()>1) {
  80.         for(auto interval : openTimeIntervals[p.open]) {
  81.             if(interval.second != p.close) {
  82.                 int openNext = 1 + min(interval.second, p.close);
  83.                 int closeNext = max(interval.second, p.close);
  84.                 EvenOdd isOddNext = (p.evenOdd == intervalIsEvenOdd[interval]) ? Even : Odd;
  85.                 PagesEvenOdd pNext{openNext, closeNext, isOddNext};
  86.                 if(!isConsistentRec(pNext, openTimeIntervals, closeTimeIntervals, intervalIsEvenOdd))
  87.                     return false;
  88.             }
  89.         }
  90.     }
  91.     if(closeTimeIntervals[p.close].size()>1) {
  92.         for(auto interval : closeTimeIntervals[p.close]) {
  93.             if(interval.first != p.open) {
  94.                 int openNext = min(interval.first, p.open);
  95.                 int closeNext = max(interval.first, p.open)-1;
  96.                 EvenOdd isOddNext = (p.evenOdd == intervalIsEvenOdd[interval]) ? Even : Odd;
  97.                 PagesEvenOdd pNext{openNext, closeNext, isOddNext};
  98.                 if(!isConsistentRec(pNext, openTimeIntervals, closeTimeIntervals, intervalIsEvenOdd))
  99.                     return false;
  100.             }
  101.         }
  102.     }
  103.     return true;
  104. }
  105.  
  106. bool isConsistent(vector<PagesEvenOdd> &input) {
  107.     if(input.size() <=1)
  108.         return true;
  109.     unordered_map<int, vector<pair<int,int>> > openTimeIntervals;
  110.     unordered_map<int, vector<pair<int,int>> > closeTimeIntervals;
  111.     unordered_map<pair<int,int>, EvenOdd, hashInterval> intervalIsEvenOdd;
  112.     //unordered_map<pair<int,int>, EvenOdd, decltype(hashIntervalFunc)*> intervalIsEvenOdd;
  113.     for(int i=0; i<input.size(); i++) {
  114.         if(!isConsistentRec(input[i], openTimeIntervals, closeTimeIntervals, intervalIsEvenOdd))
  115.             return false;
  116.     }
  117.     return true;
  118. }
  119.  
  120. int main() {
  121.     vector<PagesEvenOdd> input1 = {
  122.         {3, 5, Odd},
  123.         {6, 8, Even},
  124.         {3, 8, Even},
  125.         //{7, 8, Even},
  126.     };
  127.     if(isConsistent(input1))
  128.         cout << "Consistent" << endl;
  129.     else
  130.         cout << "Inconsistent" << endl;
  131.  
  132.     cout << endl;
  133.     vector<PagesEvenOdd> input2 = {
  134.         {2, 10, Odd},
  135.         {8, 14, Even},
  136.         {2, 14, Even},
  137.         {8, 10, Even},
  138.         //{9, 10, Even},
  139.     };
  140.     if(isConsistent(input2))
  141.         cout << "Consistent" << endl;
  142.     else
  143.         cout << "Inconsistent" << endl;
  144.     return 0;
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement