見出し画像

#35 【検証】「情報」未履修でも現役情報工学科大学生なら共通テスト「情報」で満点取れるのか!?

どうも、まりなです。

夏ですね。いやあ夏は嫌いです。いい思い出がありません。学生時代の夏休みといえば勉強の思い出しかないですね。現役受験生の方々はこんなクソ暑い中勉強に励んでおられることかと思います(私のnote読んでる人間に受験生なんているのかわかりませんが)。毎日お疲れ様です。

さて今回はタイトルの通りなのですが共通テストの「情報関係基礎」を現役工学部情報工学科4年の私が解いたら何点取れるのかという検証企画です。実は私の通った高校には情報の授業がなく、大学に入るまで情報を習ったことがありませんでした。塾講師のアルバイトもしていたことがあるのですが情報を教えたことはないので、高校の情報の授業がどんな内容なのかも全く知りません。そんな状態でも流石に大学4年生なら満点を取ることができるのでしょうか?検証していきたいと思います。現役JK(Jouhou Kougaku科)パワーを見せつけます!

結果だけ知りたい方は下のチャプターからどうぞ↓

解いていきます!

問題は共通テスト公式ホームページ(https://www.dnc.ac.jp/kyotsu/kako_shiken_jouhou/r4/r4_jisshikekka/r4_tuisaisiken_seikai.html)でダウンロードできる令和4年度のものを解きました。(以下、問題は上記ページからの引用です。ご了承ください。)

60分間で大問1・2が必答、大問3・4から一題選択で60分間の試験です。実際に時間を測って解きました。共通テスト特有の(自分の現役時はセンター試験でしたが)時間に焦らされるあの嫌な感じを久々に味わいました。余裕で見直しする時間も作れると思ったら意外にギリギリになりました。

では解きながら考えていたことなどもふまえつつ問題を解説していきたいと思います。

スクリーンショット 2022-08-09 17.48.50

普通に頭から解いていきました。いきなりビビりました。問1 aはサンプリング・量子化の話をしています。サンプリングというのは連続的な情報からとびとびの(離散的な)情報のみを取得することです。この問題の例のように連続的な空気の振動という情報を1/48000秒間隔で取得することで「録音」は実現されています。
その間隔が広すぎるとエイリアシングが発生しナイキスト周波数を超える音声については折り返しノイズが発生し...という流れになったら流石にビビり散らかしたのですがそうはならず単純にデータの大きさの問題で安心しました。
量子化というのはサンプリングして取得した値をコンピュータで扱えるようビット列(二進数の列)に変換することです。この問題では16bit、つまり16桁の二進数でデータを扱うと言っています。これは実際によく用いられている方式ですね。
ということで(ア)は8ビットが1バイトであることを踏まえると16ビットは2バイトですから(0)が答えです。(イ)は1秒に48000回データを取得し、30秒間それを続けると全部でどれだけのデータ量になるか問うていますから48000[Hz]×30[秒]×2[バイト] = 2880000[バイト]なので(4)が答えですね。

bはWebページに関する問題です。知識問題ですね。情報の授業では実際にWebページを作ったりするのでしょうか?
深読みしすぎそうになりましたが(ウ)はHTML, (エ)はURL, (オ)はHTTPです。

cは全く知りません。コピーライトの話ですね。こんなことも習うんですね。noteやYouTubeで一応コンテンツをあげている身としては、こういうの高校生のうちに習っときたかったですね。いつも引用の際ネットで「こういう使い方は問題ないかな......」と調べて書いています。
話がそれましたが問題自体は日本語の問題なのでよく読めば答えは(1)と(5)だとわかりました。

スクリーンショット 2022-08-09 14.58.03

問2はグラフの読み取りの問題でした。なんか小学校の社会の問題みたいですね。特に言うことはありません、(ク)は3、(ケ)は1、(コ)は4ですね。

スクリーンショット 2022-08-09 15.00.03

問3はちょっと解きごたえがありそうに感じました。Androidのスマホのロックみたいな設定のようです。でも問題自体は数学Aの「場合の数」の範囲の簡単な問題ですね。(サ)は左上の点を始点として他の3点を通る方法は何通りか聞いています。任意の点から他の任意の点にパスがあるので単純に3! = 6通りですね。(シ)(ス)は(この二桁の数字の解答形式なつかしい)始点が任意の場合なので(サ)の4倍で24通りです。(セ)(ソ)(タ)は重複を許して4点をたどる方法なので始点の選び方が4通り、その後は毎回3通りなので4×3×3×3 = 108通りですね。

(チ)(ツ)(テ)(ト)は知識問題ですね。2段階認証的な話のようです。(ツ)は「所有物認証」に使えるものを問うていて、もちろん7の「携帯電話」が答えなのですが「携帯電話は所有者と契約名義人が異なる場合もあるから所有物としていいのか...?」とまた深読みしそうになりましたが他に選べそうな選択肢がなかったので正解できました。(チ)5, (ツ)7, (テ)0, (ト)1が答えです。

スクリーンショット 2022-08-09 15.13.28

大問2に入りました。指定した「工具番号」の工具が入っている「箱」を倉庫からとってくるロボットの問題のようです。工学っぽくなってきました。(ア)は「工具番号」から「箱番号」を求める方法を聞いていて、各箱には表1のように工具が入っています。各箱に入っている工具番号に共通するのは「4で割ったあまり」ですから1が答えですね。(イ)からはロボットが箱を取りに行く回数を議論していて、5回の作業で毎回異なる箱の工具が必要な場合は5回箱を取りにいかなければなりませんし、同じ箱の工具のみが必要な場合は1回で済みますね。(イ)は5で(ウ)は1です。(エ)からは使う箱番号を数列にした「箱番号列」を導入していて(※「数列」と聞くと数学の「等差数列」や「等比数列」が思い浮かぶかもしれませんが情報工学における「数列」というのは文字通りただの順番のある数字の列のことです。)、箱番号列が[0, 1, 1, 1, 0, 2]の場合は0番、1番、0番、2番と4回箱を取りに行くことになるので4回が答えです。毎回次の箱を取りに行く時は前の箱を倉庫に戻さないといけないという設定なので注意ですね。「いや机大きくして作業室に置いとけばええやろ」と思いますよね。

スクリーンショット 2022-08-09 15.29.56

問2はさらにこの問題を議論しています。やっぱり作業室に置ける箱の数を2個に増やすようです。問1を解いている時から「もしや...?」と思っていたのですがここで確信しました。大問2の背景は「ページ置き換えアルゴリズム」です。

コンピュータにはメインメモリと補助メモリというものがあります。前者はよく「RAM」と呼ばれ、後者は「ストレージ」と呼ばれます。メインメモリはまさに「作業台」、補助メモリは「倉庫」のイメージです。コンピュータはプログラム(工具)を倉庫に置いていて、動かす際に倉庫からとってきて作業台の上に乗せて作業します。作業する際、作業台には普通複数の工具が並びます。全部の工具を作業台の上に置いておきたいのですが作業台(メインメモリ)は高価で容量が小さいのでそうはいきません。なので今作業台に無い工具が必要になったときどの工具を倉庫に戻して新しい工具を作業台に置くか決めなければなりません。この決定方法を「ページ置き換えアルゴリズム」と言います。(「ページ」はこの問題における「箱」のことだと思ってくれたら問題ないです。)

問2では箱の置き換え方法として「設定F」と「設定L」をもうけていますが実は「設定F」は「FIFO (First In First Out) 」というアルゴリズムで、「設定L」は「LRU (Least Recently Used)」というアルゴリズムです(問題を解いた高校生は「なんでFとLなんだ...?」と思ったことでしょう)。

説明されている通り、設定Fは古い方の箱を倉庫に持って帰る方式で設定Lは使ってない箱を倉庫に持って帰る方式です。実際に表2を埋めれば情報工学を知らない人でも解けます。解答は(オ)1, (カ)1, (キ)6, (ク)5, (ケ)1, (コ)3 です。

スクリーンショット 2022-08-09 15.47.42

問3(サ)からは、さらに一連の作業で使う箱番号が最初にわかっている設定について話しています。これは「OPT (Optimal)」というアルゴリズムです。今後使う箱番号がわかっているなら今後使わない方を倉庫に戻せば一番効率的ですよね。実際これより効率的なアルゴリズムはないのですが現実世界ではこの先使うプログラムを先に知る方法はないので、OPTの「箱取得回数」は目標値としてよく用いられます。(サ)1, (シ)3, (ス)4, (セ)2 が答えです。

(ソ)・(タ)・(チ)は箱に入れる工具の組み合わせを変える話で連続して使う傾向の高い工具の組は同じ箱に入れておいたほうが効率的なので図2を読み、箱0に工具4が、箱1に工具3があった方が良さそうなので(ソ)3, (タ)4, (チ)0です。

(ここは読み飛ばしてもらって大丈夫なのですが(ソ)(タ)(チ)はどちらかというと「キャッシュ」に関係する内容かなと思いました。キャッシュというのはメインメモリよりもさらに容量は小さいけれど高速にアクセスできる「めっちゃ使いやすい作業台」のようなものだと思ってください。このめっちゃ使いやすい作業台も何を置いて何をどかすか考える必要があり、この問題では図2の「工具1の次は工具4がよく使われる」というような設定でしたが実際コンピュータには「空間的局所性」という性質があり使用したデータの周辺のデータが使われやすいことが知られています。この問題の設定に当てはめるなら「使った工具と工具番号の近い工具が次に使われることが多い」という性質です。このため実際のコンピュータではもともとの表1のような入れ方の方が効率的だろうなあ......と解いてて思いました。)

大問2を終え選択問題に入ります。大問3はプログラム・アルゴリズムっぽい問題で大問4はExcelのような表計算ソフトの問題のようでした。Excelも実験とかでもちろん使うのでたぶん大問4も解けるのですが、ここは現役JKとして大問3を解くことにしました。

スクリーンショット 2022-08-09 16.13.54

大問3はパスワードについての問題で背景は「Brute-force attack」のようです。いわゆる「総当たり攻撃」のことでパスワードの数字列(あるいは文字列)全通りを試すことで認証を突破する攻撃です。

図1のようにアルゴリズムが擬似コードで示されています。日本語で挙動が説明されているのでプログラミングあまり詳しくない方も是非見てみてください。図1はパスワードの候補が正解と一致するか1文字ずつ照合して判定する アルゴリズムで、Kouho[i]はパスワード候補のi文字目、Seikai[i]は正解(パスワード)のi文字目のことです。まず1行目c←0と書いてありますが「←」は代入を意味する記号で、「cに0を代入する」ということを表しています。パスワードは8文字で、iを0から7まで増やしながら(情報工学では1つめの要素を0番目とする慣習があるので一般的な「1文字目」は「0文字目」にあたります。)もしKouho[i] = Seikai[i]なら(ア)を実行する、ということを繰り返すようです。繰り返しが終わったあと、もし条件(イ)をみたすならKouhoを表示する、つまりKouhoは正解のパスワードということのようです。
1行目の「c←0」は初期化という操作です。変数cの初期値を0に設定しています。ではもしKouho[i] = Seikai[i]なら、つまり候補のi文字目と正解のi文字目が一致するならcを1増やして(c←c+1)、繰り返しを終えた後、c=8(パスワードの文字数)になっていれば8文字全て候補と正解は同じ、つまりKouhoは正解のパスワードと言えますね。よって(ア)3, (イ)3です。

(ウ)ではつぎに数値列と文字列を対応づける方法について考えています。現在多くのアカウントサービスのパスワードは文字列ですから数字列を総当たりしても攻撃は成功しそうにありませんからね。対応表「Mozi」を設けいています。こういうのをプログラミング界隈では「辞書」といいます。「直接文字で扱えばいいのに」と思うかもしれませんが数値のほうが計算処理などがしやすく拡張がきくのでたいていこういう手法をとります。問題は数値列を文字列に変換する方法を問うていて候補のi文字目、Kouho[i]はこの場合「Mozi」の「Suutiのi文字目」番目なのでMozi[Suuti[i]]とすれば取得できます。よって(ウ)は2です。

スクリーンショット 2022-08-09 16.45.40

問2からは総当たり攻撃の部分を作っていくようです。図5にそのアルゴリズムが示されていて、Suutiを[0,0,0,0,0,0,0,0]、[1,0,0,0,0,0,0,0]、[2,0,0,0,0,0,0,0]、...、[25,25,25,25,25,25,25,25]まで変化させていく方法が考えられています。[0,0,0,0,0,0,0,0]は「aaaaaaaa」に、[25,25,25,25,25,25,25,25]は「ffffffff」に対応します。(エ)は変数mの値、(オ)は変数nの値を聞いていて、問題文と図5を読むとmは変数jがSuutiを「はみ出さないように」するための値、のようです。図5の6行目を見るとj<mの間のみ繰り返す処理があるようです。つまりmはパスワードの文字数と推測できます。よってmは7にしておきたいので(エ)3です。

nは図5を見ると「t%n」という使い方で使われているようです。a%bは問題文でも説明されている通り、「aをbで割った余り」を求める演算です。数学の「mod」にあたります。数学を習っているときはmodなんて何の役に立つんだといった感じでしたがプログラミングでは死ぬほど役に立つ存在です。

例えばターン制の3人プレイのゲームを作る際、変数turnを用いて、turn=0のときはプレイヤー0のターン、turn=1のときはプレイヤー1のターン、turn=2のときはプレイヤー2のターン、といった感じで今誰のターンなのかを管理することが多いです。turnを0, 1, 2, 0, 1, 2,...と変化させてターンを回したいのですがどうすれば良いでしょうか。0から1、1から2にするのには+1する、という操作でいいですが2のつぎは0にしたいので2 + 1 = 3となっては困ります。
ここでmodが活躍します。+1した後3で割った余りにすればうまくいきます。
0の次は (0 + 1) % 3 = 1 % 3 = 1で1、1の次は(1 + 1) % 3 = 2 % 3 = 2で2、2の次は(2 + 1 ) % 3 = 3 % 3 = 0、となり2の次が0になる更新ができます。

このようにmod(%)は循環を表現するためプログラミングでよく用いられます。それを踏まえ今回は図4のようにSuutiが[25,0,0,0,0,0,0,0]まで達したら次は0文字目を0に戻して[0,1,0,0,0,0,0,0]としたいので「25の次は0」という循環を表現したいようです。よってnは26にしておけばうまくこの循環を表せます。よって(オ)は6です。

(カ)は6行目の繰り返しの条件の部分でこれは連続した25をすべて0にもどしていくための条件でt≧26の間、0に戻す作業を繰り返さないといけないので26を格納しているnにすれば良いので(4)です。

(キ)からはパスワードの形式を変更する場合についての話です。背景には「モジュール化」があると思います。プログラムを作成する際、部分部分を「モジュール」として作り、それを組み合わせて使うことをモジュール化と言います。こうすることの利点の1つは仕様変更に対応しやすいということです。モジュール化しておけば仕様を変更する際、関係するモジュールのみを変更するだけで済みます。
(キ)はパスワードの長さを変更する場合ですがこれは図1のプログラムではiを増やす範囲、図5のプログラムではmの値を変更する必要があるので両方変更する必要があります(答えは2)が、文字の種類数を変更する(ク)の場合は図5のnを変更するだけで済みます(答えは1)。
(ケ)・(コ)はパスワードの長さや文字の種類数を変更することで総当たり回数は何回増えるかという話でパスワードを2文字増やすとパスワードの総数は26^8から26^10に増えるので(ケ)は26^2倍で(6)、文字数はそのまま8文字で大文字小文字を使う場合パスワードの総数は26^8から(26 × 2)^8に増えるので(コ)は2^8倍で(2)です。

スクリーンショット&amp;nbsp;2022-08-09&amp;nbsp;17.26.36

最後のページ問3はあまり解説することがないので(既に7000字近く書いて疲れた)答えのみ書いておきます。(サ)3, (シ)4, (ス)(セ)(ソ)100 です。プログラミング初心者の100人中100人が通る初期化ミスの問題でした。

結果発表

ここまで読んでいただきありがとうございます。読むのも大変だったかと思いますが書いているこちらもかなり疲れました(すみません、大学教授が言う「うっせえわ」なセリフランキング第1位を言ってしまいました)。

ではまりなはこのテスト余裕の満点を取ることができたのでしょうか!?

結果は

画像10

90点

この世で一番面白くない点数を取ってしまいました。本当に申し訳ありません。

間違えたのは大問1(セ)(ソ)(タ)(辿る点の数を誤解し4×3×3×3とすべきところを4×3×3×3×3としてしまっている)、大問2の(エ)(数え間違い)、(セ)(「箱」のつもりで「工具」を選んでしまった)、大問3の(エ)(文字数は0文字目から数えるのでm=7)でした。

ということで検証結果は「解けるけどしょうもないミスで90点になる」でした。最後まで読んでいただき本当にありがとうございました。それでは。

この記事が気に入ったらサポートをしてみませんか?