Вычисление формул двузначных булевых функций JavaScript

Разработайте алгоритм, который выполняет следующие действия: Дано: произвольная формула двузначной булевой алгебры(операции конъюнкции, дизъюнкции, отрицания) и значения (0 или 1) ее переменных.

Требуется:

  • Ввести формулу и значения ее переменных,
  • Распечатать исходные данные,
  • Оценить формулу,
  • Распечатать результат.

Примечание. Если вы представляете формулу в RPN, то алгоритм ее вычисления прост. Вы можете вручную преобразовать формулу в RPN и ввести ее в свой компьютер в RPN. Другой способ - ввести инфиксную форму формулы и автоматически преобразовать ее в RPN с помощью некоторого доступного алгоритма.

Вот мой код, но он не работает

<script>
    let f = prompt("Enter the function, using x,y as operants and such operations: " + "\n" + "+ for disjunction" + "\n" + "* for conjunction" + "\n" + "~ for negation");
    let x = +prompt("Enter x(1 or 0) ");
    let y = +prompt("Enter y(1 or 0) ");
    f.replace('x', x);
    f.replace('y', y);
    f.replace('*', '&&');
    f.replace('+', '||');
    f.replace('~', '!');
    alert(eval(f));
</script>

Возможно мне стоит выполнять операции таким образом?

//коньюнкция
    function min(a, b) {
        if (a <= b) {
            return a;
        } 
        else {
            return b;
        }
    }


    //дизьюнкция
    function max(a, b) {
        if (a >= b) {
            return a;
        } 
        else {
            return b;
        }
    }


    //отрицание
    function neg(a){
        a = (a + 1) % 2;
        return a;
    }

Но как тогда вычислить финальный результат?


Ответы (1 шт):

Автор решения: Armen

как вариант а вариантов много это первое что пришло на ум

const res = (f) => {
  let x = +prompt("Enter x(1 or 0) ");
  let y = +prompt("Enter y(1 or 0) ");
  alert(f(x,y,'disjunction') + f(x,y,'conjunction') + f(x,'negation'))
}

res((a,b,formula) => {
  if(!isFinite(b)){
    formula = b
  }
  switch(formula){
    case 'disjunction':
      return Math.max(a,b)
    case 'conjunction':
      return Math.min(a,b)
    case 'negation':
      return (a + 1) % 2
    default: return `no current formula ${formula}`
  }
})

→ Ссылка