Advertisement
great_lexa

For my darling

Dec 14th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.33 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. #include <inttypes.h>
  4.  
  5. const int num_shift = '9' - '0' + 1;
  6. const int upper_shift = 'Z' - 'A' + 1;
  7. const int min_num = '0';
  8. const int max_num = '9';
  9. const int min_upper = 'A';
  10. const int max_upper = 'Z';
  11. const int min_lower = 'a';
  12. const int max_lower = 'z';
  13.  
  14. int main() {
  15.     int c = 0;
  16.     uint64_t sets[1000];
  17.     uint64_t current_set = 0;
  18.     int pointer = 0;
  19.     while ((c = getchar()) != EOF) {
  20.         if (c >= min_num && c <= max_num) {
  21.             current_set |= ((uint64_t )1 << (c - min_num));
  22.         } else if (c >= min_upper && c <= max_upper) {
  23.             current_set |= ((uint64_t )1 << (c - min_upper + num_shift));
  24.         } else if (c >= min_lower && c <= max_lower) {
  25.             current_set |= ((uint64_t )1 << (c - min_lower + num_shift + upper_shift));
  26.         } else if (c == '#') {
  27.             current_set = 0;
  28.             sets[pointer] = current_set;
  29.             current_set = 0;
  30.             ++pointer;
  31.         } else if (c == '|') {
  32.             sets[pointer - 2] = sets[pointer - 2] | sets[pointer - 1];
  33.             --pointer;
  34.         } else if (c == '&') {
  35.             sets[pointer - 2] = sets[pointer - 2] & sets[pointer - 1];
  36.             --pointer;
  37.         } else if (c == '~') {
  38.             sets[pointer - 1] = ~sets[pointer - 1];
  39.         } else if (c == '^') {
  40.             sets[pointer - 2] = sets[pointer - 2] ^ sets[pointer - 1];
  41.             --pointer;
  42.         } else {
  43.             if (current_set != 0) {
  44.                 sets[pointer] = current_set;
  45.                 current_set = 0;
  46.                 ++pointer;
  47.             }
  48.         }
  49.     }
  50.     uint64_t res = sets[pointer - 1];
  51.     bool empty = true;
  52.     for (int i = 0; i != 62; ++i) {
  53.         if (i < num_shift) {
  54.             if (res & ((uint64_t)1 << i)) {
  55.                 empty = false;
  56.                 putchar(min_num + i);
  57.             }
  58.         } else if (i < num_shift + upper_shift) {
  59.             if (res & ((uint64_t)1 << i)) {
  60.                 empty = false;
  61.                 putchar(min_upper + i - num_shift);
  62.             }
  63.         } else {
  64.             if (res & ((uint64_t)1 << i)) {
  65.                 empty = false;
  66.                 putchar(min_lower + i - num_shift - upper_shift);
  67.             }
  68.         }
  69.     }
  70.     if (empty) {
  71.         putchar('#');
  72.     }
  73.     putchar('\n');
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement