Advertisement
Guest User

Untitled

a guest
Dec 10th, 2019
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const zero = () => () => false;
  2. const one = () => () => true;
  3. const variable = (name) => (vars) => vars[name];
  4.  
  5. const un_op = op => f1 => (vars) => op(f1(vars));
  6. const bin_op = op => (f1, f2) => (vars) => op(f1(vars), f2(vars));
  7.  
  8. const negate = un_op(a => !a);
  9. const and = bin_op((a, b) => (a && b));
  10. const or = bin_op((a, b) => (a || b));
  11.  
  12. const dnf = function(str) {
  13.     if (str == '') {
  14.         return "Undefined result!";
  15.     }
  16.     const skipWhitespaces = function() {
  17.         while (pos < len && str[pos] == ' ') {
  18.             ++pos;
  19.         }
  20.     }
  21.     const level_3 = function() {
  22.         skipWhitespaces();
  23.         switch (str[pos]) {
  24.             case '~': {
  25.                 ++pos;
  26.                 return negate(level_3());
  27.             }
  28.             case '0': {
  29.                 ++pos;
  30.                 return zero();
  31.             }
  32.             case '1': {
  33.                 ++pos;
  34.                 return one();
  35.             }
  36.             case '(': {
  37.                 ++pos;
  38.                 const res = level_1();
  39.                 ++pos;
  40.                 return res;
  41.             }
  42.         }
  43.         if (str[pos] >= 'a' && str[pos] <= 'z') {
  44.             return variable(str[pos++]);
  45.         }
  46.     }
  47.     const bin_op_levels = function(symb, func, up) {
  48.         return function() {
  49.             let result = up();
  50.             while (pos < len) {
  51.                 skipWhitespaces();
  52.                 if (pos < len && str[pos] == symb) {
  53.                     ++pos;
  54.                     result = func(result, up());
  55.                 } else {
  56.                     break;
  57.                 }
  58.             }
  59.             return result;
  60.         }
  61.     }
  62.     const level_2 = bin_op_levels('&', and, level_3);
  63.     const level_1 = bin_op_levels('|', or, level_2);
  64.    
  65.     let pos = 0;
  66.     const len = str.length;
  67.     const expression = level_1();
  68.  
  69.     let list_variables = [];
  70.     let str_has_letters = false;
  71.     for (let i = 0; i < len; ++i) {
  72.         if (str[i] >= 'a' && str[i] <= 'z') {
  73.             list_variables[str[i]] = true;
  74.             str_has_letters = true;
  75.         }
  76.     }
  77.     if (!str_has_letters) {
  78.         return expression() ? '1' : '0';
  79.     }
  80.  
  81.     let variable_values = {};
  82.     let g_result = [];
  83.     const gen_block_from_current_state = function() {
  84.         let result = [];
  85.         for (let index in variable_values) {
  86.             const value = variable_values[index];
  87.             if (value == false) {
  88.                 result.push('~' + index);
  89.             } else if (value == true) {
  90.                 result.push(index);
  91.             }
  92.         };
  93.         return result.join(' & ');
  94.     };
  95.     const add_current_state_to_string = function() {
  96.         g_result.push('(' + gen_block_from_current_state() + ')');
  97.     }
  98.     const nxt_letter = (letter) => String.fromCharCode(letter.charCodeAt(0) + 1);
  99.     const stop_letter = nxt_letter('z');
  100.     const recursive_search_answer = function(letter) {
  101.         if (letter == stop_letter) {
  102.             const res = expression(variable_values);
  103.             if (res == true) {
  104.                 add_current_state_to_string();
  105.             }
  106.             return;
  107.         }
  108.         if (list_variables[letter] == true) {
  109.             variable_values[letter] = false;
  110.             recursive_search_answer(nxt_letter(letter));
  111.             variable_values[letter] = true;
  112.             recursive_search_answer(nxt_letter(letter));
  113.         } else {
  114.             recursive_search_answer(nxt_letter(letter));
  115.         }
  116.     }
  117.     recursive_search_answer('a');
  118.     return g_result.length > 0 ? g_result.join(' | ') : '0';
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement