SHIROのIchigoJam日記

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

「点対称の日」探し

IchigoJam Advent Calendar 2021にエントリーしています。

2021年12月2日は「点対称の日」

2021年12月2日(数字で「20211202」)が「点対称の日」だとして、M5Stackの画面で表示していた方がいました。
「なるほど!」と思って、私もIchigoJamでプログラムを作って表示してみました。中心に点を打つと、確かに点対称!(^_^)

ちなみに次に点対称になるのは恐らく2050年5月2日。
その次は2060年9月2日と思われます。

「20211202」表示プログラム

100 '*20211202
110 VIDEO 5
120 POKE #700,`00111110
130 POKE #701,`00100010
140 POKE #702,`00100010
150 POKE #703,`00100010
160 POKE #704,`00100010
170 POKE #705,`00100010
180 POKE #706,`00111110
190 POKE #707,0
200 POKE #708,`00001000
210 POKE #709,`00001000
220 POKE #70A,`00001000
230 POKE #70B,`00001000
240 POKE #70C,`00001000
250 POKE #70D,`00001000
260 POKE #70E,`00001000
270 POKE #70F,0
280 POKE #710,`00111110
290 POKE #711,`00000010
300 POKE #712,`00000010
310 POKE #713,`00111110
320 POKE #714,`00100000
330 POKE #715,`00100000
340 POKE #716,`00111110
350 POKE #717,0
360 LC 0,2
370 ?CHR$(226,224,226,225,225,226,224,226)
380 CONT

「点対称の日」探し

その後、「じゃあ点対称になる日っていくつあるんだろう?」と気になったので、探すプログラムを作ってみました。

1月1日~12月31日まで日付をループして、対称形の年を追加して、全体が点対称になる年月日を探します。
見つかった日付は下から上へスクロールして表示するので、ちょっとスクリーンセーバー風です。

2月29日も表示されますが(対称形の年を付けると「62200229」)、6220年は4で割り切れるのでうるう年で、2月29日は存在します。
(その時代までグレゴリオ暦を使っているかはわかりませんが…)

プログラムの最後に、見つかった点対称の日の数を表示して終了します。
どうやら180日あるようです。全部で366日の内の180日ですから約半分。
それでも私たちが生きている間に巡り会える日は多くないようです。
2021年12月2日は結構レアでした。

「点対称の日」探しプログラム

1 '*POINT SYMMETRY DAYS
2 CLV:VIDEO5
3 POKE#700,#3E,#22,#22,#22,#22,#22,#3E,0
4 POKE#708,8,8,8,8,8,8,8,0
5 POKE#710,#3E,2,2,#3E,#20,#20,#3E,0
6 POKE#718,#3E,2,2,#3E,2,2,#3E,0
7 POKE#720,#22,#22,#22,#3E,2,2,2,0
8 POKE#728,#3E,#20,#20,#3E,2,2,#3E,0
9 POKE#730,#3E,#20,#20,#3E,#22,#22,#3E,0
10 POKE#738,#3E,#22,#22,#22,2,2,2,0
11 POKE#740,#3E,#22,#22,#3E,#22,#22,#3E,0
12 POKE#748,#3E,#22,#22,#3E,2,2,#3E,0
13 LET[21],31,29,31,30,31,30,31,31,30,31,30,31
14 FORM=1TO12
15 FORD=1TO[M+20]
16 GSB@CHK
17 NEXT
18 NEXT
19 CLS:?Z:END
20 @CHK
21 [7]=D%10:[0]=[7]
22 [6]=D/10:[1]=[6]
23 [5]=M%10:[2]=[5]
24 [4]=M/10:[3]=[4]
25 K=0
26 FORI=0TO3
27 A=[I]:B=[7-I]
28 IFB=6A=9:[I]=A
29 IFB=9A=6:[I]=A
30 GSB@DIGIT
31 NEXT
32 IFK=4GSB@PRT
33 RTN
34 @DIGIT
35 K=K+(A=0&&B=0)
36 K=K+(A=1&&B=1)
37 K=K+(A=2&&B=2)
38 K=K+(A=5&&B=5)
39 K=K+(A=6&&B=9)
40 K=K+(A=8&&B=8)
41 K=K+(A=9&&B=6)
42 RTN
43 @PRT
44 CLS
45 FORC=0TO7
46 POKE#928+C,[C]+224
47 NEXT
48 FORJ=1TO6
49 WAIT20:SCROLL30
50 NEXT
51 Z=Z+1:RTN

★IchigoJam web版はこちら。
※途中で20秒くらい真っ暗な時間があるので注意。

結構1kバイトぎりぎりになってしまいました。
3~12行目は数字0~9のフォントデータ、13行目は1~12月の日数データです。
14~18行の2重ループで1~12月/1日~月末までループして、それぞれの日付で20行目からのサブルーチンを呼んで、点対称かどうかチェックします。
チェックサブルーチンでは、年4桁・月日4桁から1文字ずつ取り出して、それらが点対称になる組み合わせかどうかをチェック(35~41行目)。
4桁全てが点対称なら、43行目~の表示サブルーチンを呼んでスクロール表示します。画面の最下行で8文字を表示する時、PRINTで表示するとその場でスクロールしてしまうので、POKEでVRAMへ書きこんで表示。その後SCROLLで上へスクロールしています。