見出し画像

共通テストの「情報」のサンプル問題があまりにキモかったので愚痴らせてください

これ、真面目に勉強した受験生ほど発狂しそう。

大学入学共通テストに「情報」教科と科目が追加、サンプル問題が公開

こんなニュースが飛び込んできました。

共通テスト、教科「情報」新設…7教科21科目へ再編
https://www.yomiuri.co.jp/kyoiku/kyoiku/news/20210324-OYT1T50196/

(まるで遊びのような)プログラミングが小学校で必修化となったことを踏まえれば驚くべき変化でもないかもしれませんが、結構びっくりしました。

受験生の負担がまた増えること間違いなしですね!_(┐「ε:)_

予備校の講師が情報をバリバリに教える時代もそう遠くはないかもしれませんね…

サンプル問題を解いてみました

さて、このニュースにはサンプル問題が付属しています。

【PDF直リンク】
https://www.yomiuri.co.jp/media/2021/03/jouhou.pdf

中身は「プログラミングで比例代表選挙で選ばれた候補者の数を政党別に出そう」です。

比例代表が何なのか、どうやって決まるのかということについては総合科目試験ではないのでちゃんと説明してあります。

で、まあお題はいいとして、めっちゃキモいのはその中身
まあまずは見てみてください(行数は省略してあります、あと処理の意味がわからなければPDFの問題を見ながらこの記事を読んでいただければと思います)。

Tomei = ["A党","B党","C党","D党"]
Tokuhyo = [1200,660,1440,180]
sousuu = 0
giseki = 6
mを0から「 ア 」まで1ずつ増やしながら繰り返す:
┗sousuu = sousuu + Tokuhyo[m]
kizyunsuu = sousuu / giseki
表示する("基準得票数:",kizyunsuu)
表示する("比例配分")
mを0から「 ア 」まで1ずつ増やしながら繰り返す:
┗表示する(Tomei[m],":",「 イ 」 / 「 ウ 」)

(https://www.yomiuri.co.jp/media/2021/03/jouhou.pdfより引用)

もうなんかいろいろ突っ込みたいところがすでにあります。
まず、変数の命名規則が死ぬほど気持ち悪い。絶望的に気持ち悪いです。
変数を宣言する必要がなくて、配列の変数を大文字、普通の変数を小文字にするプログラミング言語は僕が知らないだけで存在するのかもしれませんが、それより変数の名前がすごいキモいです。

変数名を英語にしなかったのは英語を理解するリソースを消費させたくないから、というのは同意します。しかして変数命名のセンスが壊滅的
コメントもないし後から見返してなんの数字かすぐ分かるんですかね、作者さん。

あと個人的には「党名」は英語寄りの発音になる「Tomei」なのに、「基準数」は「kizyunsuu」でいきなり訓令式になるのがとても理解に苦しみます。超キモいです。
プログラミングができなくてもローマ字の基礎教養があれば「うわきも」ってなるとおもいます。マジで。

ようやく問題に移れますが、ここは共通テストなのでもちろん選択式です。
ア~ウの選択肢はこちら。

[0] 0 [1] 1 [2] 2 [3] 3 [4] 4 [5] 5 [6] 6 [7] Tomei[m]
[8] Tokuhyo[m] [9] sousuu [a] giseki [b] kizyunsuu

イとウは何がしたいか分かると思うので説明を省きますが、問題はアです。
ここでもう一度コードを見てみましょう。

mを0から「 ア 」まで1ずつ増やしながら繰り返す:
┗sousuu = sousuu + Tokuhyo[m]

これはつまり「票の総数をあらわす変数sousuuに各党の票が格納されている配列Tokuhyoの中身をひとつずつ参照して、sousuuに加算する」という処理です。
ちなみに選択肢に「Tokuhyoの長さ」やそれっぽいものは存在しないので、答えは定数になります。

答えは、定数に、なります。

おもわずつい「ええ・・・・・・・・・・・・・・・・・」って言ってしまいました。そりゃ政党はそんなにすごいスピードで増えたり減ったりはしませんが、定数にしたら党の数が変わった時確実にバグりますよね。
単にループする回数を聞きたいのであればほかに出し方があったでしょうに…

私が(素人ながらに)おそらく一番習熟してるのはJavaScriptなのですが、JavaScriptであれば配列の長さを取得できるlengthという基本的なプロパティがあります。
例えばToumei.lengthは4になります。

lengthと書くことで「ぐわあああ英語だああ」ってなるのが怖いなら「注:Toumei.lengthは配列Toumeiの長さを表す。」と注釈をつければいいし、第一英単語見て苦しむぐらいだと、少なくとも2021年にプログラミングに挑戦したら精神が崩壊すること間違いなしだと思います。

あるいは「Toumeiの長さ」という感じに日本語で記述しても問題ないと思います。これは流石にひどいですね…

それとついでに言いたいのは、共通テストの世界では加算代入は存在しないのかということですね。この後も加算代入は出てきません。大変読みにくいです。

ついでにこの後に会話があるのですが、これも無茶苦茶です。何を言ってるんだお前らはって状態になりました。これを実行した結果、小数点以下の値が発生してそれをいい感じに枠内で振り分けることができないのは明確でしょうに。(個人的には小数点以下のみを求めてなんやかんやして人数を揃えるプログラムを作らせたらいいと思ったのは内緒です)

正直問1の愚痴を書くだけで十分ヤバさが伝わったと思いますが、次に問2に行きます。
ここでは配列がさらに2つ追加されます。めんどくさい。
以下は問2の解答部分そのままです。同じくPDFから引用しました。

画像1

変化する配列の値を手動で考えて書き込んで確認しようぜ!っていう問題です。基本情報技術者試験とかでもこういうのは出ると思います。多分。

ちなみにこれ超ボーナス問題です。なぜかといえば、この理想の処理で配列の値が二つ同時に変わることはありえないので、オとクで値が変化し、さらにオ=カ=キになることもわかります。更に検算し放題です。考え方にエラーがあれば見てわかります。

次に問3に行ってみましょう。この問題では「切り捨て()」という関数が唐突に登場します。でもこれは関数の意味がわかっていれば特に問題なさそうですね。

ここでコードを読むと、これまた突然変数maxが登場します。
おい待てコラ。さっきまでローマ字だったじゃないか…たまげたなぁ…
ほかにもtosenkei、maxiという変数がなんの説明もなしに突然登場します。すげー不親切。
それとHikakuにTokuhyoを1個ずつ入れてる作業も無駄です。
Hikaku = Tokuhyoじゃダメなんですか…

【画像消失箇所】

さて選択肢ですが、セは唐突に出てきたtosenkeiの意味が読み解ければ簡単です。
ソもmaxの変数を使ってしたいことがわかれば問題ないと思います。
まあただやはりJavaScriptに慣れているので、この処理を自分が組んだとしたら「配列の最大値分かる方法ねーかな」ってググりますけどね(ちなみにmax()とかArray.reduceでできるっぽいですが、なんか意外とめんどくさそうなのでもし気になったら各自で調べてください)

あるいは関数を都合よく作れるのであれば「配列の最大値」もつくってほしかったですけどね…
タ/チもまあここまでの流れをみれば何がしたいのかは自明です。分母で引っかけようとしてるのは大変わかりやすいですし、ぶっちゃけ読解問題ですね。

最後にオマケで候補者が足りなくなったら、ということを想定して条件分岐と配列(またかよ)を追加で作成します。

もし max < Hikaku[i] 「 ツ 」 「 テ 」ならば:

この問題の選択肢も突っ込みどころがあります。

ツの回答群
[0]and [1]or [2]not

失笑しました。何故かここにnotをぶち込んでくるとは

ここでnot選ぶやつは絶対勉強してないか僕が知らない特殊な構文を使おうとしているかのどっちかです。

二つの条件式をつなぐ基本的な論理演算子は「論理積(and)」「論理和(or)」です。
「論理否定(not)」は一つ以上の条件式を否定したいときに使いますが、二つの条件式をつなぐ使い方はできないし、そもそもそんな発想が無いことはここまで読んでくださっている方なら分かっていると思います。

引掛けで出すとしても「否定論理積(nand)」「否定論理和(nor)」「排他的論理和(xor)」「否定排他的論理和(xnor)」とかにすればよかったんじゃないんですかね・・・とおもっています。

それがわかればあとはまあ…分かると思います!

まとめ(感想)

一度解いてみましたが、非常に疲れました。
非効率的なコードを読むことがこんなにしんどいとは思っても見ませんでした…

しかし同時に「基本的なメソッドやプロパティは積極的に使おう」とおもえたいいきっかけにもなりました。

あと個人的にはとにかく配列を作りまくってるのが死ぬほど気持ちが悪いとおもいました。終始「君等オブジェクトって知ってる?」って感じでした。

私は低級言語の知識を持っていないので、もしかしたら配列を大量に作りまくることは普通なのかもしれませんが、オブジェクト指向に慣れるとこういうコード書くやつをぶっ飛ばしたくなります。ええ。

僕だってオブジェクト指向のプログラミングに関してはあまり手を付けたことがないですが、一つの党に対して「党名、得票数、所属人数、当選者数(あと比較用の数値)」とここまで要素が多いのであれば配列ではなく(そもそも配列を使うにしてももっと変数名をわかりやすく書くように努力するべき)最近流行りのPythonをちょっと拝借してタプルを使ってみたり、オブジェクトをnewすればいいと思うんですけどね…

ということで以上問題を完走した感想でした(激ウマギャグ)。
まだこれは試作段階のものなので、改善に期待します。
また機会があれば。

余談

ちなみに筆者が解いたときはケアレスミスでウを間違えましたが全部あっていました。
プログラミングを実際にした経験があればこの程度余裕っぽいですね、基本情報のPythonの例題みたいに三角関数が説明なしに登場したりしませんし…

応用力や思考力を問う試験であれば、この中に読解や数学の要素をもう少し盛り込んでもいいように思います。
しかしそれを科目ごとの力を測る共通テストでやってしまうと対策が面倒になってしまうので、二次試験などでうまく取り入れてほしいですね!

noteのサポートは投げ銭のようなもので、月額ではなく一度のみ課金されます。 この記事が役に立った、面白いと感じてくださった場合に、サポートしていただけると大変励みになります。