見出し画像

日本大学文理学部 「情報」サンプル問題 問題IIIの解説


植原啓介(慶應義塾大学環境情報学部)

 2025年度入試から大学入学共通テストに「情報I」が導入されることとなり,個別入試にも教科「情報」を出題する大学がちらほら見られるようになりました¹⁾ ²⁾.

 日本大学文理学部の一般選抜(A個別方式)においては,2025年度入試から全学科で「情報I」を選択できるようになります.それに向けて,日本大学文理学部は2024年3月27日にサンプル問題³⁾を公開しました.今回はこのサンプル問題の問題IIIについて解説していきたいと思います.


問題の外観

 この問題のリード文はエディタでデータがうまく開けなかったというエピソードから始まりますが,データのエンコーディングに関する問題です.仕様を読み解く力,それに従ってデータをエンコード(符号化)する力が必要となります.また,二進法に関する理解や文字コード表を読む力も必要になります.今どきのWebアプリケーションの世界ではあまり見かけないシチュエーションかもしれませんが,情報技術を扱う者にとっては重要なスキルと言えるでしょう.

 また,(4)以降はプログラミング問題になります.基本的なプログラミングに関するスキルが必要となるでしょう.また,ビット演算も含まれており,ビット操作に関するスキルも必要としています.

前提

 まず,問題の前提から整理してみましょう.

使用するエディタの特徴

 この問題ではテキストエディタが登場します.テキストエディタとは文字情報のみのファイル(テキストファイル)を編集するためのソフトウェアです.プログラムを書いたり,HTMLを直接書いたりするときに使われます.基本的に文字を装飾したりする機能はなく,テキストエディタで編集したデータはテキストファイルとして保存されます.この問題で使われるテキストエディタは次のような特徴があります(問題より引用.一部改変).

  • 8ビットの値のうち上位4ビットが0010〜0111の場合,最上位ビットを除いた7ビットの値をASCIIコード表に基づいて文字に変換し,表示する.

  • 8ビットの値のうち上位4ビットが0000または0001の場合,ASCIIコード表のなかの制御コードに該当するため,代わりに空白を表示する.

  • 8ビットの値のうち最上位ビットが1の場合,ASCIIコード表の範疇外であるため,代わりに空白を表示する.

 簡単に言えば,表示できる文字はそのまま表示するが,表示できない文字は空白で表示する,ということです.このことを理解するためにはいくつか必要なスキルがあります.まず,問題に図示されているASCIIコード表では上位ビットが3ビットで表現されているのに対して,問題文では4ビットになっている点に注意が必要です.上記の個条書きのうち,1つ目の項目ではASCIIコード表の3列目から8列目に関して述べていること,2つ目の項目では1列目と2列目について述べていること,3つ目の項目では図示されたASCIIコード表には示されていない部分について述べていることを理解する必要があります.

ファイルフォーマットの特徴

 次に図5の仕様を読み取って,ファイルフォーマットについて理解する必要があります.生徒の人数が始めの1バイトに格納されているとの記述等から,このファイルは基本的にバイナリフォーマット(文字で表現されたデータではなく,バイトの列として格納されたデータ)であることを理解しなければなりません.高校の教科書だとあまりバイナリフォーマットのデータに触れているものはないと考えられるため,副教材なども活用しながら勉強しておく必要があるでしょう.

 また,学年・クラス・居住地が1バイトのデータの中にエンコーディングされていることを理解する必要があります.問題に下記のような図があるので,その理解は難しいものではないかもしれませんが,初見だと面食らうかもしれません.

学年・クラス・居住地のエンコーディング

 さらには,1人目の情報,2人目の情報……と順に人数分のデータが連なって保存されていることも理解する必要があります.

問題の解説

(1)について

 始めの1バイトについての理解を問うています.エディタでの表示は,始めに空白がないとすると,1バイト目は「$」です.ASCIIコード表で「$」を探すと,上位3ビットが010,下位4ビットが0100であることが分かります.上位ビット・下位ビットという用語を理解する必要がありますが,それさえ分かれば0100100というビット列を得ることは簡単でしょう.ここまでくれば,後は2進10進変換です.2進法の0100100は10進法で36なので,36名分という解答が得られます.

(2)について

 Taro Kato氏の属性について答える問題です.Taro Kato氏は2人目に格納されていることはエディタの表示から明らかです.また,Tの前の2バイトが順に学年・クラス・居住地とTaro Katoの文字数を表しています.ここで1バイト目のデータは「)」と表示されています.これはASCIIコード表では010 1001です.データとしては頭に不足分の1ビットを足して,00101001となります.この中の始めの3ビット(001)が学年を,続く3ビット(010)がクラスを,残りの2ビット(01)が居住地を表していることになります.よって,図5の仕様に照らし合わせると,学年は1年生,クラスは2組,居住地は神奈川県となります.

(3)について

 Hanako Tanaka氏のデータを書き換えるとエディタでの表示がどう変わるかを問うた問題です.Hanako Tanaka氏の学年・クラス・居住地は文字では「$」となっています.ASCIIコード表に照らし合わせると,00100100となり,1年生,1組,東京都在住であることが分かります.このうち居住地,つまり下位2ビットを書き換えます.神奈川県は01なので,データとしては下位2ビットを01にした00100101となり,これに対応する文字をASCIIコード表で調べることになります.最上位ビットは0なので無視してよく,続く3ビット,つまりASCIIコード表の上位3ビットは010となります.また,下位4ビットは0101です.よって対応する文字は「%」となります.

 この問題は居住地のみが変更になるので,それが下位2ビットに格納されていることに先に気づけば,00が01になるだけなのでASCIIコード表の文字が1文字下にずれるだけという簡単な導き方もできます.

(4)について

 (4)からはプログラミング問題になります.

 まずは,ファイルの構造に長さが入っている部分が2種類あることに気づく必要があります.1つ目は何人分のデータが入っているかを示しているもの,2つ目は名前の長さです.これに気づくことができれば,一番外側の繰り返しは1人ずつ処理をしていくためのものであり,4行目は人数分の繰り返しをするための条件が入ることが予想できます.いま何人目の処理をしているのかを数える変数としては,1行目で変数num_tokyoが,2行目で変数iがどちらも0で初期化されていますが,10行目に「i = i + 1」とあり,変数iがそれであると理解できます.また,2行目で「i = 0」となっているので,カウントは0から始まります.そのため【30】の条件は「i < N」となります.

 5行目では生徒のデータの1バイト目,つまり学年・クラス・居住地を読み取っています.6行目では下位2ビットが00という条件を示しています.これは居住地が東京都ということです.今回のプログラムは東京都在住の生徒の数を調べるわけですから,この条件に合致した生徒の人数を数えることになります.よって7行目は人数のカウントです.変数としてはnum_tokyoを使います.変数iやbやNは他の目的で使っているため,これらをここでも使うことはできません.変数num_tokyoは1行目で0に初期化する以外はほかに使っていないので,これを使えば大丈夫です.東京都在住の生徒が見つかったら変数num_tokyoの値を1増やせばよいので,【31】の答えは「num_tokyo = num_tokyo + 1」となります.

 8行目では生徒のデータの2バイト目を読み取っています.2バイト目は仕様より氏名のバイト数です.それに続くデータは氏名となります.次の生徒のデータまで氏名を読み飛ばさなければなりませんので,8行目で読んだ氏名のバイト数だけ空読み(読んで何もせずに捨てること)をする必要があります.8行目で氏名のバイト数は変数bに入っていますので,【32】は「b回 read_byte()を呼び出す」となります.

(5)について

 (5)は(4)で作成したアルゴリズムのうち「もしbの下位2ビットが00ならば」をビット演算を使って表現することにより,よりプログラムらしくする問題です.

 「下位2ビットを取り出す」は別の表現をすると,「上位6ビットを0にする」となります.論理積には,ある値と0の論理積を取ると必ず0になる,ある値と1の論理積を取るとある値が残る,という性質があります.そのため,下位2ビットのみを取り出すためには00000011との論理積を取ればよいことになります。こうすることによって,000000??という値になります.ここで?はもとの値がそのまま残るということです.また,東京は図5の仕様より00なので,00000011と論理積を取った結果が00000000ならその人は東京都在住ということになります.よって答えは「もしbと00000011のANDが00000000ならば」となります.

(6)について

 仕様によると学年は1ビット目から3ビット目に格納されている.そのため上位3ビットを1にした11100000と論理積を取ることになります.また,3年生は仕様より011なので,論理積を取った結果がこれを上位3ビットに格納した01100000となれば3年生ということになります.よって答えは「もしbと11100000のANDが01100000ならば」になります.

講評

 この問題は,バイナリフォーマットあり,プログラミング問題あり,ビット演算ありとてんこもりの問題となっていました.1つの問題でこれだけいろいろな要素を盛り込んだ作題がされたことに驚きを感じます.

 Webアプリケーションの開発に慣れた現代のエンジニアにはあまり馴染みのない問題かもしれません.しかし,情報技術の基礎を押さえていれば解けない問題ではないでしょう.面食らわないために少しの慣れとトレーニングが必要かもしれませんが,このような骨のある問題は個人的には好みです.

参考文献
1)小宮常康:国公立大学における情報入試,情報処理,Vol.65,No.2,pp.e6-e9 (2024).http://doi.org/10.20729/00231768
2)谷 聖一:私立大学における情報入試,情報処理,Vol.65,No.2,pp.e10-e13 (2024).http://doi.org/10.20729/00231769
3)日本大学文理学部,「一般選抜(A個別方式)の「情報」サンプル問題の公開」,2024年3月27日(https://chs.nihon-u.ac.jp/admission/system/

(2024年5月19日受付)
(2024年6月5日note公開)

植原啓介(正会員)
慶應義塾大学環境情報学部教授.2000年慶應義塾大学政策・メディア研究科後期博士課程を単位取得退学.2003年,慶應義塾大学より博士(政策・メディア)の学位を授与.慶應義塾大学において研究員,助手,特任教員などを経て,2022年より現職.専門はインターネット,コンピュータサイエンス,高度道路交通システム(ITS),地理位置情報システムなど.

情報処理学会ジュニア会員へのお誘い
小中高校生,高専生本科~専攻科1年,大学学部1~3年生の皆さんは,情報処理学会に無料で入会できます.会員になると有料記事の閲覧,情報処理を学べるさまざまなイベントにお得に参加できる等のメリットがあります.ぜひ,入会をご検討ください.入会はこちらから!