[画像のクリックで拡大表示]

図1 競技部門の決勝戦で実際に出た問題。(a)10個の立体が出題される。(b)立体から展開図を作り,11×11のマス目に,重ならないようにすき間なく敷き詰めていく
[画像のクリックで拡大表示]

図2 競技部門の模様。ホールの舞台上に参加チームが並ぶ。後方の大スクリーンには,各チームの動作画面,問題,現在の順位などが表示される
[画像のクリックで拡大表示]

図3 競技部門で準優勝だった新居浜高専の競技プログラム「でめじら~」が,展開図の敷き詰めを実行しているところ。立体の入力,展開,敷き詰めを一つのプログラムで実行する。プログラムがよりよい解を発見すると画面の表示を更新する
[画像のクリックで拡大表示]

図4 大阪府立高専が競技部門で優勝を決めた瞬間。舞台後ろの大スクリーンに表示された最終的な順位で優勝を確認,思わずガッツ・ポーズ
[画像のクリックで拡大表示]

 2003年10月,第14回プログラミングコンテスト(通称:プロコン)が開催されました。全国の高等専門学校の学生が,定められた問題を指定時間内に解く競技部門,ある課題に沿ったプログラムを作成する課題部門,自由な発想でプログラムを作成する自由部門の3部門に挑戦します。

 今年の舞台は東京都八王子市の「いちょうホール」。昨年に引き続き,私,行って来ました。参加されたみなさんのレベルの高さや若者らしい着想や独創性で,大いに楽しませてもらいました。普段お仕事でプログラミングされている皆さんも,学生たちのプログラミングに対する意識と情熱をちょっとのぞいてみてはいかがでしょうか。

競技部門
出たとこ勝負が効かない知力戦

 今年の競技部門はまさに知力の勝負でしたね。昨年はちょっと体育祭ノリというか,出たとこ勝負のゲームのようなところがあったんですが,今回の競技はそれで乗り切れるものではありませんでした。勝ち上がったのは,事前にしっかり戦略を立てて,とことんプログラムを詰めてきたチーム。予行演習はボロボロだったけれども,一夜漬けの改良のおかげで本番は奇跡の復活を遂げたというようなことは,今回は起こりませんでした。そういう意味で,実力が素直に出るいい競技でした。上位に入賞したチームは,文句なくレベルが高かった人だと思います。

いかにすき間なくマス目を埋めるか?

 といっても,見ていない方にはわけがわからないですよね。今年の競技部門,内容はこういうものでした。

 ゲームのスタートとともに,立方体を組み合わせた立体図形がいくつか出題されます(図1[拡大表示])。これを一つずつ二次元に展開して,出題と同時に用意されるマス目のスペースに敷き詰めていきます。10分間の制限時間の間にできるだけマス目にすき間ができないように,展開図同士が重ならないように,敷き詰めることができたチームの勝ち。点数は埋まったマス目の数で決まり,同点ならより速い時間に解答したチームの勝ちです。出題される立体は箱形に閉じているとは限りません。底や側面に穴が開いている場合があります。

 問題はチームのブースに設置されたノート・パソコン上で出されます。出場チームは3人編成で,最大2台のノート・パソコンを持ち込むことができます。持ち込んだ2台をLANで接続することは可能ですが,インターネット接続やリモート・アクセスによる外部のネットワークへの接続は許されてはいません。

 出場チームは全部で55校。1回戦は8チームで争われて上位4チームが2回戦に進出します。敗者復活戦により4チームが2回戦に加わり,2回戦は8チーム中上位2チームが選ばれて,決勝戦を戦います。

 解答は,極論すれば出題用のコンピュータだけで行うことが可能です。立体図形をくるくる回転させながら切り開く辺を指定して展開図を作成,それをマス目スペースに置いて「決定」とすればいいんですから。しかし,マス目にすき間なく埋めようとすれば,考えられるあらゆるパターンの中から最良の展開図を選択する必要があります。敷き詰め方もまたしかり。それを考えるサポートにチームで自作するプログラムが大いに活躍する余地ありというわけです。

 プログラム開発上のポイントは,大きく三つあると思いました。(1)出題された立体図形をプログラムにどうすばやく入力するか,(2)立体図形の最良の展開図をどのように導き出すか,(3)展開図の最良の配置の解をどう導き出すか——です。これらの考え方にチームそれぞれの戦略や個性が反映されて,最終的に参加校55通りのプログラムが完成したのです。

解答の美しさに会場から思わず吐息

 試合は大きなホールの舞台上で行われました。8チーム分のブース(といってもテープで床に線が描かれているだけなんですが)があって,チームのメンバーはその中にあるテーブルに陣取ります。競技のスタートが宣言されると,後方の三つの大スクリーンの中央に問題が映ります(図2[拡大表示])。試合中,ホスト校である東京高専の学生たちがビデオカメラを持って動きまわり,問題を解く学生たちの様子や開発したプログラムを撮影します。その様子が左側のスクリーンに映ります。他方,右側のスクリーンには競技チームが解答を解答サーバーに送って獲得した得点情報が映ります。観戦者はこれら三つのスクリーンを見比べながら,競技の進行状況を知り,勝利の行方を見守るというわけです。

 1回戦の問題で与えられたのは8個の立体図形と100個のマス目,2回戦は少し複雑さを増した9個の立体図形と110個のマス目。進みゆく試合の中で,最初から高得点で群を抜いていたのは,大阪府立高専と新居浜高専の2校でした。

 各試合のクライマックスは,展開図がマス目に配置されていくところなんですが,この2校の配置の様子がスクリーンに映し出されると,会場から“ほーっ”と吐息がもれるんですよ。凹凸のある不規則な形をした展開図が,まるでジグソーパズルのようにピタッ,ピタッとマス目を埋めていきます。残るのはほんのわずかなすき間。見ていて私はゲームというより,数学的な美を感じてしまいました。

 特に,ちらちらっとスクリーンに映る新居浜高専のプログラムがすごく興味をそそります(図3[拡大表示])。展開図をどうマス目に置くかをシミュレーションしているんでしょうか。画面がよく動いていて,“おー,コンピュートしている”という感じでした。

明暗を分けたのは解答入力のタイミング

 決勝戦も事実上,大阪府立と新居浜の一騎打ちでした。試合時間は12分,10個の立体図形を121のマス目に埋めます。このように図形の数,その展開パターン,マス目の数が増えてくると,順列組み合わせの数が天文学的になってくるので,人の勘ではもう間に合いません,まさにプログラムの優劣がカギを握ります。

 静かに試合は進み,残り時間があと4分というところで,大阪府立高専が121個のマス目中118個をマーク。マス目はたった三つしか残っていません。思わず会場から拍手が沸きました。それに遅れること約1分,新居浜高専も同じく118個を獲得します。そこから試合終了までは,新居浜高専がよりよい解を見つけて逆転するかどうかが焦点となりました。が,惜しくもタイムリミット。時間差で優勝は大阪府立高専チームの頭上に輝きました(図4[拡大表示])。