このページの本文へ

特別企画@プログラミング+第11回

世界水準「プログラミング部門」の今年の問題も大公開!

日本のITは"部活"が支えている!! パソコン甲子園2016レポート(前篇)

2016年12月12日 17時00分更新

文● MOLOKHEIYA

  • この記事をはてなブックマークに追加
  • 本文印刷

プログラミング部門は世界でもトップクラスの水準

 11月12日(土)と13日(日)の2日間、全国の高校生、高等専門学校生がコンピュータの技術を競い合う「パソコン甲子園2016」(全国高等学校パソコンコンクール)が福島県の会津大学で開催された。14年目となる今年は、「プログラミング部門」に43都道府県から642チーム1,284名、「モバイル部門」に15道府県から30チーム78名が応募、予選を勝ち抜いた32組70名が会津大学で開催された本戦でグランプリを争った。

 会津大学といえば、日本初のコンピューターサイエンスに特化した大学として1993年に開校。会津には同大学出身者たちのベンチャー企業もあり、会津藩の伝統とベンチャースピリットがどことなくシックリくるというお土地柄。そんな会津大学へは、東京駅から新幹線と磐越西線を乗り継いで2時間、道中、観光客にまじって明らかにパソコン甲子園参加者と思われる子供たちを見かけて和む。

 今回、“全編”としてお伝えする「プログラミング部門」は、一般に「競技プログラミング」と呼ばれているものだ。ACM(米国計算機学会)主催のICPCなど大学生のコンテストなどが有名だが、実際にご覧になったことのある方は多くはないだろう。全国から集まった高校生競技プログラマーたちが、どのようにしのぎを削ったのか? その様子を会場にいる気分でご覧いただきたい。

プログラマーのあなたも時間以内に解けるだろうか? かなり手ごわい問題も

 高校生のプログラミングと聞いて、「どうせ子供たちでしょ」と思ったあなた! どんなレベルの問題に彼らがチャレンジしているかは、実際に出題された問題をご覧になっていただくのがいいと思う。次の表は今年出題された問題の一覧だ。

パソコン甲子園2016「プログラミング部門」の問題一覧(パソコン甲子園公式ページより)

 ご覧のように出題されたのは合計12問。問題の種類や難易度も幅広く、習熟度の高低に関わらず解きごたえのある良い問題が揃っている。最もむずかしい問題は正解すると11点与えられるが、正答率もぐっと少なくなっている。より詳しく知りたい人は公式ページに過去の問題と解説が掲載されているのでご覧になっていただきたい(パソコン甲子園「過去問」)。ここでは、最も易しいレベルの問題と、もっとも難易度の高いレベルの問題からそれぞれ1つを以下に紹介しておこう。

問題1 長方形

 アイヅ放送協会の教育番組(AHK教育)では、子ども向けの工作番組「あそんでつくろ」を放送しています。今日は棒で長方形を作る回ですが、用意した4本の棒を使って長方形ができるかを確かめたいと思います。ただし、棒は切ったり折ったりしてはいけません。

【課題】

  4本の棒の長さが与えられるので、それらすべてを辺とする長方形が作れるかどうか判定するプログラムを作成せよ。

【入力】

  入力は以下の形式で与えられる。

e1 e2 e3 e4

  入力は1行からなり、各棒の長さを表す整数ei(1≦ei≦100)が与えられる。

【出力】

  長方形を作成できる場合には「yes」を、作成できない場合には「no」を出力する。ただし、正方形は長方形の一種なので、正方形の場合でも「yes」と出力する。

【入出力例】

   入力例1      出力例1   
1 1 3 4no
   入力例2      出力例2   
    1 1 2 2    yes
   入力例3      出力例3   
   2 1 1 2    yes
   入力例4      出力例4   
    4 4 4 10     no

問題12 夕暮れ

  AIZU 国の夕暮れ時は、スマートフォンを西の空へ構えて立ち止まる観光客で賑わう。AIZU国は無数のビルが建ち並ぶ大都市であり、ビルの谷間が長く連なる西の空には、ビルのシルエットとそれらから漏れ出す太陽の光による絶景が広がる。AIZU観光協会の若松氏によると、太陽を表す円が、その面積のちょうど半分だけ遮られているとき、格段の絶景になるという。

  図のように、西の空を、地平線をx軸、太陽の中心の軌跡をy軸とするような x-y平面で表し、太陽を半径Rの円、それぞれのビルのシルエットを長方形とする。

  各ビルのシルエットの底辺はx軸上にあり、太陽は十分高い位置から地平線に対して垂直に沈んでいく。太陽はビルのシルエットあるいは地平線を上端とする地面に遮られ、やがて地平線の下へ消えてゆく。

【課題】

  太陽の半径と各ビルのシルエットの情報が与えられたとき、太陽の面積のちょうど半分が遮られるような、最も高い太陽の高さ(中心のy座標)を求めるプログラムを作成せよ。

【入力】

  入力は以下の形式で与えられる。

  1行目にビルの数 N(0≦N≦100)と太陽を表す円の半径 R(1≦R≦100)が与えられる。続く N 行に i番目のビルのシルエットの左下角の x 座標 xi(-100≦xi≦100,xi<xi+1)、幅 wi(1≦wi≦100)、高さhi(1≦hi≦100)が与えられる。入力はすべて整数で与えられる。

N R
x1 w1 h1
x2 w2 h2
:
xN wN hN

  入力は以下の条件を満たす。

  • ビルのシルエットが重なることはない(xi + wi ≦ xi+1)。
  • 2つの隣接するビルのシルエットの高さの差は、R を超えない。
  • ビルの左側(x 軸の負の方向)または右側(x 軸の正の方向)に隣接するビルがない場合、その高さは R を超えない。

【時間制限】

  入力に対して、実行時間が2秒を超えてはならない。

【出力】

  太陽の高さ(円の中心のy座標)を1行に出力する。ただし、誤差がプラスマイナス

10-6を超えてはならない。この条件を満たせば小数点以下何桁表示してもよい。

【入出力例】

    入力例1        出力例1    
     0 2       0.00000000 
    入力例2         出力例2    
     3 2       1.25065774 
    -2 1 1
    -1 1 2
    0 2 1

 いかがだろうか? これを読まれている方には、プログラミングを仕事にされている人も少なくないと思う。問題1は、誰でも解ける難易度でどれだけ早く、間違いのないプログラムが書けるかだが、問題12には、「どこからどう手をつけようか?」となってしまった人も多いのではないかと思う。これを時間内に解いた高校生チームは、今回1チームあったのだ。

 また、プログラミングといえば、ただ答えを導くだけでなく、いかに「美しく」プログラムを書いたかも重要とされる(プログラミングの世界では数学と同じく“エレガントに”などという)。美しいプログラムほど、間違いがなく、ほかの人が見た場合も誤解がなく、正しい答えを導くことが多いと考えられているからだ。この点に関して、パソコン甲子園の審査員特別賞が、特定の問題おいて最も優れたプログラムを書いたチームに対して与えられることがある。

 それでは、パソコン甲子園2016プログラミング部門のようすをレポートしていこう。

高校生プログラマーの静かなる熱き戦い!

 プログラミング部門の競技が開かれたのは会津大学の講堂。ここに24の席が設置され2人1チームとなり、午後1時45分に公開された問題について、午後5時45分までの4時間をかけて解いていく。チームに1台与えられたコンピュータで、プログラムを作成して提出、審査側で用意されたルールに従って出力され審査される。解いていく順番などは自由だ。

 使用できるプログラミング言語はC、C++、Java。正解すると得点を獲得、不正解の場合も再提出が可能だ。最終的に制限時間4時間の間に獲得した合計得点を競う。難易度によって与えられる得点も変わってくるため、作戦も重要になってくる。また、本選競技と並行して同時間に本選問題にオンライン上で取り組める「もうひとつの本選」が開催された。プログラミング部門の予選に参加したチームがやることができ、予選成績ともうひとつの本選の結果を合わせた総合成績が出される予定だ。

 問題番号が上がるとともに難易度も上がるが、チームの机には正解した問題の得点に応じた風船が結ばれ、また会場正面のスクリーンにリアルタイムで合計点数が表示されるので、観客席から見ていても熱い攻防が伝わってくる。

風船は全12色。最難問は金色の風船だ残り時間と各チームの点数が表示される

 開始直前、4時間の熱戦に向けてぎりぎりまで参考書を読み込むチームや、談笑をするチーム、さらに2人揃って机に突っ伏して仮眠をとるチームもいた。

会場入口には応援メッセージが掲示されていた。

開始直後、5分で1問正解! 驚異のペースでT2がトップ

 午後1時45分、ついに競技開始。競技中は写真撮影NGという中で静かなる戦いが始まった。競技は2人でやるわけだが、一緒に作業するチームと別々に作業するチームに分かれるようだ。別々に作業するチームは、1人はパソコン1人は紙とペンで問題に取り組み、解けたら交代してコーディングしていく。ひたすら1人が解いてもう1人が機械のように打ち込んでいくチームもあった。

相談しながら回答作成完全に分担。別の問題を解く

 開始5分、第1問を正解するチームが出てきた。10分経過し数チームが第2問をクリア。ここまで平均5分で1問正解しているペースとなる。ここから筑波大学附属駒場高等学校のT2が全体的にリードする展開に。開始40分、海陽中等教育学校の海洋++が第1問から順に解くことなく、最初から第8問を正解。高難易度から解いていく作戦か。後の取材で分かったことだが、作戦ではなく事故だったらしい。実はシステムにログインできないというハプニングが起きていて、その間に1人が第8問を解いていたら偶然解けたのだという。運も大事な要素だ。

開始早々タイピング音が響く。みんなめちゃくちゃ速い!

1時間経過! トップはT2とIs。ここでまさかの展開!

 開始1時間、トップは同点でT2と開成高等学校のIs。どちらも簡単な問題から順に解いていくスタイルだ。2位以降の差はまだあまりない。ほとんどのチームが第2問まで正解しているが、3問目に苦戦するチームが多いようだ。開成高等学校のIQ19のみ0問正解。

 1時間40分、それまで1問も正解していなかったIQ19が突然7問正解し、1位タイに。他のチームを油断させる作戦? と会場がざわざわ。急遽7つの風船がつけられるもスタッフが焦り1つが遥か天井へ飛んでいくというハプニングが発生した。それに気を取られている間に更にもう1問を正解、単独1位に。この提出方法は誤答を防ぐための作戦だったという。この大会では同点のチームの順位付けに誤答回数が関わってくる。このチームは1人が一気に問題を解いて、もう1人が間違いがないか確認し、溜まった時点で一気に提出していたのだった。

2時間経過! IQ19がリード

 2時間経過、トップはIQ19。残り時間半分になるも、後半の問題は得点が高いためまだまだわからない。現時点でトップ5は上から順にIQ19、T2、久留米工業高等専門学校のLastDiv、筑波大学附属駒場高等学校のK2、Is。

たくさんの風船がくくりつけられ会場はすっかりカラフルに

 2時間10分、ついにIQ19が第11問を正解。シルバーの風船が登場。残すはあと第9問と第12問。

 2時間30分、2位争いが激しく、次々に順位が入れ替わる。2位争いはIs、T2、K2、海洋++、LastDiv。

3時間経過! トップはIQ19、しかし同率1位に追いつくチームが現れる

 3時間経過、トップと2位の差は僅差。後半の問題を1つでも正解すれば逆転可能だ。ここにきて各チーム詰まってきているのかタイピング音が減ってくる。さすがに疲労がたまってきているのか突然立ち上がったり両手を広げる人が現れた。この競技は休憩をとるタイミングも重要だ。

 3時間29分、Isが最難問第12問をクリア! ついにトップのIQ19と並ぶ。

 3時間30分経過、残り30分になると、それより後の点数が隠され風船の配布も終了となる。出場者も観客も点数を知ることができなくなった。各チームラストスパート! ギリギリまでタイピング音が響いた。

残り30分時点でIQ19とIsが同率1位に! 表彰式まで結果は分からない

 果たしてどのチームがグランプリに輝いたのか! 結果はこうだ。

プログラミング部門、結果は!

グランプリ

東京都 開成高等学校 IQ19

準グランプリ

東京都 筑波大学附属駒場高等学校 K2

第3位

東京都 開成高等学校 Is

 グランプリの開成高等学校のIQ19の高谷悠太さん(高2)、依知川空さん(高3)にお話を伺った。

写真左から高谷悠太さん(高2)、依知川空さん(高3)

 中学生のとき部活をきっかけにプログラミングを始め、先輩に誘われてパソコン甲子園に参加することにしたという二人。パソコン甲子園には今回が二度目の参加だ。

 本選中は、真剣な表情でプログラムを書いていた二人だが、話してみると高校生らしくそのギャップに驚いてしまう。しかし二人とも数学の問題を解く能力を競う数学オリンピックなどの国際大会で金メダルを獲得した天才高校生なのだ。さらに2年生の高谷さんはプログラミングの能力を競う情報オリンピックで3年連続金メダルという快挙を成し遂げているというから驚きだ。

 普段の勉強方法はとにかく実践で、オンラインのプログラミングコンテストに参加して腕を磨いているという。ちなみに3年生の依知川さんの志望校は東京大学だそうだ。

審査員特別賞の高校生の異名は、「世界の小池」!

 出場した高校生に話を聞いてみると、プログラミングを始めて1年で本戦に出場した人や、賞金のために参加したと言い切る人などさまざまだ。

写真左から小池悠生さん(高3)、奥村真司さん(高3)

 審査員特別賞を獲得した灘高等学校の大物Youtuberの小池悠生さん(高3)は情報セキュリティの分野で高校生世界一のスーパースターだ。もともとゲームを作ろうと思いプログラミングを始めて、ゲームを作ってはみたが思ったよりめんどくさいことに気づき、別の分野のプログラミングを始めた。専門は情報セキュリティで競技プログラミングはその合間にやっているという。異名は「世界の小池」だ。学校の友達にいじられているようで、本人は恥ずかしがっている様子だった。小池さんやグランプリの2人をはじめ、プログラミング部門本選で活躍していた選手には数学オリンピックや情報オリンピックなどで入賞経験のある強者が多くいた。別の大会で会ったことのある顔なじみも多いらしい。

悩みは情報処理科に女子が少ないことだという

 また、1組だけ女子2人での参加チームがあった。岐阜県立岐阜商業高等学校のななみんだ。チーム名の「ななみん」は友達の名前を使ったんです、と笑う野入由依さん(高2)と森井想さん(高2)は情報処理科の学生で、学科の勉強についていくために、流されるまま部活でもプログラミングを始めた。プログラミング歴は2年足らず。1年生のときは、引率をしたいという先生にそそのかされて参加するも予選どまりだったが、2回目の挑戦となる今年は本戦に出場するに至った。この2人、話してみてもいかにもプログラミングをしてそう!という感じではない、普通の女子高生感が溢れている。プログラミングはもうパソコン少年だけのものではないのを痛感した。

 さらにインタビューをしていくと、プログラミングを始めたきっかけとして、「部活」を挙げる高校生が多くいた。もちろん、もともとゲームを作りたかったり、プログラミングに興味があったりしてコンピューター系の部活に入る人もいれば、ただ誘われたままになんとなく入ったという人も多かった。中高生にとって、部活が本格的なプログラミングへの一番身近な入り口になっているのだ。

 ここに出場している高校生の多くは、先生や先輩などの人材やコンピュータなどの機材が豊富な、恵まれた環境でプログラミングを勉強できている生徒がほとんどだ。しかし、ここまで実践的なプログラミングを勉強できる環境がある学校が少ないのも確かだ。つまり、環境さえあれば、この大会に出場するような優秀なプログラマーは、どこでも生まれるのではないだろうか。次の天才プログラマーはあなたかもしれない!

 後編では2日目に行われたモバイル部門本選の様子をお届けする。

会場ではネットで募集された「いちまいの絵CG部門」の入選作品が展示された

カテゴリートップへ

この特集の記事

 
ピックアップ