情報オリンピック2024一次予選1回目終了につき
今年も生徒の力試しの一環として参加してみました。一次予選は3回あり、まだ10月と11月の分は残っていますが、当校でも通過者がいました(小学生が小6が2名、中学生が中1が1名、中2が1名でした。追記:2回目の予選でさらに中学1年生が1名。追記2:3回目の予選でさらに中学2年生が1名)
小学生・中学生で合計6名が通過しました!
雑感
さて今回の参加で特に感慨深いのは当校の一次予選通過者の中にいわゆる学校の成績が振るわない偏差値40以下の生徒さん(Aさんとします)も含まれていたことです。
話は飛びますが、スポーツ科学の古典的モデルで「パフォーマンス=パワー×技術」という式があります。
例えばバスケットボールで身長が2メートルを超えれば高校生くらいまでの大会なら活躍することができます。下手をすれば全国大会で活躍しその実績でそのまま有名大学に入学できる可能性もあります。しかしそれはバスケットでは身長という因子が強く影響する競技だから可能で、その人の技術という面をより詳細に分析すれば相対的に低い(また低くても活躍できてしまう)という構造があるわけです。だから高校までは、日本では体格と体力で活躍できた選手でも大学や海外に行くと活躍できないという事例はスポーツの世界ではそこかしこにあるのです。
またバスケットボールでは身長という目に見える因子は分かりやすいのですが、全ての競技にはこうした遺伝因子があります。競技プログラミングもまた同様です。抽象化能力、ワーキングメモリ、その場その場の短い集中力・・・、などIQテストでは流動性知性や言語化能力と呼ばれるものがそれです。そしてそこだけに頼ってしまい目先の結果に一喜一憂してしまうと先々で色々と問題を生じさせます。小中高の間に基本を身に着ける機会に恵まれなかったからです。そして加齢により成長が止まってしまい、10代の時に圧倒していたはずの相手に抜かされてしまうのです。
前述の「パフォーマンス=パワー×技術」という式に今回の例をあてはめてみると、この生徒さんが元々持つパワーは相対的に低いことが予想されます。なぜならプロフィールが公開される二次予選通過者を見てみれば分かりますが、筑駒、開成、灘などいわゆる有名進学校の生徒さんが多数を占める状況であるからです(参考リンクはこちら)。そうして考えてみるとこのAさんの持つパワーは有名進学校に通われる生徒さんと比べるとどうしても学力や遺伝などの自力という意味では心もとないわけで今回の好結果は他の因子、すなわち技術のファクターが補ったと言えるわけです。そして、それが何かと言えば当校独自のメソッドであったわけです。
その中の1つだけ軽く紹介すると「具体化、手順化、コード化」と呼ぶもので、Aさんにはそうしたものを教えていました。もちろん客観的に見れば、それは萌芽と呼べる段階ですし、まだ徹底が足りません。ですが今回の結果をきっかけにして学校の勉強にも着実につながっていくと感じています。なぜなら今回の情報オリンピックのAさんの好結果はオモチャやゲームで遊んで浪費するだけでは決して得られない「本物の自己肯定感」を培うキッカケになったからです。ぜひこれをお読みの皆さんもAさんに続いてほしいところで、プログラミングを通して本当に意味のあるものを掴んでほしいと考えています。
一次予選なら色々な言語で挑戦できます。
一方でAIが爆発的に進歩している世の中ですのでプログラミングに限らず自分が興味をもったものに積極的に挑戦してほしいとも感じています。
また今回の参加者はPythonコースの在籍者のみでしたが一次予選までなら日本語プログラミング言語など幅広い言語でも参加できます。みなさんも興味があれば参加してみるのも良いかと思います。ちなみに今回の問題を日本語プログラミング言語「なでしこ」で書くとこのような形になるかと思います。少し冗長に書きましたがプログラム未経験者の方にも「これなら僕にも/私にもできそう」と感じてもらえれば嬉しいです。また問3、問4になると大学入試共通テスト「情報Ⅰ」にもつながるレベルかと思います。
#問題A--------------------------------------
A=「」と尋ねて整数変換
表示(整数部分(A/5))
#問題B--------------------------------------
X=「」と尋ねて整数変換
答え=0
番号を1からXまで繰り返す:
もし(番号%2=0)ならば:
答え=答え-2
違えば:
答え=答え+3
表示(答え)
#問題C--------------------------------------
N=「」と尋ねて整数変換
S=「」と尋ねて文字列変換
答え=「」
Sを反復:
表示(対象)
もし(対象=「J」)ならば:
答え=答え&「O」
違えばもし(対象=「O」)ならば:
答え=答え&「I」
違えばもし(対象=「I」)ならば:
答え=答え&「J」
表示(答え)
#問題D--------------------------------------
入力リスト=「」と尋ねて「 」で区切って配列数値変換
N=入力リスト[0]
M=入力リスト[1]
A=「」と尋ねて「 」で区切って配列数値変換
B=「」と尋ねて「 」で区切って配列数値変換
答え=0
Aを反復:
餡=対象
Bを反復:
皮=対象
和=餡+皮
大きい方=配列最大値([餡、皮])
美味しさ=和*大きい方
答え=答え+美味しさ
表示(答え)
※問題や解答例(C++, Python)については情報オリンピック日本委員会のHPで確認できます(https://www2.ioi-jp.org/joi/2024/2025-yo1/)