クリスマスに向けて1記事ずつ公開される「IchigoJam Advent Calendar 2019
13日目「IchigoJamでズンドコキヨシ」、印象的な「キ・ヨ・シ」の大きな文字を遊んでみます。


4倍角にしたイチゴが画面内をランダムに表示!

IchigoJam ver 1.4 の新命令。DRAWを使ってこの大きな文字を1行で描くプログラム

5 C=ASC("A"):X=15:Y=12 10 FORI=0TO7:FORJ=0TO7:DRAWX*2+J,Y*2+I,PEEK(C*8+I)>>(7-J)&1:NEXT:NEXT


Cで表示したい文字、XとYで座標を指定

もう1ループ追加すれば、文字列を表示もOK!

5 S="15Jam":X=15:Y=12 10 FORK=0TOLEN(S)-1:C=ASC(S+K):FORI=0TO7:FORJ=0TO7:DRAWX*2+J+K*8,Y*2+I,PEEK(C*8+I)>>(7-J)&1:NEXT:NEXT:NEXT

まだ ver 1.4 にしていない方でも大丈夫!

5 C=ASC("A"):X=2:Y=12 10 FORI=0TO15:N=#80:FORJ=0TO3:N=N+PEEK(C*8+I/4*2+J/2)>>(7-I%4*2-J%2)&1<<J:NEXT:LCX+I%4,Y+I/4:?CHR$(N);:NEXT

DRAWの中身は#80〜#8Fのセミグラフィクスを使っているだけなので、座標を指定して表示すればOK!(文字列も!)

5 S="15Jam":X=15:Y=12 10 FORK=0TOLEN(S)-1:C=ASC(S+K):FORI=0TO15:N=#80:FORJ=0TO3:N=N+PEEK(C*8+I/4*2+J/2)>>(7-I%4*2-J%2)&1<<J:NEXT:LCX+K*4+I%4,Y+I/4:?CHR$(N);:NEXT:NEXT


テンポが大事なこちら「IchigoJamでズンドコキヨシ」のキヨシ表示。
LODAINGと表示しながら、先に計算しておくテクニックが使われています。

配列のメモリ#800を1文字につき16byte使えば、保存しておけますね。まずは画像メモリ#900への直接表示バージョン

5 C=ASC("A"):X=2:Y=12 10 FORI=0TO15:N=#80:FORJ=0TO3:N=N+PEEK(C*8+I/4*2+J/2)>>(7-I%4*2-J%2)&1<<J:NEXT:POKE#900+X+I%4+(Y+I/4)*32,N:NEXT

LCX,Y:?CHR$(C); は、POKEX+Y*32,C とほぼ同じ動きとなります(カーソルの移動が伴わない点が違う。これを応用して、まずは変数用のメモリの配列部分#800に書き込んでおいて、あとで#900へ4文字ずつコピーすることで高速化!

5 C=ASC("A"):X=2:Y=12 10 FORI=0TO15:N=#80:FORJ=0TO3:N=N+PEEK(C*8+I/4*2+J/2)>>(7-I%4*2-J%2)&1<<J:NEXT:POKE#800+I,N:NEXT 20 FORI=0TO3:COPY#900+X+(Y+I)*32,#800+I*4,4:NEXT

速くなりました!

こちら冒頭紹介した、ランダムにイチゴを表示するプログラム

5 C=255 6 ?"WAIT A MOMENT" 10 FORI=0TO15:N=#80:FORJ=0TO3:N=N+PEEK(C*8+I/4*2+J/2)>>(7-I%4*2-J%2)&1<<J:NEXT:POKE#800+I,N:NEXT 15 X=RND(32-4):Y=RND(24-4) 20 FORI=0TO3:COPY#900+X+(Y+I)*32,#800+I*4,4:NEXT 30 GOTO 15

計算力と記憶力が抜群なコンピューター。
とはいえ、無限に速いわけでも、無限に記憶できるわけでもありません。
どう計算され、どう記憶されるかイメージしながら作ってみると、普段接するプログラムの中身が想像できるようになりますよ!

* ズンドコキヨシ問題(ズンドコキヨシ、ズンドコチェック、キヨシチェック、とも)
「ランダムに出るズンとドコ。ズンが4回続いてドコが来たら、キヨシと表示して終わるプログラムを作りなさい」という問題。
「きよしのズンドコ節」にて「ズン・ズンズンズンドコ」と来たら「キヨシ」と観客が声を掛ける様から。

IchigoJamで遊んでみよう!

10 Z=0 20 N=RND(2) 30 IF N=0 ?"ズン ";:Z=Z+1:GOTO20 40 ?"ドコ ";:IF Z<4 Z=0:GOTO20 50 ?"キヨシ"

ズンの数を数えて、4回目ならループせずキヨシ!
RUNするたびに変わる長さ、数えてみよう

15 C=0 21 C=C+1 60 ?C

平均の長さがどのくらいになるか計算してみて、検証してみるのもおもしろそう。
ズンとドコは確率1/2、じゃんけんに4回連続勝つ確率と一緒です。

ちょっといたずらして、絶対終わらないように操作してみよう。

25 IF Z=4 N=0


4回ズンが続いたら強制的にズンにしてしまうことで、エンドレス。
さすがにイカサマがバレてしまうので、下のようにして1/10の確率で1にしてあげよう

25 IF Z=4 IF RND(10)=0 N=1 ELSE N=0

ズンとドコのでる確率を偏らせてみたり、WAITでリズムを取ったり、音をMIDIで豪華にしたり、算数的にも音楽的にも楽しめる。 世界的に有名な FizzBuzz とは違った味わいがありますね。

氷川きよしさんによる「きよしのズンドコ節 (2020)」の元をたどると、原曲は1937年と歴史が長い。
1978年生まれ的には、ドリフのズンドコ節が一番聞き馴染みある。フランス語バージョンもあったとは!
ズンドコ節 - Wikipedia

links
- IchigoJam Advent Calendar 2019 - Qiita

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / RSS