如何创建一个“;数学方块“;使用PHP的谜题


How to create a "Math Square" puzzle with PHP?

数学平方:就像这个:http://www.ps-heine.de/archives/416

  • 数学正方形必须从左到右、从上到下求解
  • 操作顺序规则不适用
  • 每个号码只能按时使用

我从小学起就喜欢这些书,但不幸的是,我找不到带它们的书。对此我很失望,我想我可以试着自己做一些。

我仍处于概念阶段,但让我来解释一下我迄今为止所采取的步骤:

首先,我创建了一个数组$matrix

  • 它为矩阵的每一行都包含一个数组
  • 每个行数组包含实际行的列/单元格
  • 每个单元格都是一个数组,其参数为"id"、"type"&"值"

在此处查看阵列示例:http://pastebin.com/RdBmxvjq

在本例中,您已经可以看到运算符。

我有一个函数operator(),它随机返回一个运算符"+"、"-"、"*"、"/"。

自然地首先包括运算符,然后找到与运算符一起拟合在矩阵中的数字要比反之容易得多。

在这一点上,我可能已经结束了

现在我只需要输入随机数(当然是从数组中,这样它们就不会重复了),计算行的结果&列,去掉数字,完成我的谜题!

如果没有除法运算符

当然,我们不希望我/最终用户试图除以素数或得到小数。

现在我可以循环并"brueforce",直到我找到在除法符号之前输入的完美数字,但这太…naff

我希望有一种方法可以确保最初所有的分歧都能产生有意义的结果。。。后果

有什么想法吗?

编辑:

让我添加一些我刚刚的随机想法,这些想法对我来说似乎有点敏感:

首先,当我改变拼图中的一个数字时,它会对整个拼图产生影响。因此,不断变化的数字,包括所有类型的野兽,是一个性能杀手(除了它的naff之外)。

因此,一个合乎逻辑的结果是,首先只在出现除法的地方包含数字。

我们可以用一个数字来表示"乘积",我们首先通过乘以一些其他数字来计算,以确保这个数字不是素数,并有一个因子。

但是,如果其中一个因子是素数,并且再次发生除法,会发生什么?

如果我们反复使用一个数字乘以另一个数字来得到一个非素数,这将减少我们谜题中数字的多样性,使整个问题变得不那么重要。

当我们对谜题进行"逆向工程"时,谜题中的乘法会发生什么?它们会自动"分化",问题就会重新开始。

请让一些数学家来叫我笨蛋,并提出一个惊人的简单解决方案。。。

试试这个:

$num = integer; // the number before /
$factors = array(1, $num); // allowed numbers after / (1 and $num are always allowed)
// loop through whole numbers up to the original $num
for($i = 2; $i < $num ; $i++) {
    // if $i can devide $num, save it and the other factor
    if($num % $i == 0) {
        // if $i is there, we have gone through all factors, no need to loop anymore
        if(in_array($i, $factors)) {
            break;
        }
        // save $i and $num / $i
        $factors[] = $i;
        if($i != $num / $i) { // do not save $i twice
            $factors[] = $num / $i;
        } 
    }
}

并使用$factors数组中的一个随机数作为"/"后面的数字。

关于填写数字(伪代码):

R = row, C = collumn
for(R; R < max rows; R = R+2) { // R+2 to skip sign rows
    for(C; C < max cols; C = C+2) { // C+2 to skip sign columns
        if(C-1 == / && R-1 == / && C >= 2 && R >= 2) {
            find factors of C - 2;
            find factors of R - 2;
            select number from subsection of these (should be at least 1)                 
        } 
        else if (C-1 == / && C >= 2) {
            select number from factors of C-2
        }
        else if (R-1 == / && R >= 2) {
            select number from factors of R-2
        }   
        else {
            select any number (maybe select just non-prime numbers here)
        }
    }
}

我不愿意承认,这是我今天所有的脑力。。。我稍后会查看它,看看是否有任何有趣的发展。