如何用PHP创建“数学广场”拼图?

时间:2012-08-30 15:12:34

标签: php math logic

数学广场: 像这样:http://www.ps-heine.de/archives/416

  • 必须从左到右,从上到下解决数学广场。
  • 操作规则的顺序不适用。
  • 每个号码只能按时使用。
我从小学开始就很喜欢这些,但不幸的是我找不到任何书籍。对此感到失望,我以为自己可以尝试自己制作一些。

我还处于概念阶段, 但是让我解释一下我到目前为止采取的步骤:

首先我创建一个数组$matrix

  • 它包含矩阵每一行的数组。
  • 每个行数组都包含实际行的列/单元格。
  • 每个单元格是一个带有参数“id”,“type”& “值”。

在此处查看数组的示例: http://pastebin.com/RdBmxvjq

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

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

Naturaly首先包括运算符,而不是找到与矩阵一起拟合的数字比反之亦然。

此时我已经完成了!

现在我可以输入随机数(当然是从数组中,所以他们不重复自己),计算行的结果&列,删除数字,让我的拼图完成!

如果没有除法运算符!

当然我们不希望我/最终用户试图划分素数或得到小数作为结果。

现在我可以循环和“暴力”,直到我找到在分裂标志之前放入的完美数字,但是这样...... naff

我希望有一种方法可以让你最初确定所有的分歧都会产生有意义的结果......结果......

有什么想法吗?

修改

让我添加一些随意的想法,这对我来说似乎有点意义:

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

因此,合乎逻辑的结果是首先开始包括仅出现分裂的数字。

我们可以使用一个数字作为“产品”,我们首先通过乘以其他数字来计算,以确保数字不是素数并且有一个因子。

但是,如果其中一个因素是素数,又会再次发生分裂会怎样?

如果我们反复使用一个乘以另一个数字的数字来获得一个非素数因子,这会减少我们拼图中数字的变化,使整个事物变得不那么紧张。

当我们对其进行“逆向工程”时,拼图中的乘法会发生什么? 他们自动“成为分裂”,问题重新开始。

请让一些数学家来称呼我愚蠢并提出一个令人惊讶的简单解决方案......

1 个答案:

答案 0 :(得分:3)

试试这个:

$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)
        }
    }
}

我不想承认,这就是我今天拥有的所有脑力......我会稍后检查一下,看看是否有任何有趣的发展。