★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で上へスクロールしています。