カテキョでPowerをフル活用してサボってTwitter!(中学三年数学のランダムテスト生成アプリを作ってみた)

君が好きだと叫びたいあきらです。

 

この記事は、Power Apps Advent Calendar 2022 12月19日担当分の記事です。

AutomateもBIもありますので見てね!

qiita.com

qiita.com

qiita.com

 

みなさん、因数分解してますか?

若しくは中学三年生時に、「こんなもん大人になったらカケラも使わないぜ!」って斜に構えて、反抗期真っ最中である自分をカッコいいと勘違いして、大人に反抗して、普段やらないような、今思い出すと「あああああああああああああああ」ってなるような思い出を噛みしめて、今更「大人になったなぁ俺…」って言いながら空の星を眺めて、ベランダでタバコでも吸って、黄昏ていませんか?何歳まで中二病やるつもりですか?

 

この絶望的な二択問題からブログを書き起こす今日この頃。

主題にある通り、因数分解を永久にできる問題パターンを生成してみました。

 

そもそも因数分解って

因数分解フリークなワタシたちには、関係ないかもしれませんが、

因数分解とは、「数式を乗法因子に分解する」ことです。

何言ってるかわからないですよね。

乗法因子ってのは、掛け算の積から〇×△って状態に戻す、ということです。

簡単なところでいうと、15という数字は3×5という風に因数の積に分解されて、

これは複素数や実数の体系ならば、0を除くすべての数において、分解が可能となります。

有名な4公式とかありましたね。

こんなやつです。

 

今回は上記の公式を使った問題を反射的に解く、数の新陳代謝を上げるアプリを作ってみました。

意外と生徒に評判がいいので、教師冥利につきますわ。

 

出題範囲

イデアル一意分解性質のデデキント整域におけるデデキント代数的整数論の一意性の話とかはしないですよ。

単純な因数分解式の話です。

もっと言えばかなり単純なものです。

大人なら数秒で解けるレベルだと思ってくださいませ。

このレベルです。

初級編①レベルですね、はい。

このレベルも解けない人は数学やりなおしましょう。

大学まで数学やってたレベルの人間から見ると、児戯ですね、はい。

 

因数分解の解き方

中学3年生にワタシが教える因数分解の仕方を解説します。

まずは例題を考えてみましょう。

今回はこのx²+bx+cのカタチの因数分解を対象とします。

 

ゴールはこちらです。このように因数×因数のカタチにできればコレが解答となります。

 

因数分解の解き方はまず2つの箇所に注目します。

 

次にまず青枠が「何×何の積か」を考えます。

恐らく何パターンか出てくると思います。

整数だけを考えるのならば、

①1 × -14

②2 × -7

③7 × -2

④14 × -1

の4パターン思いつくと考えられます。

 

このうち各ペアの和を考えてみましょう。

①-13

②-5

③5

④13

となります。

 

これが先ほどの赤枠部分と合致している項目のペアが答えのペアになります。

つまり答えのペアは③の7とー2となります。

そして答えの書き方は(x+答えのペアのいずれか)×(x+答えのペアの残り)

となりますので、この答えは

となります。

 

結構大事なことですが、きちんと展開して元の数式に戻るか試すことを勧めます。

子供のことからうっかりミスしてると大人になってから、ヒューマンエラーっていう英熟語になって襲ってくるぞ!きをつけろ!

 

Power Appsでの問題のざっくり作り方

ほんとにざっくりです。

Pointは「答えから考える」という事です。

結構この考え方は大事で、例えばパズルゲームを作ろうとなるときも同じで、

どうあがいても解けっこないパズルを作ってはいけない、というルールを持っておかないと、どれだけlogicを細かくしても、絶対に完成はしないものです。

それはClearの状態から考えることで、大体回避できますので、まずは完成形を思い浮かべるとよいです。

では今回の場合どう考えるか、順を追って作成してみましょう。

 

まず答えになる組を生成する

上の例題でいうー5と7のペアみたいなもんですね。

ボタンを配置します。

RandBetween関数とSequence関数、AddColumns関数でも使って20ペア、景気よく作っちゃいましょうかね。

なんでこうやって作ったかというと、Sequenceが最近楽しいからです。

ClearCollect(
    colFactorization,
    AddColumns(
        Sequence(
          20,
          1
        ),
        "factor1",
        RandBetween(
            -10,
            10
        ),
        "factor2",
        RandBetween(
            -10,
            10
        )
    )
)

 

これでまぁ簡単に言うと、

Value factor1 factor2
1  -10から10までのランダムな整数  -10から10までのランダムな整数
2  -10から10までのランダムな整数  -10から10までのランダムな整数
3  -10から10までのランダムな整数  -10から10までのランダムな整数
4  -10から10までのランダムな整数  -10から10までのランダムな整数
5  -10から10までのランダムな整数  -10から10までのランダムな整数
6  -10から10までのランダムな整数  -10から10までのランダムな整数
7  -10から10までのランダムな整数  -10から10までのランダムな整数
8  -10から10までのランダムな整数  -10から10までのランダムな整数
9  -10から10までのランダムな整数  -10から10までのランダムな整数
10  -10から10までのランダムな整数  -10から10までのランダムな整数
11  -10から10までのランダムな整数  -10から10までのランダムな整数
12  -10から10までのランダムな整数  -10から10までのランダムな整数
13  -10から10までのランダムな整数  -10から10までのランダムな整数
14  -10から10までのランダムな整数  -10から10までのランダムな整数
15  -10から10までのランダムな整数  -10から10までのランダムな整数
16  -10から10までのランダムな整数  -10から10までのランダムな整数
17  -10から10までのランダムな整数  -10から10までのランダムな整数
18  -10から10までのランダムな整数  -10から10までのランダムな整数
19  -10から10までのランダムな整数  -10から10までのランダムな整数
20  -10から10までのランダムな整数  -10から10までのランダムな整数

 

みたいな表を作成してくれます。

Galleryでも作って確認してみましょう。

 

こんな感じで数字のペアを各種20ペア作ってくれますので、

これをコネコネGalleryのテンプレートの中で触っていきます。

 

答えのペアから問題を生成する

勘がよければもうブログ見なくてもできますよね。

構造をお話すると以下の画像のような形になります。

因数分解第一法則


なので、答えから問題を作成するには、

(a+b)とabがあればいいですね

Galleryの中にlabelを作成して、次のように記述しましょう。

 

With(
    {
        Formula1: ThisItem.factor1 + ThisItem.factor2,
        Formula2: ThisItem.factor1 * ThisItem.factor2
    },
    //長そうな式を格納
    "x²" & If(
        Formula1 > 0,
        "+" & Formula1 & "x",
        Formula1 = 0,
        "",
        Formula1 & "x"
    ) & 
    //(a+b)の値が0ならば省略、プラスになる場合は+記号を接頭につける、最後にxを付ける
    If(
        Formula2 >= 0,
        "+" & Formula2,
        Formula2
    )
    //(a*b)の値が0以上ならば+記号を接頭に付ける
)

 

これで問題が作成できます。

まぁどちらかが0の場合は積が0になるのでサービス問題化しますが、これはこれでいいでしょう。

こんな感じ

 

 

解答の作成

最初に解答のペアは作りましたが、

これは因数分解自体の回答ではないので、解答を作成していきます。

labelを追加して下のように書いてみましょう。

 

 

If(
    ThisItem.factor1 = ThisItem.factor2,
    "(x" & If(
        ThisItem.factor1 > 0,
        "+" & ThisItem.factor1,
        ThisItem.factor1
    ) & ")²",
    "(x" & If(
        ThisItem.factor1 > 0,
        "+" & ThisItem.factor1,
        ThisItem.factor1
    ) & ")(x" & If(
        ThisItem.factor2 > 0,
        "+" & ThisItem.factor2,
        ThisItem.factor2
    ) & ")"
)
//解答ペアが同じ数字でかつ解答1が0より大きいならば+を接頭に追加して、")²"を付ける
//解答ペアが違う数字でかつ解答1、解答2が0より大きければ接頭に+を付けるて()を並べる

 

ったく…うるさいなぁ

コードが汚いって言いたいんだろ?

今深夜2時なんだよ

書きながら整理して動けばそれでいいじゃないか

 

はい、結果を見てみましょう。

 

上側に配置したラベルが問題で、下側に配置したものが解答です。

こんな感じで問題と答えができました。

あとはコレを例えば隠したいものはHideにして、変数でも突っ込んで、「答え合わせボタン」でも突っ込んであげればオッケーですね。

解答欄テキストボックス作って、テキストが合致したら正解マークでも出現すれば、さらにそれっぽいですね。

色々作ってみてください。

 

最後に

どうでしょうか、アッパーなテンションのシチュエーションでしょ?

結構簡単にこんな感じの問題は生成できちゃうので、

先生方の悩みの一つである

「問題集の問題が品切れだ!え?何?自分で作るの?嫌あああああああああああ!!」

ってのは解決しますね。

ワタシは大体iPadでこういうアプリ作って、演習時間は只管これやらせて、

ワタシはスマホでTwitterしてます。

そして時給をもらって帰る…

 

大丈夫ですよ!ちゃんと「こんなんで金もらっていいのかなぁ…」って思いながら受け取ってますから!

真人間ですから!

 

結構応用が利きますので、加減乗除問題とか、頑張れば平方根問題とか作れます。

 

 

 

 

 

ここまで読んだあなたに1つ課題を出したいと思います。

RandBetweenを

(-100,100)にしてみてください。

そしてクリスマスまでに20問解いてみましょう…

がんば☆