SHIROのIchigoJam日記

マイコン「IchigoJam」(イチゴジャム)の電子工作とプログラミングをメインに

大学入学共通テスト・プログラミング問題

大学入学共通テストの科目「情報基礎」のプログラミング問題(第3問)
https://mainichi.jp/exam/kyotsu-2023/q/?sub=IFB14
に、今年もIchigoJamで挑戦してみました。
今回は、ロープを伝い降りて途中のリボンに触れてポイントをゲットする、というゲームの最適化問題でした。
動かしてみた動画はこちら。

www.youtube.com


各ロープが55mある設定ですが、IchigoJamの画面は縦24行しかないので、59~40m、39~20m、19~0mの3画面で表示が切り替わるようにしました。

問1:5mずつ下る

11本のロープを単純に5mずつ下って、リボンを通過したらポイントをゲットします。

10 CLV:CLS
20 LET [1],55,53,31,37,37,22,13,19,25,16,0
30 F=40
110 S=0
120 H=55
130 FOR I=1 TO 11
140 IF [I]>=H-5 AND [I]<=H S=S+1
161 GSB @MOV
170 H=H-5
180 NEXT
190 LC 0,20:?"SCORE=";S
200 END
800 @MOV
810 FOR Y=H TO H-5 STEP -1
820 F=Y/20*20
830 GSB @PR
840 LC (I-1)*3,19-Y+F
850 ?CHR$(250)
860 WAIT 30
870 NEXT
880 RTN
900 @PR
910 CLS
920 FOR P=1 TO 11
930 FOR Q=19 TO 0 STEP -1
940 LC (P-1)*3,19-Q
950 IF F+Q=[P] ?"@" ELSE ?"|"
960 NEXT
970 NEXT
980 LC 0,20:?"(";F+19;"-";F;")"
990 RTN

110~190行が問題のコード部分です。各ロープのリボンの場所は、20行で配列[1]~[11]に設定しています。
10~30行は初期設定、800~880行は人間を動かすサブルーチン、900~990行はロープやリボンを表示するサブルーチンです。

問2-a:リボンがある所まで下る

ロープに移ったら、リボンがある所までとにかく下ります。

10 CLV:CLS
20 LET [1],55,53,31,37,37,22,13,19,25,16,0
30 F=40
110 S=0
120 H=55
130 FOR I=1 TO 11
140 IF [I]<=H S=S+1:GSB @MOV:H=[I]
170 LC (I-1)*3,21:?I
171 LC (I-1)*3,22:?S
172 LC (I-1)*3,23:?H;
180 NEXT
190 LC 0,20:?"SCORE=";S
200 END
800 @MOV
810 FOR Y=H TO [I] STEP -1
820 F=Y/20*20
830 GSB @PR
840 LC (I-1)*3,19-Y+F
850 ?CHR$(250)
860 WAIT 30
870 NEXT
880 RTN
900 @PR
910 LC 0:FOR Z=0 TO 20:?CHR$(24):NEXT
920 FOR P=1 TO 11
930 FOR Q=19 TO 0 STEP -1
940 LC (P-1)*3,19-Q
950 IF F+Q=[P] ?"@" ELSE ?"|"
960 NEXT
970 NEXT
980 LC 0,20:?"(";F+19;"-";F;")"
990 RTN

110~190行が問題のコード部分です。

問2-b:下る距離を制限

あまり下へ下ると上のリボンがゲットできなくなるので、一度に下る距離を20mまでに制限。それより下らなければいけないロープは無視します。

10 CLV:CLS
20 LET [1],55,53,31,37,37,22,13,19,25,16,0
30 F=40:G=20
110 S=0
120 H=55
130 FOR I=1 TO 11
140 IF ([I]<=H AND H-[I]<G) OR I=11 S=S+1:GSB @MOV:H=[I]
170 LC (I-1)*3,21:?I
171 LC (I-1)*3,22:?S
172 LC (I-1)*3,23:?H;
180 NEXT
190 LC 0,20:?"SCORE=";S
200 END
800 @MOV
810 FOR Y=H TO [I] STEP -1
820 F=Y/20*20
830 GSB @PR
840 LC (I-1)*3,19-Y+F
850 ?CHR$(250)
860 WAIT 30
870 NEXT
880 RTN
900 @PR
910 LC 0:FOR Z=0 TO 20:?CHR$(24):NEXT
920 FOR P=1 TO 11
930 FOR Q=19 TO 0 STEP -1
940 LC (P-1)*3,19-Q
950 IF F+Q=[P] ?"@" ELSE ?"|"
960 NEXT
970 NEXT
980 LC 0,20:?"(";F+19;"-";F;")"
990 RTN

110~190行が問題のコード部分です。
30行の「G=20」が下る距離制限です。

問3:動きを最適化して最高点

各ロープまでの最高点を計算して、動きを最適化します。
最適ルートを見つけた後にそのルートを下って見せるとカッコいいのですが、そこまでは入れていません(問題にも無いですし)。

10 CLV:CLS
20 LET [1],55,53,31,37,37,22,13,19,25,16,0
30 F=40
40 S=0:H=55
110 [21]=1
120 FOR I=2 TO 11
130 M=0
140 FOR T=1 TO I-1
150 IF [T]>=[I] AND M<[T+20] M=[T+20]:H=[I]
180 NEXT
190 [I+20]=M+1
191 GSB @MOV
192 LC (I-1)*3,21:?I
193 LC (I-1)*3,22:?[I+20]
199 WAIT 60
200 NEXT
210 LC 0,20:?"SCOREMAX=";[31]
220 END
800 @MOV
820 F=H/20*20
830 GSB @PR
840 LC (I-1)*3,19-H+F
850 ?CHR$(250)
860 RTN
900 @PR
910 LC 0:FOR Z=0 TO 20:?CHR$(24):NEXT
920 FOR P=1 TO 11
930 FOR Q=19 TO 0 STEP -1
940 LC (P-1)*3,19-Q
950 IF F+Q=[P] ?"@" ELSE ?"|"
960 NEXT
970 NEXT
980 LC 0,20:?"(";F+19;"-";F;")"
990 RTN

110~210行が問題のコード部分です。
各ロープまでの最高点は、配列[21]~に記録します。