Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdbool.h>
- #include <inttypes.h>
- const int num_shift = '9' - '0' + 1;
- const int upper_shift = 'Z' - 'A' + 1;
- const int min_num = '0';
- const int max_num = '9';
- const int min_upper = 'A';
- const int max_upper = 'Z';
- const int min_lower = 'a';
- const int max_lower = 'z';
- int main() {
- int c = 0;
- uint64_t sets[1000];
- uint64_t current_set = 0;
- int pointer = 0;
- while ((c = getchar()) != EOF) {
- if (c >= min_num && c <= max_num) {
- current_set |= ((uint64_t )1 << (c - min_num));
- } else if (c >= min_upper && c <= max_upper) {
- current_set |= ((uint64_t )1 << (c - min_upper + num_shift));
- } else if (c >= min_lower && c <= max_lower) {
- current_set |= ((uint64_t )1 << (c - min_lower + num_shift + upper_shift));
- } else if (c == '#') {
- current_set = 0;
- sets[pointer] = current_set;
- current_set = 0;
- ++pointer;
- } else if (c == '|') {
- sets[pointer - 2] = sets[pointer - 2] | sets[pointer - 1];
- --pointer;
- } else if (c == '&') {
- sets[pointer - 2] = sets[pointer - 2] & sets[pointer - 1];
- --pointer;
- } else if (c == '~') {
- sets[pointer - 1] = ~sets[pointer - 1];
- } else if (c == '^') {
- sets[pointer - 2] = sets[pointer - 2] ^ sets[pointer - 1];
- --pointer;
- } else {
- if (current_set != 0) {
- sets[pointer] = current_set;
- current_set = 0;
- ++pointer;
- }
- }
- }
- uint64_t res = sets[pointer - 1];
- bool empty = true;
- for (int i = 0; i != 62; ++i) {
- if (i < num_shift) {
- if (res & ((uint64_t)1 << i)) {
- empty = false;
- putchar(min_num + i);
- }
- } else if (i < num_shift + upper_shift) {
- if (res & ((uint64_t)1 << i)) {
- empty = false;
- putchar(min_upper + i - num_shift);
- }
- } else {
- if (res & ((uint64_t)1 << i)) {
- empty = false;
- putchar(min_lower + i - num_shift - upper_shift);
- }
- }
- }
- if (empty) {
- putchar('#');
- }
- putchar('\n');
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement