大学入学共通テストの科目「情報関係基礎」のプログラミング問題(第3問)
https://mainichi.jp/exam/kyotsu-2024/pdf/?sub=IFB
に、今年も挑戦してみました。
今回は魔方陣の作成・検証がテーマで、まさしく「IchigoJamでやってみろ」と言わんばかりの問題。
こうしたマス目のプログラムを作った経験が無い受験生は大変かもしれません。
問1:与えられた魔方陣が正しいかを検証
図2:各行の和を求める
1 LET [0], 4,9,2,3,5,7,8,1,6 10 N=3 20 FOR G=0 TO N-1 30 W=0 40 FOR R=0 TO N-1 50 W=W+[R+G*3] 60 NEXT 70 ?W 80 NEXT
行番号10~80が、図2(プログラムリスト)の行(01)~(08)に対応します。1行目は与えられた魔方陣を設定するために追加。
行Gと列Rの2重ループで、各行の数字の和を計算して表示します。
IchigoJamには2次元配列が無いので、配列変数の参照を[R+G*3]として、3行3列の数字を格納しています。
図4:左上から右下の対角方向の和を求める
1 LET [0], 4,9,2,3,5,7,8,1,6 10 N=3 20 W=0 30 FOR I=0 TO N-1 40 W=W+[I+I*3] 50 NEXT 60 ?W
左上から右下の対角方向の列・行の座標は「(i,i)」で表せます。
図4b:右上から左下の対角方向の和を求める
1 LET [0], 4,9,2,3,5,7,8,1,6 10 N=3 20 W=0 30 FOR I=0 TO N-1 40 W=W+[(N-1-I)+I*3] 50 NEXT 60 ?W
右上から左下の対角方向の列・行の座標は「(N-1-i,i)」で表せます。
この辺りが、表を使うプログラムを実際に作ったことがない受験生には難しいかもしれません。
問2:3次の魔方陣を作成
10 CLV 20 N=3 30 X=(N-1)/2:Y=N-1:[X+Y*3]=1 40 FOR Z=2 TO N*N 50 R=(X+1)%N:G=(Y+1)%N 55 IF [R+G*3]=0 THEN X=R:Y=G ELSE Y=Y-1 100 [X+Y*3]=Z 110 NEXT 200 FOR G=0 TO N-1 210 FOR R=0 TO N-1 220 ?[R+G*3]; 230 NEXT:? 240 NEXT
50行・55行は、斜め右下の位置を変数R、Gに入れて、2行に分けています。この方が行が短く済みます。
55行の「ELSE Y=Y-1」は、「『ELSE Y=(Y-1)%N』にしなくていいのか?」とかなり悩んだのですが、この重複するケースが一番上の行で起こる前に、最後の数字まで行ってしまうんですね。なるほど。この問は私が受験生だったら間違えているかも…
200~240行は、できた魔方陣を表示する処理です。
ちなみに、このプログラムの実行結果の魔方陣を左右反転した
294 753 618
は、「二九四(憎し)と思う七五三、六一八は十五なりけり」と古くから歌われた魔方陣です。このプログラムのように、斜めに数字を並べていけば自動的に作れるとは知りませんでした。
問3:できた魔方陣を検証
図7:各行の和が一致することの検証
10 CLV 20 N=3 30 X=(N-1)/2:Y=N-1:[X+Y*3]=1 40 FOR Z=2 TO N*N 50 R=(X+1)%N:G=(Y+1)%N 55 IF [R+G*3]=0 THEN X=R:Y=G ELSE Y=Y-1 100 [X+Y*3]=Z 110 NEXT 200 FOR G=0 TO N-1 210 FOR R=0 TO N-1 220 ?[R+G*3]; 230 NEXT:? 240 NEXT 310 H=0:B=0 320 FOR G=0 TO N-1 330 W=0 340 FOR R=0 TO N-1 350 W=W+[R+G*3] 360 NEXT 370 IF H=0 THEN H=W 380 IF H!=W THEN B=1 390 NEXT 400 IF B=1 THEN ?"BATU" ELSE ?"MARU"
問2の魔方陣作成に、310~400行の検証プログラムを追加しています。
各行の和が一致していれば「MARU」、一致していなければ「BATU」と表示されます。
図8:全ての数が重複なく入っていることの検証
※1/20 プログラムが間違っていたので修正
10 CLV 20 N=3 30 X=(N-1)/2:Y=N-1:[X+Y*3]=1 40 FOR Z=2 TO N*N 50 R=(X+1)%N:G=(Y+1)%N 55 IF [R+G*3]=0 THEN X=R:Y=G ELSE Y=Y-1 100 [X+Y*3]=Z 110 NEXT 200 FOR G=0 TO N-1 210 FOR R=0 TO N-1 220 ?[R+G*3]; 230 NEXT:? 240 NEXT 310 H=0:B=0 320 FOR G=0 TO N-1 330 W=0 340 FOR R=0 TO N-1 350 W=W+[R+G*3] 360 NEXT 370 IF H=0 THEN H=W 380 IF H!=W THEN B=1 390 NEXT 400 IF B=1 THEN ?"BATU" ELSE ?"MARU" 410 FOR I=10 TO 10+N*N:[I]=0:NEXT 420 B=0 430 FOR G=0 TO N-1 440 FOR R=0 TO N-1 450 [10+[R+G*3]]=[10+[R+G*3]]+1 460 NEXT 470 NEXT 480 FOR I=1 TO N*N 490 IF [10+I]!=1 THEN B=1 500 NEXT 510 IF B=1 THEN ?"BATU" ELSE ?"MARU"
図7のプログラムに、410~510行の検証プログラムを追加しています。
IchigoJamには配列変数が1つしか無いので、「[10+[R+G*3]]」と配列10番以降を使って検証用にしています。
各数字が重複無く入っていれば「MARU」、間違っていれば「BATU」と表示されます。
最後に
来年度からは、「情報I」のプログラミングが必修になった新学習指導要領の高校生が受験するテストに変わります。
どんなプログラミング問題が出されるのか? 非常に興味深いです。