通过在 Javascript 中填充缺失的运算符来完成数学方程式
Complete Math Equation by Filling Missing Operator in Javascript
我偶然发现了这个编程问题。所以问题要我们完成输入中的数学方程式。可以使用的运算符有(+、-、*、/、^、%)。这是一些示例。
Input : 5 3 8 Output : 5+3=8
Input : 9 27 3 Output : 9=27/3
Input : 5 2 25 , 1 5 2 Output : 5^2=25 , 1=5%2
我希望这个示例已经让您清楚地了解问题要我们做什么。如果有不清楚的地方欢迎评论,我会更好的解读。
P.S。什么语言都可以,只要看得懂就可以。
如果您正在尝试解决这些问题但不知道如何尝试...
- 选择一侧较大的数字,如 1 4 7 中的 7
- 放一个等号面向中间。比如 1 4 7 就是 1 4=7
- 解决
- 如果不行试试其他号码
希望对您有所帮助
下面的代码可以通过暴力排列找到可能的答案。
const qs = ["5 3 8", "9 27 3", "5 2 25", "1 5 2", "3 3 3 30"];
for(const q of qs)
{
const answers = [];
for(let n = 0; n < 1000; n++)
{
const s = q.replace(/ /g, () => "+-*/^%="[Math.floor(Math.random() * 7)]);
if(eval(s.replace(/=/g, "===").replace(/\^/g, "**")) === true && answers.indexOf(s) === -1)
{
answers.push(s);
}
}
console.log(`Possible answer ${answers.length === 0 ? "not found (yet)" : answers.join(" or ")}`);
}
这是一个算法解决方案,可以找到 所有 个可能的答案,并且可以轻松翻译成任何语言:
var data = ['2 1 2', '5 3 8', '9 27 3', '5 2 25', '1 5 2', '5 2 25 , 1 5 2'];
var operations = [
{ sign: '+', result: (a,b) => a+b },
{ sign: '-', result: (a,b) => a-b },
{ sign: '*', result: (a,b) => a*b },
{ sign: '/', result: (a,b) => a/b },
{ sign: '^', result: (a,b) => a**b },
{ sign: '%', result: (a,b) => a%b }
];
function check(str) {
// split string into the array of operands
var operands = str.trim().split(/\s+/).map(Number);
// validate array of operands
if ((operands.length != 3) || operands.includes(NaN)) {
console.log(`invalid input data '${str}'`);
} else {
console.log(`searching solution for '${str}'`);
// here is the main logic start
for (i = 0; i < operations.length; i++) { // loop through all defined operations
// checking for 'a <sign> b = c' expression
if (operations[i].result(operands[0],operands[1]) == operands[2]) {
console.log(`found a solution: ${operands[0]}${operations[i].sign}${operands[1]}=${operands[2]}`);
}
// checking for 'a = b <sign> c' expression
if (operands[0] == operations[i].result(operands[1],operands[2])) {
console.log(`found a solution: ${operands[0]}=${operands[1]}${operations[i].sign}${operands[2]}`);
}
}
}
}
data.forEach(check);
但是它只接受 operand1 operand2 operand3
形式的数据,所以它不会解决最后一个数据块。可以编写一个额外的拆分器来检查源字符串并将其拆分为逗号的子字符串,但我把它留给了你。这是如何解决主要任务的示例。
如果您不理解箭头函数,这里是 ES6 之前的代码:
var operations = [
{ sign: '+', result: function(a,b){ return a+b } },
{ sign: '-', result: function(a,b){ return a-b } },
{ sign: '*', result: function(a,b){ return a*b } },
{ sign: '/', result: function(a,b){ return a/b } },
{ sign: '^', result: function(a,b){ return a**b } },
{ sign: '%', result: function(a,b){ return a%b } }
];
我偶然发现了这个编程问题。所以问题要我们完成输入中的数学方程式。可以使用的运算符有(+、-、*、/、^、%)。这是一些示例。
Input : 5 3 8 Output : 5+3=8
Input : 9 27 3 Output : 9=27/3
Input : 5 2 25 , 1 5 2 Output : 5^2=25 , 1=5%2
我希望这个示例已经让您清楚地了解问题要我们做什么。如果有不清楚的地方欢迎评论,我会更好的解读。
P.S。什么语言都可以,只要看得懂就可以。
如果您正在尝试解决这些问题但不知道如何尝试...
- 选择一侧较大的数字,如 1 4 7 中的 7
- 放一个等号面向中间。比如 1 4 7 就是 1 4=7
- 解决
- 如果不行试试其他号码
希望对您有所帮助
下面的代码可以通过暴力排列找到可能的答案。
const qs = ["5 3 8", "9 27 3", "5 2 25", "1 5 2", "3 3 3 30"];
for(const q of qs)
{
const answers = [];
for(let n = 0; n < 1000; n++)
{
const s = q.replace(/ /g, () => "+-*/^%="[Math.floor(Math.random() * 7)]);
if(eval(s.replace(/=/g, "===").replace(/\^/g, "**")) === true && answers.indexOf(s) === -1)
{
answers.push(s);
}
}
console.log(`Possible answer ${answers.length === 0 ? "not found (yet)" : answers.join(" or ")}`);
}
这是一个算法解决方案,可以找到 所有 个可能的答案,并且可以轻松翻译成任何语言:
var data = ['2 1 2', '5 3 8', '9 27 3', '5 2 25', '1 5 2', '5 2 25 , 1 5 2'];
var operations = [
{ sign: '+', result: (a,b) => a+b },
{ sign: '-', result: (a,b) => a-b },
{ sign: '*', result: (a,b) => a*b },
{ sign: '/', result: (a,b) => a/b },
{ sign: '^', result: (a,b) => a**b },
{ sign: '%', result: (a,b) => a%b }
];
function check(str) {
// split string into the array of operands
var operands = str.trim().split(/\s+/).map(Number);
// validate array of operands
if ((operands.length != 3) || operands.includes(NaN)) {
console.log(`invalid input data '${str}'`);
} else {
console.log(`searching solution for '${str}'`);
// here is the main logic start
for (i = 0; i < operations.length; i++) { // loop through all defined operations
// checking for 'a <sign> b = c' expression
if (operations[i].result(operands[0],operands[1]) == operands[2]) {
console.log(`found a solution: ${operands[0]}${operations[i].sign}${operands[1]}=${operands[2]}`);
}
// checking for 'a = b <sign> c' expression
if (operands[0] == operations[i].result(operands[1],operands[2])) {
console.log(`found a solution: ${operands[0]}=${operands[1]}${operations[i].sign}${operands[2]}`);
}
}
}
}
data.forEach(check);
但是它只接受 operand1 operand2 operand3
形式的数据,所以它不会解决最后一个数据块。可以编写一个额外的拆分器来检查源字符串并将其拆分为逗号的子字符串,但我把它留给了你。这是如何解决主要任务的示例。
如果您不理解箭头函数,这里是 ES6 之前的代码:
var operations = [
{ sign: '+', result: function(a,b){ return a+b } },
{ sign: '-', result: function(a,b){ return a-b } },
{ sign: '*', result: function(a,b){ return a*b } },
{ sign: '/', result: function(a,b){ return a/b } },
{ sign: '^', result: function(a,b){ return a**b } },
{ sign: '%', result: function(a,b){ return a%b } }
];