大学入学共通テスト2025 情報Ⅰ プログラミング問題(第3問) を徹底解説!実際にLua (Roblox Studio)とScratchでプログラミングも!?

2025年1月19日に実施された大学入学共通テスト2025 情報Ⅰ 第3問(過去問)を詳しく解説し、実際にLuaとScratchでプログラミングしてみました。実際にプログラミングすることで楽しく学べて、理解も深まると思います。
今回、LuaとScratchを選んだ理由は、第3問の問2(24ページ)で『この配列は添字(1から始まる)』という前提条件があったためです。Roblox などで使われる Luaの配列、Scratchのリスト(配列)もインデックス(添字)が 1 から始まるため、共通テストのプログラムをできるだけ忠実に反映できると考えました。

共通テスト2025 情報Ⅰ プログラミング問題(第3問)を実際にプログラミングしてみた!

情報Ⅰ 第3問

第3問 問1

 

第3問 問1の解答と解説

「ア」の正解・・・2

「イ」の正解・・・2

図1の割当図をみると、工芸品4が割り当てられている部員は「部員2」、日付(日目)は2日目ということが読み取れますね。「ア」の答えは「2」、「イ」の答えは「2」です。

 

「ウ」の正解・・・2

「エ」の正解・・・3

「オ」の正解・・・5

 

 

割当の規則を理解すると、工芸品5の担当の部員は部員2となり、表1各工芸品の制作日数を見れば工芸品5の制作日数が3日間であることが分かり、制作日が3日目5日目となります。

「ウ」の答えは「2」、「エ」の答えは「3」、「オ」の答えは「5」です。

 

第3問 問2

 

第3問 問2の解答と解説

「カ」の正解・・・4

Akibiという配列の添字(インデックス)が、部員の番号に対応していると理解していれば、Akibi[3] = 4であることが分かります。

部員1の空き日はAkibi[1]に格納されており、図1を見ると部員1の空き日は「5」日目なのでその値は「5」となります。同様に、部員2の空き日は「3」日目なのでAkibi[2]には「3」が格納され、部員3の空き日は「4」日目なのでAkibi[3]には「4」が格納されます。「カ」の答えは「4」です。

【工芸品4まで割当られた後の配列Akibiの内容

  • 部員1の空き日・・・Akibi[1] 👈️ 5日が格納
  • 部員2の空き日・・・Akibi[2] 👈️ 3日が格納
  • 部員3の空き日・・・Akibi[3] 👈️ 4日が格納

このときの配列Akibiは、プログラミング言語ではAkibi[3] = [5, 3, 4]のように表します。

 

「キ」の正解・・・ (Akibi[buin] < Akibi[tantou])

プログラムの問題「キ」を解く手順

手順1
プログラムの概要を確認
問2の文章(24ページ)と図1 割当図(工芸品4まで)を見ると、工芸品5の部員を割り当てるプログラムということが分かります。このことを念頭に入て問題を解きましょう。

手順2
変数や配列の意味を確認

次に、各変数の意味を確認しょう。ローマ字の変数名を確認する、その意味を推測しやすくなります。また、初期値として代入される値からも推測できると思います。

Akibi = [5, 3, 4]という配列は、工芸品4までを割り当てた後の各部員の空き日を格納している。部員1の空き日は5日、部員2の空き日は3日、部員3の空き日は4日。※問2の「カ」の問題を見ると詳細が分かります。

buinsuという変数は、部員の総数。※部員は3人なので、3が代入されている。

tantouという変数は、工芸品を担当する部員番号。1が代入されている。※つまり、担当部員を部員1に初期設定している。

buinという変数は、部員番号。※(04)行目で2が代入され、1ずつ増える。

手順3
(04)行目の「・・繰り返す」を理解

(04) 行目の「部員番号(buin)を2から部員の総数(buinsu)まで1ずつ増やしながら繰り返す」は、部員2、部員3までを繰り返すfor文ということになります。変数の値を変化させながら繰り返し実行するコードをfor文と呼びます。
※部員番号(buin)を1からでなく2からスタートしているのは、(03)行目でtantouに1を代入して仮の担当部員を部員1としているためです。その後、(04)行目のfor文では部員2、部員3と順に比較して、for文が実行し終わったら担当部員が決定すると推測できます。

手順4
(05)行目の「もし?なら」を理解
(05) 行目の「もしも「キ」ならば:」は、「キ」の条件文を満たしたときに「tantou = buin」が実行される条件分岐(if文)です。ある条件が成立したときに、特定の処理を実行するコードをif文と呼びます。
手順5
(06)行目の「tantou = buin」を理解
「キ」の条件が成立したときに実行されるtantou = buinは、担当部員(初期設定では部員1)を格納する変数tantouに、部員番号が格納されている変数buinを代入することを意味します。
※プログラミングにおいて「tantou = buin」はtantoubuinの値が等しいという意味ではなく、tantouの値をbuinの値に更新する(置き換える)ことを意味します。例えば、担当する部員(tantou)が「1」、部員番号(buin)が「2」のときに「tantou = buin」を実行すると、担当する部員(tantou)が部員1から部員2に変更されます。
手順6
割当の規則から「キ」の条件式を推測

手順5までの考察と割当の規則「最も早く空きになる部員が、空きになった日付から次の工芸品を担当する」から、(04)-(06)行目のプログラムは、担当する部員(tantou)と部員番号(buin)の空き日を比較し、部員番号(buin)の部員の空き日が、担当する部員(tantou)の空き日よりも早ければ(小さければ)、「tantou = buin」を実行して担当部員を変更するコードと考えることができます。

Akibi[buin]は部員番号(buin)の部員の空き日、Akibi[tantou]は担当する部員(tantou)の空き日を示すので、「キ」の条件文でAkibi[buin] < Akibi[tantou]の比較を行えばプログラムが完成します。つまり、「キ」の答えはAkibi[buin] < Akibi[tantou]です。

プログラミングにおいて「x = y」はxyの値が等しいという意味ではなく、xの値をyの値に更新する(置き換える)ことを意味します!

 

 

「ク」の正解・・・1  

手順1
「ク」の問題の概要を確認

「ク」の問題文を読むと、部員数(buin)を5Akibi = [5, 6, 4, 4, 4]に変更して、図4のプログラムを実行したとき、(06)行目の代入tantou = buinが何回実行されるかを問う問題であることが分かります。

(06)行目のtantou = buinは、「キ」の条件式Akibi[buin] < Akibi[tantou]を満たしたときに実行されるので、部員数(buin)を5Akibi = [5, 6, 4, 4, 4]に変更して図4のプログラムを実行したとき、条件式Akibi[buin] < Akibi[tantou]が何回成立するか考えてみましょう。

部員数(buin)を5Akibi = [5, 6, 4, 4, 4]の状態を図1のような割り当て図で示すと、以下のようになります。

手順2
変数や配列の意味を確認

各変数の意味を確認しましょう。変数名は意味ある名前に設定されているため、ローマ字の変数名を確認すると、その意味を推測しやすくなります。

Akibi = [5, 6, 4, 4, 4]部員1の空き日は5日、部員2は6日、部員3は4日、部員4は4日、部員5は5日。

buinsu = 5部員の総数。

tantou = 1担当部員を部員1に初期設定する。

buin部員番号。

手順3
(04)-(06)行目のfor文を各ステップ毎に確認

(04)-(06)行目ののfor文を各ステップで確認しましょう。

for文の前に実行する前に、(05)行目で仮担当を部員1と初期設定しているので、部員2からfor文が実行されます。

ステップ① 部員2の空き日:6日 vs 仮担当部員1の空き日:5日 👉 仮担当部員1の方が小さい(早い)

ステップ② 部員3の空き日:4日 vs 仮担当部員1の空き日:5日 👉 部員3の方が小さい(早い)

ステップ③ 部員4の空き日:4日 vs 仮担当部員3の空き日:4日 👉 仮担当部員3の方が小さい(早い)

ステップ④ 部員5の空き日:4日 vs 仮担当部員3の空き日:4日 👉 仮担当部員3の方が小さい(早い)

手順4
tantou = buinの実行回数を確認

手順3からステップ②のときだけ、条件式Akibi[buin] < Akibi[tantou]が成立し(06)行目tantou = buinの代入が実行されているのが分かります(仮担当部員が部員1から部員3に更新)。つまり、「ク」の答えは1回です。

プログラミングしてみよう!

🎯問題「キ」と「ク」のプログラムを実際にLuaやScratchでプログラミングしてみましょう!できるだけ問題のプログラムの形式と同じにしたかったので、配列の長さを返すlocal buinsu = #Akibiは利用していないことご了承ください。

Lua:「キ」の問題のスクリプト

-- 各部員の空き日を表す配列(部員1が5日、部員2が3日、部員3が4日)
local Akibi = {5, 3, 4}
-- 部員の総数(local buinsu = #Akibiは使用せず)
local buinsu = 3
-- 最初は部員1を担当に設定
local tantou = 1

-- 部員2から順に比較
for buin = 2, buinsu, 1 do
    -- もし現在の部員の空き日が、現在の担当の部員より早ければ(小さければ)担当を変更。
    if (Akibi[buin] < Akibi[tantou]) then
        tantou = buin
    end
end

-- ↑for文の仕組み
-- 担当を部員1に設定してから、順番に他の部員と「<=」ではなく「<」で比較しているため、空き日が同じ場合には、番号の小さい部員が選ばれる。

-- 最も空き日が早い部員を担当として表示
print("次の工芸品の担当は部員" .. tantou .. "です")
Lua:「ク」の問題のスクリプト

-- 各部員の空き日を表す配列(部員1が5日、部員2が6日、部員3が4日、部員4が4日、部員5が5日)
local Akibi = {5, 6, 4, 4, 4}
-- 部員の総数(local buinsu = #Akibiは使用せず)
local buinsu = 5
-- 最初は部員1を担当に設定
local tantou = 1
-- 代入回数を記録する変数(初期値0)
local dainyu = 0

for buin = 2, buinsu, 1 do
    -- 各ステップで部員と担当候補の部員の空き日を出力
    print("部員"..buin,Akibi[buin],"担当候補の部員"..tantou,Akibi[tantou])
    if (Akibi[buin] < Akibi[tantou]) then
        tantou = buin
        dainyu = dainyu + 1
    end
end

print("次の工芸品の担当は部員"..tantou.."です")
print("代入回数は"..dainyu.."です")

※動画説明ではRoblox Studioを使ってLuaプログラミングを行いましたが、すぐにプログラミングをしたいと言う方にはmyCompilerがおすすめです。問題を解くだけでなく、実際にプログラミングしてみると楽しいですよね。

 

myCompiler とは?

myCompiler は、オンラインで簡単にコードを書いて実行できる便利なツールで、C, C++, Java, Python, JavaScript(Node.js), Luaにも対応しています。

プログラムがエラーになったら!?

1. 変数名や関数名にスペルミスがないか確認しましょう。

2. for文やif文の構成が正しいか確認しましょう(luaであればdo, then, endの位置や個数に注意)。

3. 誤って全角文字を使っていないか確認しましょう。

共通テスト2025情報Ⅰ:「キ」「ク」の問題をプログラミング

👇️スクリプトは下記リンクをクリックして、Scratchプロジェクトが開いたら「中を見る」ボタンをクリックしてください。

https://scratch.mit.edu/projects/1125256399

使い方
1キー:「キ」の問題のスクリプトが実行される
2キー:「ク」の問題のスクリプトが実行される
「キ」の問題のスクリプト

「ク」の問題のスクリプト

第3問 問3

 

第3問 問3の解答と解説

「ケ」の正解・・・① (kougeihin)

「コ」の正解・・・④ (kougeihinsu)

「サ」の正解・・・② (Nissu[kougeihin] - 1)

「シ」の正解・・・⓪ (Nissu[kougeihin])

プログラムの問題「ケ」「コ」「サ」「シ」を解く手順

手順1
プログラムの概要を確認
問3の文章(26ページ)から、表1 各工芸品の制作日数(再掲)を用いて、図2のような各工芸品の担当と期間を表示するプログラムを作る問題と言うことが分かります。問題「キ」のプログラムでは、工芸品5の担当を部員を割り当てるプログラムでしたが、今回のプログラムではすべての工芸品に担当部員を割り当てることができます。

より分かりやすく図解すると、以下のようなステップで各工芸品の担当者と期間を割り当てるプログラムです。

手順2
変数や配列の意味を確認

各変数の説明は26ページに記載されているので、確認しましょう。

Nissu = [4, 1, 3, 1, 3, 4, 2, 4, 3]工芸品の順番順に制作日数を並べた配列、工芸品1は制作日数4日、工芸品2は1日、・・・、工芸品8は4日、工芸品9は3日。

kougeihinsu = 9工芸品の総数。

kougeihin工芸品の番号。

Akibi = [1, 1, 1]各部員が空きになる日付を管理する配列、どの部員は割当前は1日目が空きとなるので、Akibiの各要素を1に初期設定している。

buinsu = 3部員の総数。

tantou = 1担当部員を部員1に初期設定する。

buin部員番号。

手順3
(05)~(11)行目の「・・繰り返す」を理解し、「ケ」「コ」を推測

26ページの「(05)~(11)行目で各工芸品に対して順に担当と期間を決めていく」という記載から、(05) 行目の「「ケ」を1から「コ」まで1ずつ増やしながら繰り返す」は、各工芸品の担当と期間を決めるfor文ということが分かります。

このことから、1ずつ増やしながら繰り返す変数「ケ」は工芸品の番号を表すkougeihin、繰り返しの上限値「コ」は工芸品の総数「9」が格納されているkougeihinsuと考えることができます。つまり、「ケ」の答えはkougeihin「コ」の答えはkougeihinsuです。

手順4
(10)行目の「表示する」を理解し、「サ」を推測
「表示する」という記載からも推測できるように、図2に示された「各工芸品の担当と期間を一覧にしたメールの文面」を表示するためのプリント文であることが分かります。

次に、Akibi[tantou] + 「サ」が、「各工芸品の担当と期間を一覧にしたメールの文面」のどの部分に対応するかを確認します。上図から分かるように、Akibi[tantou] + 「サ」は、「工芸品1 ⋯部員1:1日目~4日目」の最後の日付部分に対応しています。工芸品1の行では「4」日目、工芸品2は「1」日目、工芸品3は「3」日目と表示されている部分です。

「工芸品1 ⋯部員1:1日目~4日目」の最後の日付は工芸品1の製作が完了する日を意味するので、表1の「各工芸品の製作日数」と図2の「各工芸品の担当と期間を一覧にしたメールの文面」から、Akibi[tantou] + 「サ」「サ」を推測しましょう。なお、Akibi[tantou] には、担当部員(tantou)の空き日が格納されています。

メールの文面に記載されている担当部員のAkibi[tantou]の値を確認し、Akibi[tantou] + 「サ」「サ」の値を算出してみましょう。Akibiの各要素の初期値はAkibi = [1, 1, 1]なので、最初の割り当て時におけるAkibi[1]、Akibi[2]、Akibi[3]の値はすべて「1」Akibi[1] = 1、Akibi[2] = 1、Akibi[3] = 1です。

・「工芸品1 部員1:1日目~4日目」 4 👈 Akibi[1] + 「サ」:(1+3)日目

・「工芸品2 部員2:1日目~1日目」 1 👈 Akibi[2] + 「サ」:(1+0)日目

・「工芸品3 部員3:1日目~3日目」 3 👈 Akibi[3] + 「サ」:(1+2)日目
このことから、工芸品1, 2, 3の割り当て時の「サ」はそれぞれ3, 0, 2となり、表1の工芸品の製作日数である4, 1, 3から1を引いた値になっていることが分かります。つまり、「サ」の答えは工芸品の製作日数から1を引いたNissu[kougeihin]-1です。

※開始日を1日目としているため、(製作日数)ではなく、(製作日数-1)を加えた日が製作期間の最終日となります。

手順5
(11)行目の「Akibi[tantou] = Akibi[tantou] +「シ」」を理解し、「シ」を推測
数学の世界においてAkibi[tantou] = Akibi[tantou] + 「シ」を方程式と考えると、両辺の値が常に一致する必要があるため、「シ」は「 0」 でなければ成り立たないように見えます。

しかし、プログラミングの世界ではこの式は 「Akibi[tantou]の値を更新する処理」 を意味します。簡単に言うと、「元の Akibi[tantou]の値に「シ」を足して、再びAkibi[tantou]に格納する」 ということになります。このことを踏まえて、各工芸品の担当者が確定した後の(11)行目でどのような処理をすべきか考えれば、「シ」が何であるか考えましょう。

Akibi[tantou] には、担当部員(tantou)の空き日が格納されており、各工芸品の担当者が確定した後は担当部員(tantou)の空き日を更新する必要があります。これは、手順1のプログラムの概要を確認すると分かりやすいと思います。例えば、工芸品1を部員1に割り当てたとき、部員1の空き日は1日から5日に更新されます。この5日は、割当前の空き日である1日に工芸品1の制作日数である4日を足して算出しています。

つまり、担当部員(tantou)の Akibi[tantou]の値に、割り当てられた工芸品(kougeihin)の制作日数 Nissu[kougeihin]を足せば、担当部員(tantou)の空き日を更新できます。よって、(11)行目のコードはAkibi[tantou] = Akibi[tantou] + Nissu[kougeihin]となります。このコードを実行すると担当部員(tantou)の空き日を更新できますね。「」の答えは Nissu[kougeihin]です。

プログラミングにおいて a = b は、ab が等しいという意味ではなく、a の値を b の値に更新する(置き換える)ことを意味します!

 

プログラミングしてみよう!

🎯すべての工芸品に担当部員を割り当てるプログラムを実際にLuaやScratchでプログラミングしてみましょう!できるだけ問題のプログラムの形式と同じにしたかったので、配列の長さを返すlocal buinsu = #Akibiは利用していないことご了承ください。

Lua:すべての工芸品に担当部員を割り当てるスクリプト

-- 工芸品ごとの作業日数(Nissu[kougeihin] に対応)
local Nissu = {4,1,3,1,3,4,2,4,3}

-- 工芸品の総数(9つ)
local kougeihinsu = 9

-- 各部員の空き日を表す配列(部員1が1日目、部員2が1日目、部員3が1日目からスタート)
local Akibi = {1, 1, 1}

-- 部員の総数(local buinsu = #Akibi は使用せずに指定)
local buinsu = 3

-- 各工芸品を順番に処理する
for kougeihin = 1, kougeihinsu, 1 do
    -- 最初は担当を部員1に設定
    local tantou = 1

    -- 部員2から順番に比較して、より早く空いている部員を担当にする
    for buin = 2, buinsu, 1 do
        -- もし現在の部員の空き日が、現在の担当の部員より早ければ(小さければ)担当を変更
        if (Akibi[buin] < Akibi[tantou]) then
            tantou = buin
        end
    end

    -- ↑ for 文の仕組み
    -- 担当を部員1に設定してから、順番に他の部員と「<=」ではなく「<」で比較しているため、
    -- 空き日が同じ場合には、番号の小さい部員が選ばれる。

    -- 担当部員と作業期間を表示
    print("工芸品" .. kougeihin .. "・・・部員" .. tantou .. ":" .. Akibi[tantou] .. "日目~" .. (Akibi[tantou] + Nissu[kougeihin] - 1) .. "日目")

    -- 担当した部員の空き日を更新(担当となった工芸品の製作日数分を追加)
    Akibi[tantou] = Akibi[tantou] + Nissu[kougeihin]
end

共通テスト2025情報Ⅰ:問3の問題をプログラミング

👇️スクリプトは下記リンクをクリックして、Scratchプロジェクトが開いたら「中を見る」ボタンをクリックしてください。

https://scratch.mit.edu/projects/1126168080

使い方
3キー:すべての工芸品に担当部員を割り当てるプログラムが実行される
「キ」の問題のスクリプト

 

Roblox Studioとは?

Roblox Studioは、Roblox用の カスタムゲームを作成できる公式の無料 ユーティリティソフトウェア。ミニゲーム、障害物コース、ロールプレイングストーリーなど、さまざまなゲーム作ることが出来ます 。プログラミング言語Luaを利用してプログラミングします。Robux(ロバックス)と呼ばれる仮想キャッシュを、ゲーム内アイテムに対して使用することで収益を得る仕組みを構築することも出来るので、子供たちはゲーム開発を通じでビジネスの感覚が身につけられる。

Robloxとは?

Robloxは、ユーザーがRoblox Studioを使ってゲームをプログラムしたり、他のユーザーが作成したゲームをプレイしたりできるオンラインゲーミングプラットフォームおよびゲーム作成システムです。

Scratch3.0(スクラッチ3.0)とは?

MITメディアラボにより開発されたビジュアルプログラミング言語。子供たちが物語やゲーム、 アニメーションなどのインタラクティブな作品をプログラミングできる。また、自分の作った作品を世界中の人々と共有できるコミュニティーサイトでもある。世界中で1億人を超えるユーザがいる。
こちらのホームページにアクセスすれば無料で利用できる。