大学入学共通テストの科目「情報基礎」のプログラミング問題(第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]~に記録します。