2

aJavaScript で次のように解釈できるようにしたい (bこれらは常に異なるため、これらは単なる例です)

a=(3x)+y  
b=x+(4y)  

そして以下を返します

a+b=(4x)+(5y)  

aすべての変数は整数ではなく文字列であるため、 、bxまたはに数学を適用することはできませんy

どこから始めればよいかわからないため、この特定のインスタンスから始めていません。

PS私はjQueryの経験がないので、可能であれば避けてみてください

編集: このプログラムは、Minecraft のゲームで原材料を見つけるのに役立つように設計されています。たとえば、ダイヤモンドの剣 ( a) とダイヤモンドのツルハシ ( b) がa必要な場合、木材 ( x) 1 つとダイヤモンド 2つ ( y)が必要で、木材 ( ) 1 つとダイヤモンド3 つ( )bが必要です。このプログラムを実行したら、2 つの木材と 5 つのダイヤモンドが必要であるという応答が必要です。事前の混乱で申し訳ありません...xy

4

3 に答える 3

2

まず、3 つの小さなヘルパー関数をプログラムしましょう。

// exprToDict("3x + y") -> {x:3, y:1}
function exprToDict(e) {
    var d = {};
    e.replace(/(\d+)\s*(\w+)|(\w+)/g, function($0, $1, $2, $3) {
        d[$2 || $3] = parseInt($1 || 1);
    });
    return d;
}

// addDicts({x:1, y:2}, {x:100, y:3}) -> {x:101, y:5}
function addDicts(a, b) {
    var d = {};
    for(var x in a) d[x] = a[x];
    for(var x in b) d[x] = (d[x] || 0) + b[x];
    return d;
}

// dictToExpr({x:1, y:2}) -> x + (2 y)
function dictToExpr(d) {
    var e = [];
    for(var x in d)
        if(d[x] == 1)
            e.push(x);
        else
            e.push("(" + d[x] + " " + x + ")");
    return e.join(" + ")
}

それができたら、main 関数をコーディングする準備が整いました。

function addThings(a, b) {
    return dictToExpr(
        addDicts(
            exprToDict(a),
            exprToDict(b)
    ))
}

テストしてみましょう:

sword = "(3 wood) + diamond"
pickaxe = "wood + (2 diamond)"

console.log(addThings(sword, pickaxe))

結果:

(4 wood) + (3 diamond)

2 つ以上のものを処理するaddDictsには、配列を受け入れるように変更します。

function addDicts(dicts) {
    var sum = {};
    dicts.forEach(function(d) {
        for(var x in d)
            sum[x] = (sum[x] || 0) + d[x];
    });
    return sum;
}

そして次のように書き直しaddThingsます。

function addThings(things) {
    return dictToExpr(
        addDicts(
            things.map(exprToDict)));
}

例:

sword = "(3 wood) + diamond"
pickaxe = "wood + (2 diamond)"
house = "10 wood + iron"


console.log(addThings([sword, pickaxe, house]))
于 2013-01-11T09:26:19.757 に答える
1

まず、文法に従って入力文字列を解析して、操作するオブジェクトにします。

function parseLine(input) { // pass a string like "a=(3x)+y"
    var parts = input.split("=");
    if (parts.length != 2) return alert("Invalid equation");
    for (var i=0; i<2; i++) {
        var summands = parts[i].split("+");
        parts[i] = {};
        for (var j=0; j<summands.length; j++) {
            summands[j] = summands[j].replace(/^\s*\(?|\)?\s*$/g, "");
            var match = summands[j].match(/^(-?\d*\.?\d+)?\s*([a-z]+)$/);
            if (!match) return alert("Parse error: "+summands[i]);
            var mul = parseFloat(match[1] || 1);
            if (match[2] in parts[i])
                parts[i][match[2]] += mul;
            else
                parts[i][match[2]] = mul;
         }
    }
    return parts;
}
// example:
parseLine("a=(3x)+y")
// [{"a":1},{"x":3,"y":1}]

次に、線形方程式系を解くためのアルゴリズムを適用します。その実装はあなたに任せます:-)

于 2013-01-11T08:00:02.743 に答える
0

うわー、あなたの質問は根本的に変わったので、私は完全に新しい答えを書きます:

そのためにオブジェクトを使用できます。ツールに必要な資料をKey-Valueマップに保存します。

var diamondSword = {
    diamond: 2,
    stick: 1
};
var diamondPickaxe = {
    diamond: 3,
    stick: 2
};

加算関数は非常に単純です。

function add() {
    var result = {};
    for (var i=0; i<arguments.length; i++)
        for (var item in arguments[i])
            result[item] = (result[item] || 0) + arguments[i][item];
    return result;
}
// usage:
add(diamondSword, diamondPickaxe)
// {"diamond":5, "stick":3}
于 2013-01-11T15:05:34.727 に答える