2

Math Square: このように: http://www.ps-heine.de/archives/416

  • Math Square は、左から右、上から下に解く必要があります。
  • 操作規則の順序は適用されません。
  • 各番号は時間内のみご利用いただけます。

小学校の頃から大好きだったのですが、残念ながら本は見つかりませんでした。自分で作ろうと思ったのにがっかりしました。

私はまだ構想段階ですが、これまでに行った手順について説明させてください。

まず、配列を作成します$matrix

  • 行列の各行の配列が含まれています。
  • 各行配列は、実際の行の列/セルを保持します。
  • 各セルは、パラメータ「id」、「type」、および「value」を持つ配列です。

ここで配列の例を表示します: http://pastebin.com/RdBmxvjq

この例では、すでに演算子を確認できます。

演算子「+」、「-」、「*」、「/」のいずれかをランダムに返す関数 operator() があります。

当然のことながら、最初に演算子を含めて、それらと一緒に行列に適合する数値を見つけるよりも、その逆よりもはるかに簡単です。

この時点で、私はすでに終了している可能性があります。

これで、乱数を入れて (もちろん配列から、繰り返さないので)、行と列の結果を計算し、数字を削除して、パズルを完成させることができました!

師団長がいなかったら!

もちろん、私 /最終ユーザーがプライム数を分割しようとしたり、結果として小数を取得しようとしたりしたくありません。

これで、除算記号の前に入れるのに最適な数が見つかるまで、ループして「ブルートフォース」することができましたが、これはとても... ひどいです

最初にすべての分割が意味のある結果になるようにする方法があればいいのに...結果...

何か案は?

編集:

ちょっと理にかなっていると思われる、私が今持っていたランダムな考えをいくつか追加させてください。

まず、パズルの数字を変更すると、パズル全体に反映されます。したがって、すべてのタイプのブルートフォースを含む数値の変更は、パフォーマンスキラーです (そのナフという事実に加えて)。

したがって、論理的な結果は、最初に分割が発生した場所にのみ数字を含め始めることです。

最初に他の数を掛けて計算する「積」に数を使用して、その数が素数でないことを確認し、因数を持たせることができます。

しかし、因数の 1 つが素数で、再び割り算が発生した場合はどうなるでしょうか。

非素因数を取得するために別の数を掛けた数を繰り返し使用すると、パズル内の数の多様性が減少し、全体の重要性が低下します。

では、パズルを「リバース エンジニアリング」すると、掛け算はどうなるでしょうか。それらは自動的に「分割」になり、問題は最初からやり直します。

何人かの数学者に、私をバカと呼んで、驚くほど簡単な解決策を提示させてください...

4

1 に答える 1

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

認めたくありませんが、これが今日の私の脳力のすべてです... 後でそれをチェックして、興味深い進展があるかどうかを確認します.

于 2012-08-30T15:22:27.573 に答える