最有效的方法来解决javascript中的公式

时间:2015-05-27 22:05:42

标签: javascript

说我有以下公式

a + (13 * (b/c)) + d + (12 * e) - f - 11 + (g * (h/i)) - 10 = 66;

现在字母a-i可以代表1-9的数字。但是,每个号码只能使用一次。解决这个问题最有效的方法是什么?我现在的方式是生成一个随机数组,例如

array[2,5,1,7,8,6,9,3,4]

然后我将其放入公式中以检查它是否等于66.如果不是,我生成一个新的数字数组。我认为应该有更好的方法来做到这一点,也许使用递归?

只是想了解一下如何处理这个问题?

由于

2 个答案:

答案 0 :(得分:1)

蛮力方法:

function findSolution() {
  for (var a = 1; a <= 9; a++) {
    for (var b = 1; b <= 9; b++) {
      for (var c = 1; c <= 9; c++) {
        for (var d = 1; d <= 9; d++) {
          for (var e = 1; e <= 9; e++) {
            for (var f = 1; f <= 9; f++) {
              for (var g = 1; g <= 9; g++) {
                for (var h = 1; h <= 9; h++) {
                  for (var i = 1; i <= 9; i++) {
                    if (
                      [b,c,d,e,f,g,h,i].indexOf(a) >= 0 ||
                      [a,c,d,e,f,g,h,i].indexOf(b) >= 0 ||
                      [a,b,d,e,f,g,h,i].indexOf(c) >= 0 ||
                      [a,b,c,e,f,g,h,i].indexOf(d) >= 0 ||
                      [a,b,c,d,f,g,h,i].indexOf(e) >= 0 ||
                      [a,b,c,d,e,g,h,i].indexOf(f) >= 0 ||
                      [a,b,c,d,e,f,h,i].indexOf(g) >= 0 ||
                      [a,b,c,d,e,f,g,i].indexOf(h) >= 0 ||
                      [a,b,c,d,e,f,g,h].indexOf(i) >= 0
                    ) {
                      continue;
                    }

                    if (a + (13 * (b/c)) + d + (12 * e) - f - 11 + (g * (h/i)) - 10 === 66) {
                      return [a,b,c,d,e,f,g,h,i];
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

document.getElementById('result').innerText = findSolution().join(', ')
<span id="result"></span>

答案 1 :(得分:1)

我认为没有更聪明的算法,只能尝试对集合中的数字进行相等的每个排列。我认为这比你每次创建一个尚未生成的独特数组更容易。

在下面的代码中,我使用了非常原始的检查数字之间的相等性。标准javascript库可能有一种更简单的方法(例如,如果在预定义的集合中找到了数字......)

var solutions = [];

for (var a = 1; a <= 9; a++) {
  for (var b = 1; b <= 9; b++) {
    if ( b == a ) continue;
    for (var c = 1; c <= 9; c++) {
      if ( c == b || c == a ) continue;
      for (var d = 1; d <= 9; d++) {
        if ( d == c || d == b || d == a ) continue;
        for (var e = 1; e <= 9; e++) {
          if ( e == d || e == c || e == b || e == a ) continue;
          for (var f = 1; f <= 9; f++) {
            if ( f == e || f == d || f == c || f == b || f == a ) continue;
            for (var g = 1; g <= 9; g++) {
              if ( g == f || g == e || g == d || g == c || g == b || g == a ) continue;
              for (var h = 1; h <= 9; h++) {
                if ( h == g || h == f || h == e || h == d || h == c || h == b || h == a ) continue;
                for (var i = 1; i <= 9; i++) {
                  if ( i == h || i == g || i == f || i == e || i == d || i == c || i == b || i == a ) continue;

                  if ((a + (13 * (b/c)) + d + (12 * e) - f - 11 + (g * (h/i)) - 10) == 66) {
                    solutions.push(a + "," + b + "," + c + "," + d + "," + e + "," + f + "," + g + "," + h + "," + i);
                  }

                }
              }
            }
          }
        }
      }
    }
  }
}

console.log(solutions);

这导致很多解决方案

["1,2,6,4,7,8,3,5,9", "1,2,6,4,7,8,5,3,9", "1,3,2,4,5,8,7,9,6", "1,3,2,4,5,8,9,7,6", "1,3,2,9,5,6,4,7,8", "1,3,2,9,5,6,7,4,8", "1,3,4,7,6,5,2,9,8", "1,3,4,7,6,5,9,2,8", "1,3,6,2,7,9,4,5,8", "1,3,6,2,7,9,5,4,8", "1,3,9,4,7,8,2,5,6", "1,3,9,4,7,8,5,2,6", "1,4,8,2,7,9,3,5,6", "1,4,8,2,7,9,5,3,6", "1,5,2,3,4,8,7,9,6", "1,5,2,3,4,8,9,7,6", "1,5,2,8,4,7,3,9,6", "1,5,2,8,4,7,9,3,6", "1,5,3,9,4,2,7,8,6", "1,5,3,9,4,2,8,7,6", "1,9,6,4,5,8,3,7,2", "1,9,6,4,5,8,7,3,2", "1,9,6,7,5,2,3,4,8", "1,9,6,7,5,2,4,3,8", "2,1,4,3,7,9,5,6,8", "2,1,4,3,7,9,6,5,8", "2,3,6,1,7,9,4,5,8", "2,3,6,1,7,9,5,4,8", "2,4,8,1,7,9,3,5,6", "2,4,8,1,7,9,5,3,6", "2,8,6,9,4,1,5,7,3", "2,8,6,9,4,1,7,5,3", "2,9,6,3,5,1,4,7,8", "2,9,6,3,5,1,7,4,8", "3,1,4,2,7,9,5,6,8", "3,1,4,2,7,9,6,5,8", "3,2,1,5,4,7,8,9,6", "3,2,1,5,4,7,9,8,6", "3,2,4,8,5,1,7,9,6", "3,2,4,8,5,1,9,7,6", "3,2,8,6,5,1,7,9,4", "3,2,8,6,5,1,9,7,4", "3,5,2,1,4,8,7,9,6", "3,5,2,1,4,8,9,7,6", "3,6,4,9,5,8,1,7,2", "3,6,4,9,5,8,7,1,2", "3,9,2,8,1,5,6,7,4", "3,9,2,8,1,5,7,6,4", "3,9,6,2,5,1,4,7,8", "3,9,6,2,5,1,7,4,8", "4,2,6,1,7,8,3,5,9", "4,2,6,1,7,8,5,3,9", "4,3,2,1,5,8,7,9,6", "4,3,2,1,5,8,9,7,6", "4,3,9,1,7,8,2,5,6", "4,3,9,1,7,8,5,2,6", "4,9,6,1,5,8,3,7,2", "4,9,6,1,5,8,7,3,2", "5,1,2,9,6,7,3,4,8", "5,1,2,9,6,7,4,3,8", "5,2,1,3,4,7,8,9,6", "5,2,1,3,4,7,9,8,6", "5,3,1,7,2,6,8,9,4", "5,3,1,7,2,6,9,8,4", "5,4,1,9,2,7,3,8,6", "5,4,1,9,2,7,8,3,6", "5,4,8,9,6,7,1,3,2", "5,4,8,9,6,7,3,1,2", "5,7,2,8,3,9,1,6,4", "5,7,2,8,3,9,6,1,4", "5,9,3,6,2,1,7,8,4", "5,9,3,6,2,1,8,7,4", "6,2,8,3,5,1,7,9,4", "6,2,8,3,5,1,9,7,4", "6,3,1,9,2,5,7,8,4", "6,3,1,9,2,5,8,7,4", "6,9,3,5,2,1,7,8,4", "6,9,3,5,2,1,8,7,4", "7,1,4,9,6,5,2,3,8", "7,1,4,9,6,5,3,2,8", "7,2,8,9,6,5,1,3,4", "7,2,8,9,6,5,3,1,4", "7,3,1,5,2,6,8,9,4", "7,3,1,5,2,6,9,8,4", "7,3,2,8,5,9,1,6,4", "7,3,2,8,5,9,6,1,4", "7,3,4,1,6,5,2,9,8", "7,3,4,1,6,5,9,2,8", "7,5,2,8,4,9,1,3,6", "7,5,2,8,4,9,3,1,6", "7,6,4,8,5,9,1,3,2", "7,6,4,8,5,9,3,1,2", "7,9,6,1,5,2,3,4,8", "7,9,6,1,5,2,4,3,8", "8,2,4,3,5,1,7,9,6", "8,2,4,3,5,1,9,7,6", "8,3,2,7,5,9,1,6,4", "8,3,2,7,5,9,6,1,4", "8,5,2,1,4,7,3,9,6", "8,5,2,1,4,7,9,3,6", "8,5,2,7,4,9,1,3,6", "8,5,2,7,4,9,3,1,6", "8,6,4,7,5,9,1,3,2", "8,6,4,7,5,9,3,1,2", "8,7,2,5,3,9,1,6,4", "8,7,2,5,3,9,6,1,4", "8,9,2,3,1,5,6,7,4", "8,9,2,3,1,5,7,6,4", "9,1,2,5,6,7,3,4,8", "9,1,2,5,6,7,4,3,8", "9,1,4,7,6,5,2,3,8", "9,1,4,7,6,5,3,2,8", "9,2,8,7,6,5,1,3,4", "9,2,8,7,6,5,3,1,4", "9,3,1,6,2,5,7,8,4", "9,3,1,6,2,5,8,7,4", "9,3,2,1,5,6,4,7,8", "9,3,2,1,5,6,7,4,8", "9,4,1,5,2,7,3,8,6", "9,4,1,5,2,7,8,3,6", "9,4,8,5,6,7,1,3,2", "9,4,8,5,6,7,3,1,2", "9,5,3,1,4,2,7,8,6", "9,5,3,1,4,2,8,7,6", "9,6,4,3,5,8,1,7,2", "9,6,4,3,5,8,7,1,2", "9,8,6,2,4,1,5,7,3", "9,8,6,2,4,1,7,5,3"]

如果公式仅为此,并且不会更改,则可能会尝试考虑每个定义的结果集中是否存在未包含的范围。例如,如果您发现某些数字不能为9,则不应迭代到9。公式中的乘法可能会超过甚至加到其他变量中的最小值以超过66的数字。