在javascript中同时添加表音词
我希望javascript能够解释以下内容(在javascript中同时添加表音词,javascript,math,Javascript,Math,我希望javascript能够解释以下内容(a和b总是不同的,所以这些只是一个示例) 并返回以下内容 a+b=(4x)+(5y) 所有变量都是字符串而不是整数,因此数学不能应用于a、b、x或y 由于我不知道从哪里开始,我还没有开始讨论这个特定的实例 另外,我对jQuery没有任何经验,所以如果可能的话,尽量避免使用它 编辑:该程序旨在帮助在游戏minecraft中找到原材料。例如,如果你想要一把钻石剑(a)和一把钻石镐(b),那么a需要1块木头(x)和2块钻石(y),而b需要1块木头(x)
a
和b
总是不同的,所以这些只是一个示例)
并返回以下内容
a+b=(4x)+(5y)
所有变量都是字符串而不是整数,因此数学不能应用于a
、b
、x
或y
由于我不知道从哪里开始,我还没有开始讨论这个特定的实例
另外,我对jQuery没有任何经验,所以如果可能的话,尽量避免使用它
编辑:该程序旨在帮助在游戏minecraft中找到原材料。例如,如果你想要一把钻石剑(
a
)和一把钻石镐(b
),那么a
需要1块木头(x
)和2块钻石(y
),而b
需要1块木头(x
)和3块钻石(y
)。一旦我运行了这个程序,我想得到一个回应,说它需要2块木头和5块钻石。抱歉,前面有任何混淆…首先,根据语法将输入字符串解析为要使用的对象:
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}]
函数parseLine(input){//传递类似“a=(3x)+y”的字符串
var parts=input.split(“=”);
如果(parts.length!=2)返回警报(“无效等式”);
对于(var i=0;i首先,让我们编写三个小助手函数:
// 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]))
哇,你们的问题已经彻底改变了,我要写一个全新的答案:
您只需使用对象即可。将工具所需的材料存储在键值映射中:
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}
函数添加(){
var result={};
对于(var i=0;ihmmm。我想我必须再澄清一件事,a=(3x)+y不是一个字符串,a是一个变量,它的值是(3x+y),请理解我的意思。我想我认为可能有效的方法是让a+b返回(3x)+y+x+(4y)然后实现一个算法来解决它,但idk如何做这些。很抱歉混淆了,谢谢你花时间在代码中。谢谢你,但我无法在我的代码中实现这一点,它不会在我的HTML页面中返回值。其次,这是否支持说,如果某个东西是由3个东西组成的,而不仅仅是2个,如果有您要添加的项不止2项,谢谢,逻辑也很好,这似乎是一个相当合理的方法。我得到了这个错误uncaughttypeerror:cannotcallmethod'replace'of undefinedwebsite@VikeStep:关于两件以上的事情-请参阅更新的答案。
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}