如何评估简单代数运算的难度

时间:2016-03-05 07:35:44

标签: javascript ruby algebra

我正在写一个简单的应用程序来帮助我的女儿练习基础代数(一年级)。我想根据操作的难度为每个响应分配一个分数,例如,2 + 2的值小于12-7。 您知道我可以查找并适应我的需求的任何现有算法吗?

修改

**编辑←**

试图使问题更具体;)

给出两个整数和一个基本的代数运算

算法输入:int a,bstring operation

算法输出:float difficulty

→有哪些因素可以帮助推断出难度系数?

  • 我肯定会查看输入数字,它们的距离可以是 在确定操作的复杂性方面具有重要意义10 + 1显然比7 + 5容易,因为(当没有记忆并立即响应时)它需要更长的计时时间;
  • 作为对前一陈述的修正,常见/简单的论证应该降低操作的复杂性:0或10是一个很好的例子;

1 个答案:

答案 0 :(得分:3)

我不知道任何算法可以找到"难度"一个等式,但如果我有更多的时间,我可能会尝试使用像this这样的东西......即使它是用于阅读,这个概念也可能适用于算术。

无论如何,这里是一个非常愚蠢的午夜后破解,可能会对极其基本算术进行一些调整。你可以调整因子/权重,但这可能会让你开始。祝你好运!

function get_difficulty (eq) {
    var difficulty = 0;
    var settings = {
        terms_factor : 3, //Multiply by the number of terms in an equation
        digits_factor : 2, //Multiply by the number of digits in each term
        negative_weight : 2, //Add this if subtracting two numbers in the equation yields a negative number

        operations : {
            "+" : 1,
            "-" : 2,
            "*" : 4,
            "/" : 6,

            "=" : 0
        }
    };

    eq += "=";

    var ptr = 0;
    var terms = 0;
    var prev_term = null;
    var len = eq.length;
    var stack = [ ];

    var is_numeric = function (n) {
        return /\d+/.test (n); //Not a brilliant way but works for basic arithmetic
    };

    while (ptr < len) {
        var tok = eq [ptr];

        if (tok !== " " && tok !== "(" && tok !== ")") {
            if (is_numeric (tok)) {
                stack.push (tok);   
            } else if (tok in settings.operations) {
                var curr_term = parseInt (stack.join (""));
                if (prev_term !== null && curr_term > prev_term && ["-", "="].indexOf (tok) !== -1) {
                    difficulty += settings.negative_weight;
                }

                difficulty += stack.length * settings.digits_factor;
                prev_term = curr_term;
                stack = [ ];
                terms++;

                difficulty += settings.operations [tok];
            } else {
                console.log ("Unknown token: " + tok);   
            }
        }

        ptr++;
    }

    difficulty += terms * settings.terms_factor;

    return difficulty;
}


console.log (get_difficulty (" 2 + 2 ")); //11
console.log (get_difficulty (" 12 - 7 ")); //14
console.log (get_difficulty (" 7 - 12 ")); //16
console.log (get_difficulty (" 5 - 5 ")); //12 
console.log (get_difficulty (" 5 - 1205 ")); //20
console.log (get_difficulty (" 5 - 1205 * 35 ")); //29
console.log (get_difficulty (" 5 * 40 ")); //18
console.log (get_difficulty (" 102 - 5 / 13 + 32 ")); //39
console.log (get_difficulty (" 100 - 100 ")); //20
console.log (get_difficulty (" 32 - 12 ")); //16
console.log (get_difficulty (" 12 - 32 ")); //18