SHIROのIchigoJam日記

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

SanadaDake-4KMX

以前に作ったIchigoDake互換機「SanadaDake-4KM」
www.ichigojaman.jp
の改良版を作りました。

クラブや出前授業で拡張基板をピンソケットに抜き差しすると、ピンソケットが劣化してもげる個体が頻発。
本当はGIGA IchigoDakeのようなハーフハイト1列のピンソケットに替えたいのですが、なかなか売っている所が無く、秋月電子でもハーフハイトは2列のピンソケットしかありません。
じゃあ2列にしてしまえ!ということで、幅を広げた今回の基板を開発しました。
ピンソケットが2列あった方が、周辺機器などをつなぐ時にVCCやGNDがたくさん取れるので便利ではないでしょうか。

拡張基板のピンは、ソケットの内側の穴に差します。

回路図

基板データ

*同じ基板を2枚並べて配置しています。
*この基板データは、CC BYライセンスとします。どうぞご利用ください。

(C) 2024 Shiro Saito (https://www.ichigoaman.jp)

魔方陣を作ろう

先日の大学入学共通テストで魔方陣のプログラム問題が出たので、魔方陣を自作するプログラムを作ってみました。

使い方

  • 実行すると、0が9個入った表が表示されます。表の周りの数字は、縦・横・斜めの列の合計数です。
  • 点滅するカーソルを上下左右の矢印キーで移動して、1~9の数字キーを押して数字を入れてください。周囲の合計数もそれに応じて変化します。なお1~9の数字は1個ずつしか使えないので、既に表にある数字を押しても入力できません。0を入力するとそのセルの数字をクリアできます。
  • 1~9の数字を1個ずつ使って、縦・横・斜めの合計数が全て同じになるように、魔方陣を作ってください。完成するとプログラムが終了します。

数字を入力すると合計数がパカパカ変わる様子が面白いです。
でも答えを見ないで魔方陣を作るのはかなり難しい…

プログラム

方陣の表示、合計数の計算、完成チェックのプログラムは、共通テストの問題の参考になると思います。
1kバイトぎりぎりです。

10 '*MAGIC CIRCLE
20 CLV:VIDEO 3
30 GSB260
40 E=0
50 FOR N=1 TO 9
60 IF [10+N]=0 E=1
70 NEXT
80 C=[20]
90 FOR N=21 TO 27
100 IF C!=[N] E=1
110 NEXT
120 IF E=0 LC 0,9:?"COMPLETE!":END
130 LC U*3+2,V*2+2,1
140 K=INKEY():IF !K CONT
150 U=U-(K=28)*(U>0)+(K=29)*(U<2)
160 V=V-(K=30)*(V>0)+(K=31)*(V<2)
170 IF K<48 OR K>57 GOTO 130
180 N=K-48
190 IF [10+N]>0 GOTO 30
200 LC U*3+2,V*2+2:?N
210 M=[U+V*3]
220 [10+M]=0
230 [U+V*3]=N
240 IF N>0 [10+N]=1
250 GOTO 30
260 CLS:?
270 FOR I=0 TO 2
280 ?"+--+--+--+"
290 ?"|  |  |  |"
300 NEXT
310 ?"+--+--+--+"
320 FOR Y=0 TO 2
330 FOR X=0 TO 2
340 LC X*3+2,Y*2+2:?[X+Y*3]
350 NEXT
360 NEXT
370 FOR Y=0 TO 2
380 [20+Y]=0
390 FOR X=0 TO 2
400 [20+Y]=[20+Y]+[X+Y*3]
410 NEXT
420 LC 10,Y*2+2:?DEC$([20+Y],2)
430 NEXT
440 FOR X=0 TO 2
450 [23+X]=0
460 FOR Y=0 TO 2
470 [23+X]=[23+X]+[X+Y*3]
480 NEXT
490 LC X*3+1,8:?DEC$([23+X],2)
500 NEXT
510 [26]=0:[27]=0
520 FOR Z=0 TO 2
530 [26]=[26]+[Z+Z*3]
540 [27]=[27]+[2-Z+Z*3]
550 NEXT
560 LC 10,8:?DEC$([26],2)
570 LC 10,0:?DEC$([27],2)
580 RTN
  • 10~250行:メインプログラム
    • 40~70行:1~9の数字を1個ずつ使っているか?チェック
    • 80~110行:合計数が全て同じになっているか?チェック
    • 120行:エラーがなければ魔方陣完成で終了
    • 130行:カーソル表示
    • 140~160行:カーソル移動
    • 170~240行:数字入力の処理
  • 260~580行:表の表示サブルーチン
    • 260~310行:枠線表示
    • 320~360行:3×3の数字を表示
    • 370~430行:横方向の合計数を計算・表示
    • 440~500行:縦方向の合計数を計算・表示
    • 510~570行:斜め方向の合計数を計算・表示

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

大学入学共通テストの科目「情報関係基礎」のプログラミング問題(第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」のプログラミングが必修になった新学習指導要領の高校生が受験するテストに変わります。
どんなプログラミング問題が出されるのか? 非常に興味深いです。