2013-01-11 54 views
2

我想javascript才能夠解釋以下(ab總是會有所不同,所以這些都只是一個例子)在JavaScript中添加Pronumerals一起

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

,並返回以下

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

所有變量是字符串,而不是整數,所以數學不能應用於abxy

由於我不知道從哪裏開始,我還沒有開始這個特定的實例。

P.S.我沒有任何jQuery的經驗,所以如果可能的話,儘量避免它

編輯:程序的目的是幫助找到遊戲「我的世界」的原料。因爲如果你想有一個鑽石劍(a)和鑽石鎬(b)例如,a要求1個木(x)和2顆鑽石(y)和b需要1個木(x)和3顆鑽石(y)。一旦我運行它通過這個程序,我想要一個迴應,說它需要2木頭和5顆鑽石。對不起任何先前的混亂......

回答

2

首先,讓我們的程序包括三個小助手功能:

// 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(" + ") 
} 

一旦我們得到了,我們已經準備好代碼的主要功能:

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) 

爲了處理兩個以上的東西,修改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])) 
+0

謝謝,但我無法將其實現到我的代碼中,它不會將值返回到我的HTML頁面。其次,這種支持是否表示,如果是由3件事情產生的東西,而不是2件,並且如果有2件以上的東西需要添加,謝謝,好的邏輯,這似乎是一個相當合理的方法 – VikeStep

+0

我得到這個錯誤 Uncaught TypeError:無法調用未定義網站的方法'替換' – VikeStep

+0

@VikeStep:關於超過2件事情 - 請參閱更新後的答案。 – georg

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}] 

然後,應用算法求解它linear equation systems。我離開的實施給你:-)

+0

嗯。我想我必須澄清一件事,a =(3x)+ y不是一個字符串,a是一個變量,它的值是(3x + y),趕上我的漂移。我想我的想法可能是使得+ b返回(3x)+ y + x +(4y),然後實現一個算法來解決它,但是idk如何做到這些。對此感到抱歉,並感謝您將代碼投入代碼 – VikeStep

0

哇,你的問題有如此根深蒂固我會寫一個全新的答案:

你可以使用它的對象。存儲鍵 - 值映射所需的工具材料:

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}