Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Калькулятор three(times(five())); как Вызвать вот так функции чтоб получилось 15 (https://javascript.ru/forum/misc/74327-kalkulyator-three-times-five-%3B-kak-vyzvat-vot-tak-funkcii-chtob-poluchilos-15-a.html)

acmra 01.07.2018 23:54

Калькулятор three(times(five())); как Вызвать вот так функции чтоб получилось 15
 
three(times(five())); // return 15
eight(minus(two())); // return 6
one(plus(six(dividedBy(three())))); // return 3

one,two... - это все отдельные функции с одним аргументом.

как сделать так это на js, можете подсказать пожалуйста?

j0hnik 02.07.2018 01:36

times=a=>'*'+a;
minus=a=>'-'+a;
plus=a=>'+'+a;

one=a=>eval(1+a)||1;
two=a=>eval(2+a)||2;
three=a=>eval(3+a)||3;
five=a=>eval(5+a)||5;
eight=a=>eval(8+a)||8;


console.log(five(times(three()))); 
console.log(eight(minus(two())));
console.log(five(minus(two())));

j0hnik 02.07.2018 01:51

times=a=>'*'+a;
minus=a=>'-'+a;
plus=a=>'+'+a;

one=a=>eval(1+a)||1;
two=a=>eval(2+a)||2;
three=a=>eval(3+a)||3;
five=a=>eval(5+a)||5;
eight=a=>eval(8+a)||8;

console.log(five(plus(two(plus(two(plus(one())))))));
console.log(five(minus(two(minus(two(minus(one())))))));


но к сожалению самая вложенная будет выполняться раньше, из за этого мы получаем такой результат подобный 5-(2-(2-1))

Malleys 02.07.2018 02:06

// константы
const constant = a => (f = x => x) => f(a);
const one   = constant(1);
const two   = constant(2);
const three = constant(3);
const five  = constant(5);
const six   = constant(6);
const eight = constant(8);

// операции
const plus      = b => a => a + b;
const minus     = b => a => a - b;
const times     = b => a => a * b;
const dividedBy = b => a => a / b;

// тесты
console.log(three(times(five())));               // return 15
console.log(eight(minus(two())));                // return 6
console.log(one(plus(six(dividedBy(three()))))); // return 3


Цитата:

Сообщение от j0hnik (Сообщение 488789)
Самая вложенная [функция] будет выполняться раньше, из-за этого мы получаем такой результат [...] 5-(2-(2-1))

Слова j0hnik относятся и к моему коду. Редукция выражения происходит справа налево, и не учитывается приоритет операторов... Почему бы сначала не получить выражение, а только затем его вычислить...

// константы
const constant = a => (f = x => x) => ({
    [Symbol.toPrimitive](hint) {
        return eval(this.valueOf());
    },

    valueOf() {
        return f(a);
    },

    toString() {
        return this[Symbol.toPrimitive]("string");
    }
});
const one   = constant(1);
const two   = constant(2);
const three = constant(3);
const five  = constant(5);
const six   = constant(6);
const eight = constant(8);

// операции
const operator  = sign => b => a => `${a.valueOf()} ${sign} ${b.valueOf()}`;
const plus      = operator("+");
const minus     = operator("-");
const times     = operator("*");
const dividedBy = operator("/");

// тесты
alert([
    three(times(five())),                      // 3 * 5
    eight(minus(two())),                       // 8 - 2
    one(plus(six(dividedBy(three())))),        // 1 + 6 / 3
    five(minus(two(minus(two(minus(one())))))) // 5 - 2 - 2 - 1
]);

Alexandroppolus 02.07.2018 13:47

Приоритет операций учитывается, если имеем строку вроде "1 + 2 * 3" и хотим посчитать. А здесь уже явно задано "дерево выражения", и никакого приоритета не может быть в принципе.


Часовой пояс GMT +3, время: 18:41.