Column 18年11月 これまでの大学入試に見る「プログラミング」の出題(2)

これまでの大学入試でも、ごく一部では「プログラミング」が出題されてきました。過去に出題された問題の中から、取り組むべき問題、取り組む価値のある問題を紹介します。
今回は2018年度慶應義塾大学の問題です。前々回で紹介した慶應義塾大学の問題と同じ年に出題されたものです。

「頻出問題」

本問の題材は「ライントレース」です。「ロボット」のプログラミングではよく見かけるものであり、決して目新しいものではありません。理科に例えるならば、「どの教科書にも登場するような有名な実験が入試のテーマとして取り上げられた」といったイメージです。しかしそれでも、選抜問題として十分に機能したのではないかと考えています。そしてこの問題は、どの教科にも共通する「学習の仕方」を示唆しているように思えてなりません。 以下、問題文と解説を掲載しました。少々長い問題ですが、最初の図のあたりまででも読んでみてください。

2018年度 慶應義塾大学

車両型ロボットに関する次の文章を読み、空欄(56)から(63)にあてはまるものを選択肢から選び、その番号をそれぞれの解答欄にマークしなさい。

車両型ロボットには車輪が左右に1つずつついており、個別に車輪の回転の向きを制御できる。このとき、車輪の回転速度は前転時、後転時それぞれ一定になるように設定し、前転時の速度は後転時より速いものとする。また、この2つの車輪の他に補助輪が適切についており、ロボットは水平に保たれ、滑らかに移動できるものとする。このロボットを、白い床の上に引かれた黒い線に沿って移動するように制御したい。ただし、ロボットのタイヤ間の距離は40mm、線幅は15mmとする。  線を認識するために、ロボットにはフォトリフレクタ(反射型光センサ)を床に向けて装着する。このセンサは、LEDから真下に光を照射し、床に当たって反射してきた光の強度をセンサで読み取るものである。床面が黒いと光が吸収されるためにセンサ入力値が小さくなり、白い場合には光の吸収率が低いためにセンサ入力値は大きくなる。

上のようなロボットの移動を、以下のようなルールで制御することにした。

ルール1 センサ入力値がしきい値未満の場合には右の車輪を前転、左の車輪を後転させる
ルール2 センサ入力値がしきい値以上の場合には左の車輪を前転、右の車輪を後転させる

このルールでロボットが線に沿って進むようにするためには、次図のA~Cの点の中でロボットに対するフォトリフレクタの取り付け位置として最も適切な箇所は(56)となる。また初期位置として、ロボットは進行方向に向けて、フォトリフレクタが線の(57)の位置に来るように配置することが望ましい。

【(56)の選択肢】 (1)A  (2)B  (3)C
【(57)の選択肢】 (1)左端 (2)中央 (3)右端

また、このルールや配置に則ると、次図のようなコースをスタート地点からフォトリフレクタが線の(57)の位置にくるように配置して走らせた場合、(58)に最初に到着することが期待される。

【(58)の選択肢】  (1)A  (2)B  (3)C (4)D

コース中のいくつかの場所で、ライン上とライン外にセンサを置いた際の、センサの入力値を調べた。
照明の影響や床の色の具合もあり、次の表のようになった。

ライン外 ライン上
地点1 208 51
地点2 232 85
地点3 133 20
地点4 105 5
地点5 255 92

この表より、ルール1およびルール2のしきい値としては、(59)を用いるのが適切である。

【(59)の選択肢】  (1)80 (2)90 (3)100 (4)110 (5)120

次に、下図のようなコースを8の字を描くような順路で前向きに走行するロボットを作るために、センサを2つに増やし、それらを30mmの間隔を開けて左右に並べて配置した。

2つのセンサが線をまたぐようにロボットを配置し、以後制御のために4つのルールに則ってロボットの振る舞いを変える。それぞれのルールは次のとおりである。

ルール1 両方のセンサ入力値がしきい値以上の場合、(60)
ルール2 右側のセンサ入力値のみがしきい値未満の場合、(61)
ルール3 左側のセンサ入力値のみがしきい値未満の場合、(62)
ルール4 両方のセンサ入力値がしきい値未満の場合、(63)

【(60)~(63)の選択肢】
(1)両輪とも前転
(2)両輪とも後転
(3)右輪は前転、左輪は後転
(4)左輪は前転、右輪は後転
(5)右輪のみ後転
(6)左輪のみ後転

●マインドストームを使っていれば……!

この問題を見たときに、Z会のプログラミング講座担当は「マインドストームじゃん」とつぶやいていました。本問はロボット制御でよく題材となる「ライントレース」がテーマで、Z会プログラミング講座 with LEGO® Education 発展編でも Vol.4で扱っています。

それでは、例えばZ会プログラミング講座などでライントレースを扱った経験は、本問を解く際に有利に働くのでしょうか?

もちろん、「イメージしやすくなる」という点は有利です。しかし与えられた条件を丁寧に読み解けば、ライントレースの経験の有無を問わず十分に解答可能な問題といえます。それ以上に、「ライントレース」は、本学を教科「情報」で受験する生徒であれば、おそらく一度は目にしたことがあろうほど有名な題材です。試験場でこの問題を目にした受験生の反応は「ああ、ライントレースだな」であったことでしょう。誰もがよく知っている題材が入試で出題されたに過ぎません。

むしろこの問題は、大学が求める「思考力」とは何かを考えるヒントになるのではないでしょうか。ライントレースの経験者にとっても、本問には「目新しさ」があります。分岐のあるコースや八の字のコースなどは、どのようなプログラムを作成するのかによって進路が変わってきます。そのため、「ライントレースのやり方」を覚えていたとしても、本問に正解することはできません。与えられた条件を読んで考える必要があります。一方、ライントレースの未経験者でも、与えられた条件をもとに「考える」ことで正解を導くことができます。その思考は、場合によっては小学生にでも理解できるものかもしれませんが、これだけの分量の情報を整理しながら読み解くことは決して易しいことではありません。いわゆる「プログラミング的思考」を問う問題の大学入試版であると考えてよいでしょう。

●この問題を解いてみよう!

お時間があればぜひ、この問題に挑戦してみてください。言葉づかいや分量の多さといった難しさがあるものの、小学生でも十分に取り組めるものです。なお、以下は問題の解答・解説ですので、ここは読み飛ばしていただいても結構です。

まず、前提を確認しよう

ライントレースを経験したことがある人であれば、問題文を読んだ段階で次の写真のようなイメージを持つことができるはずです。

タイヤ間の距離よりも細い線に沿って移動させたい。タイヤは、左右それぞれが独立に動く。線を認識するために、フォトリフレクタ(マインドストーム® EV3では『カラーセンサー』)を取りつけている。もちろんこの写真のロボットは、「タイヤ間の距離が40mm」ではありませんし、線の色も黒くありません。それでも、まずは状況をイメージできるかどうかは重要な要素です。なお、問題文の指定通りに図を描くと次のようになります。

ルールを確認しよう

問題文からこのロボットはどのように動くか、想像がつくでしょうか。ライントレースの経験の有無は、ここで「動きを想像できるか」という点に関係してくるかもしれません。

ルールによれば 「センサ入力値がしきい値未満」の場合、「右の車輪を前転、左の車輪を後転」とあります。床面が黒いとセンサ入力値は小さくなるのですから、この場合は「床面が黒い」ときのことを言っています。右の車輪を前転、左の車輪を後転させると、車全体は反時計回りの方向に回転します。前転のほうがパワーが強いので、車は左前の方向に進むことがわかります。

では、「しきい値以上=床面が白」のときはどうか。「左が前転、右が後転」なので、全体としては右斜め前に進むことがわかります。

つまりこのロボットは、黒い線の上では左前に進み、床面が白くなった=線から外れたら、黒い線の上に戻るように右前に進むという動き方をすることがわかりました。それでは、フォトリフレクタはどこに取りつければよいのでしょうか。また、一番最初にロボットをどこに置けばよいのでしょうか。

フォトリフレクタの取りつけ位置とロボットの配置

ロボットの前方に取りつけた場合とタイヤの間に取りつけた場合を図にしてみました。どちらの場合も「黒い線に沿って」進むことはできるでしょうが、後方に置いた場合はロボットの先端が線からはみ出してしまいます。そうなのだとすれば、上の図の左側、ロボットの先端に取りつけるべきと考えられます。(つまり、(56)はAです)

次に、ロボットを最初にどこに配置するかを考えましょう。フォトリフレクタが線の左端にある場合と中央にある場合を図にしました。見ての通り、左端にあれば左前に進んだときに線から外れるため、次の動きは「右前に進む」となります。しかし中央にある場合、一度左前に進んでもフォトリフレクタが少しの間線の上にあるため、車体が傾いた状態で走り始めることになります。このことはフォトリフレクタが右端にあっても同じことがいえますし、右端にある場合は最悪の場合、時計回りに回転してしまうことも考えられます。つまり、フォトリフレクタが線の左端に来るようにロボットを配置するのが好ましいといえるでしょう。(つまり、(57)は(1)の「左端」です)

このように、本問のルールに従ってライントレースをすると、ロボットは「黒い線の左端をたどっていく」動きをすることになります。黒い線が枝分かれしていても、黒い線の左端に沿って進んでいくこともわかります。(つまり、(58)はAです)

「しきい値」を決めよう 「しきい値」という言葉になじみのない方もいらっしゃるかもしれません。工学ではよく目にする言葉で、Z会プログラミング講座では次のように説明しています。
境目の値、ギリギリの値

つまり、「しきい値」を50とすれば、「50より大きいか、小さいか」で判断されるということです。本問であれば、「左前に進むか、右前に進むか」の判断の境目になる数字が「しきい値」です。

このことがわかっていれば、本問の際のしきい値は黒と判断される最大値より大きく、白と判断される最小値より小さい値でなければならないことがわかるでしょう(白のほうが値が大きいことを思い出してください)。つまり、(59)に当てはまる数字は、105より小さく、92より大きな数だといえます。選択肢の中では(3)の100が適切な値とわかります。

8の字のコース

さて、最後に、「8の字」のコースを回るべく、フォトリフレクタを左右に配置して新たなルールを作ることになりました。問題文で示されているこのコース、
2本のコースは直角に交わっている(交差点と呼びましょう)
交わっている部分のコースは直線である
ことに気づいたでしょうか。

このとき、ロボットと黒い線の位置関係は、次の4パターンが考えられます。
A. ロボットが直線上にある(フォトリフレクタは線をまたいでいる) → まっすぐ進みたい

B.ロボットが交差点にある(フォトリフレクタは交差する直線の上にある) → まっすぐ進みたい

C.ロボットが左カーブ上にある(フォトリフレクタは左のみ黒い線の上にある) → 左に曲がりたい

D.ロボットが右カーブ上にある(フォトリフレクタは右のみ黒い線の上にある) → 右に曲がりたい

こうしたことは、コースを2本の指でたどってみればみえてくるはずです。あとは、「左に曲がる」→左は後転右は前転、「黒い線の上にある」→しきい値未満、などと言葉を直していく作業が待っています。(つまり、(60)はA.の状態なので(1)の『両輪とも前転』、(61)はD.の状態なので(4)の『左は前転右は後転』、(62)はC.の状態なので(3)の『右は前転左は後転』、(63)はB.の状態なので(1)の『両輪とも前転』だとわかります)

●この問題から「学ぶこと」

本問で問われていること自体は決して難しくありません。しかしそれでも難しさを感じるのは、
状況をイメージしにくい
「車輪の回転の仕方」と「進み方」を置き換えて考える必要がある
「フォトリフレクタの値」と「黒白」を置き換えて考える必要がある
という点があるからでしょう。面倒がらずに図示をする、置き換えて読むところは面倒がらずに書き込んでいく、といったことが必要な問題です。

また、ライントレースを経験したことがあるという安心感から深く考えずに読み進めてしまった人もいるかもしれません。あるいは、ライントレースをする「方法」は知っていても、その原理を深く考えずに取り組んでいた人は苦労したかもしれません。「やり方」を覚えることを学習であると考えていると、本問は「自分のやり方が通用しない問題」となってしまいます。普段から「なぜこうなるのか」「なぜこのような設定をするのか」を考えながら取り組む必要があることを改めて思い知らされる問題だといえるでしょう。

このことは、算数や数学、物理の問題で「設定は有名だがちょっとひねられると手が出ない問題」の勉強法とも似ています。教科の枠を飛び越え、情報を整理してその対応策を考えるといった、実社会でも必要な能力を身につけることにもつながっています。

●小学校から大学入試まで

これまで、小学校の学習指導要領での「プログラミング教育必修化」から始まり、中学校でのプログラミング教育、高校でのプログラミング教育、そして来る大学入試での「プログラミング」について考えてきました。「プログラミング教育」という言葉からは「技術の指導」というニュアンスがどうしてもぬぐい去れませんが、大切なのはプログラミングをテーマに物事を考えさせるということだといえるでしょう。つまり、これまでの教育に「プログラミング」という要素(プログラミングそのものではない)を付け加えることが、今回の「プログラミング教育必修化」の正体なのではないでしょうか。

「プログラミング教育」というテーマでいま、いろいろな人が、いろいろな会社が、いろいろな団体が様々な取り組みをしています。どれかが「正解」でどれかが「不正解」というのではなく、こうした様々な取り組みがどこかで影響し合って、ひとつの方向性になっていくのかもしれません。Z会ではこれからも「様々な取り組み」に注目しつつ、Z会が考える「プログラミング教育」を提供していきます。