Photo by
kamei_kana1223
【IchigoJam】年が明けたんだ……2025年か……
年が明けたんだなあ……
頭が悪くて、いいネタが思いつかないなあ……
とりあえず、IchigoJam で2025を分解してみるか……
※IchigoJamはjig.jpの登録商標です。
数の分解
今回は、2以上の整数を2以上の整数の積で表すことを、「分解する」という。
整数1個だけで表す場合も、「積」にはならないが分解したとみなす。
実装
配列をスタックのように用い、再帰のような処理で「2025」の分解を行う。
分解した前の数以上で、さらに割った商が割る数以上になる割る数の候補のみを試すことで、重複を回避している。
10 ' 2025 ヲ ブンカイ
20 LET[0],2,2025
30 P=1
40 FOR I=1 TO P
50 IF I>1 PRINT "*";
60 PRINT [I];
70 NEXT
80 PRINT ""
90 I=[P-1]:GOTO 150
100 IF [P]%I<>0 GOTO 140
110 [P+1]=[P]/I:[P]=I:P=P+1
120 GOSUB 40
130 P=P-1:I=[P]:[P]=[P]*[P+1]
140 I=I+1
150 IF I*I<=[P] GOTO 100
160 IF P>1 RETURN
このプログラムは、CC0 1.0 でライセンスする。
今回は、プログラムが1画面に収まるようにした。
すなわち、1行は32文字以内で、かつ24行以内に収まるようにした。
これを実行してみると……
なんと、結果が画面からはみ出してしまった。
改良
最後の分解結果の出力の後ではなく、かつカーソルが画面の左半分にある場合は、改行ではなくスペースを出力してカーソルを同じ行の右側に動かすようにした。
これにより、空いていた画面の右半分を有効活用して分解結果を出力できるようになる。
10 ' 2025 ヲ ブンカイ 2
20 LET[0],2,2025:P=1
30 IF P>1 GOSUB 160
40 FOR I=1 TO P
50 IF I>1 PRINT "*";
60 PRINT [I];:NEXT
70 I=[P-1]:GOTO 130
80 IF [P]%I<>0 GOTO 120
90 [P+1]=[P]/I:[P]=I:P=P+1
100 GOSUB 30
110 P=P-1:I=[P]:[P]=[P]*[P+1]
120 I=I+1
130 IF I*I<=[P] GOTO 80
140 IF P>1 RETURN
150 P=0:GOTO 210
160 IF VER()<13208 GOTO 210
170 H=POS(3)/2
180 IF POS(1)>=H GOTO 210
190 IF POS(1)>=H GOTO 220
200 PRINT " ";:GOTO 190
210 PRINT CHR$(10);
220 IF P>0 RETURN
このプログラムは、CC0 1.0 でライセンスする。
1行に2個の分解結果を配置する処理を追加しても、1画面に収まった。
実行結果も、無事1画面に収まった。
まとめ
2025年なので、IchigoJam で「2025」を分解し、分解した結果を一覧で出力してみた。
1記事につき1,000文字以上書く目標でやっているところ、プログラムを貼ると楽に文字数が稼げてよい。
コメント