console
function dataWarp(...num) {
return num.map((a) => ({
m: a+'',
r: a
}));
}
function calm(a,b) {
var r = [
{
m: `(${a.m}+${b.m})`,
r: a.r+b.r
},
{
m: `(${a.m}-${b.m})`,
r: a.r-b.r
},
{
m: `(${b.m}-${a.m})`,
r: b.r-a.r
},
{
m: `(${a.m}*${b.m})`,
r: a.r*b.r
},
];
a.r !== 0 && r.push({
m: `(${b.m}/${a.m})`,
r: b.r/a.r
});
b.r !==0 && r.push({
m: `(${a.m}/${b.m})`,
r: a.r/b.r
});
return r;
}
function allCalm(a,b,c,d,u) {
var s = [], t = [];
calm(a,b).forEach((i) => {
s = s.concat(calm(i, c));
t = t.concat(calm(i, d));
});
s.forEach((i) => {
u = u.concat(calm(i, d));
})
t.forEach((i) => {
u = u.concat(calm(i, c));
});
return u;
}
function get24(a,b,c,d) {
console.time(`计算时间`);
var result = [];
[a,b,c,d]= dataWarp(a,b,c,d);
allCalm(c,d,b,a,allCalm(b,d,a,c,allCalm(b,c,a,d,allCalm(a,d,b,c,allCalm(a,c,b,d,allCalm(a,b,c,d,[])))))).forEach((i) => {
if (i.r === 24) {
result.push(i.m + '');
}
})
if (result && result.length === 0) {
console.log(false);
} else {
console.log(true);
console.log(`有${result.length}个,表达式如下:`, result.join('、'));
}
console.timeEnd(`计算时间`);
}
get24(3,4,5,6)
实现思路:
<ol>
<li>先定义四张牌的数据结构,代码函数dataWarp</li>
<li>假设只要两张牌,获取所有的计算结果的可能性,代码函数calm</li>
<li>降维计算四张牌,保持a,b不变,组合c,d,代码函数allCalm,要保证a,b,c,d都计算到,则需要计算a,b,c,d; a,c,b,d; a,d,c,b; b,c,a,d; b,d,c,a; c,d,b,a;</li>
<li>获取所有计算结果,匹配到等于24的数据,拉取出运算表达式</li>
</ol>
问题点:还要考虑4个数字重复的情况~