Kさんの住む町では,駅前の交差点で信号を待つ車の列が長く伸び,手前の横断歩道や商店の出入口をふさいでしまうことがたびたびある。情報の授業の課題研究でこの問題を取り上げたKさんは,信号の赤と青の長さを変えると列の長さがどのように変わるかを,車の台数を数えた記録とプログラムを使って調べることにした。
Kさんは,ある平日の朝の8分間,交差点に向かう一方の車線で,1分ごとに交差点に着いた車の台数を数えた。この車線の信号は,1分ごとに赤か青のどちらかになっていた。Kさんは,信号の手前で止まって待っている車の台数(以下,待ち台数と呼ぶ。)が1分ごとにどう変わるかを,次の規則1・規則2の順に考えることにした。
1分目の初めには,待っている車はなかった。表1は,記録した8分間の信号の色と来た台数,および規則1・規則2によって求めた結果をまとめたものである。
| 1分目 | 2分目 | 3分目 | 4分目 | 5分目 | 6分目 | 7分目 | 8分目 | |
|---|---|---|---|---|---|---|---|---|
| 信号の色 | 赤 | 赤 | 青 | 青 | 赤 | 赤 | 青 | 青 |
| 来た台数 | 2 | 3 | 4 | 0 | 3 | 4 | 2 | 2 |
| 通過した台数 | 0 | 0 | 5 | 4 | 0 | 0 | ? | ? |
| その1分間の終わりの待ち台数 | 2 | 5 | 4 | 0 | 3 | ア | イ | ウ |
(表の一部を“?”で隠してある)
1分目と2分目は赤なので,来た車はそのまま列に加わり,2分目の終わりの待ち台数は5台となる。3分目は青で,規則1により待ち台数は9台になるが,通過できるのは上限の5台までなので4台が残る。4分目は来た車がなく,残っていた4台がすべて通過して待ち台数は0になる。同じように考えると,その1分間の終わりの待ち台数は,6分目がア台,7分目がイ台,8分目がウ台である。
この結果からKさんは,信号が青の1分間の終わりの待ち台数は,「規則1の後の待ち台数から上限を引いた値」と「0」のエに等しいことに気づいた。
次にKさんは,問1の規則1・規則2に従って,1分ごとの待ち台数と,8分間で最も多かった待ち台数を表示するプログラムを作成した(図1)。
(01)行目の変数 jougen は1分間に通過できる台数の上限を表す。配列 Kuru には各分に来た台数を,配列 Shingou には各分の信号の色を,赤を0,青を1として格納する。配列の添字は1から始まり,何分目かを表す。例えば,Kuru[3] の値は3分目に来た台数4であり,Shingou[3] の値は3分目が青であることを表す1である。(04)行目では関数「要素数」を用いて,変数 n に記録した分の数を代入する。変数 machi は待ち台数を,変数 saidai はそれまでで最も多い待ち台数を表し,(05)・(06)行目でどちらにも0を代入する。
Z が [6, 1, 9] のとき,要素数(Z)は3となる。(07)〜(13)行目の繰り返しで,i 分目について規則1と規則2を順に行う。(08)行目で規則1を行い,(09)〜(11)行目で規則2を行う。信号が青の分だけ,(10)行目で関数「最小値」を用いてその分に通過する台数を求めて変数 tsuuka に代入し,(11)行目でその台数を待ち台数から減らす。(12)行目では関数「最大値」を用いて saidai を更新し,(13)行目でその分の終わりの待ち台数を表示する。繰り返しが終わった後,(14)行目で最も多かった待ち台数を表示する。
図1のプログラムを実行すると,最初の8行の表示はいずれも表1のその1分間の終わりの待ち台数と一致し,最後の行には,表1の中で最も多い待ち台数が表示された。
Kさんは,図1の結果を先生に見せた。
Kさんは,1周期の中での位置を,周期の初めの分を0として0,1,2,3と数え,位置が赤の長さ以上の分を青とした。例えば赤2分のときは,1分目・2分目が位置0・1で赤,3分目・4分目が位置2・3で青,5分目は再び位置0で赤となる。なお,「÷」は割り算の商を,「%」は割り算の余りを表す。例えば 7 ÷ 4 は1,7 % 4 は3となる。
Kさんは,上限を5台として,赤の長さを1分から3分まで1分ずつ変えたときの,8分間で最も多い待ち台数を求めるプログラムを作成した(図2)。変数 shuuki は周期の長さを,変数 aka は赤の長さを表す。(07)・(09)・(10)行目は図1の(08)・(10)・(11)行目と同じ処理であり,(08)行目では,i 分目の周期の中での位置が赤の長さ以上かどうかで青かどうかを判定する。最も多い待ち台数は,待ち台数がそれまでの最多を上回ったときだけ(12)行目で更新する。
(図2の⓪は(04)行目と(05)行目の間,①は(05)行目と(06)行目の間,②は(06)行目と(07)行目の間,③は(12)行目と(13)行目の間で(06)行目からの繰り返しの外側を表す。)
図2には,変数 machi と saidai に最初の値を代入する処理が抜けていた。そこでKさんは,「machi = 0」と「saidai = 0」の2行を図2のシの位置に加えた。このプログラムを実行すると,図3の結果が得られた。
図3から,赤を1分にすれば,この朝の車の台数なら列は6台を超えないことがわかった。
さらにKさんは,雨で車の流れが遅くなり,1分間に通過できる台数が3台に減った場合を考えた。図1のプログラムの(01)行目を「jougen = 3」に変更して実行すると,最後の行に「最も多いとき:スセ台」と表示される。