
なでしこさんで「大石泉すき」
頭が悪いので、ボーッと生きていてすぐ週末になってしまい、コストの高い記事が書けない……
IchigoJam のプログラムを書くのも、そろそろネタを考えるのが難しくなってきたかも……
そうだ、なでしこのプログラムを書こう。
なでしこなら、IchigoJam と違って、Webブラウザ上でプログラムをまともな速度で実行できる環境が公式で用意されている。
※IchigoJamはjig.jpの登録商標です。
今回やること
「大」「石」「泉」の3文字からランダムに1文字選んで表示する。
これを「大石泉」の並びになるまで繰り返す。
「大石泉」の並びが出たら、「すき」を表示して終了する。
プログラム
ターゲットは「大石泉」。
ターゲット文字数はターゲットの文字数。
ラスト部分は改行をターゲット文字数でリフレイン。
カウントは0。
ラスト部分がターゲットと等しく無い間、繰り返す
文字はターゲットの(ターゲット文字数の乱数+1)から1文字抜き出す。
カウントを1だけ増やす。
文字のラベル作成。
ラスト部分に文字を追加。
ラスト部分はそれの(ターゲット文字数)文字右部分。
0.2秒待つ。
ここまで。
「すき」のラベル作成。
改行作成。
改行作成。
「{カウント}文字」のラベル作成。
ポイント
改行せずに1文字ずつ表示する
「表示」命令を使うと、文字列を出力した後に自動で改行が入ってしまう。
「継続表示」なら自動で改行が入らないが、「表示」命令を実行しないと画面に反映されないので、今回のように1文字ずつ表示したい場合には意味がない。
そこで、今回は「ラベル作成」命令を用いることで、画面に1文字ずつ改行せずに表示することを実現した。
ただし、これは指定の文字列を格納したHTML要素を作成する命令なので、ブラウザ版専用であり、Node.js 版では使えない。
表示する文字を選ぶ
「乱数」命令を用いると、0以上指定した数値未満の整数の乱数を得ることができる。
この乱数を用いて、「文字抜出」命令で目標の文字列からランダムな1文字を取得する。
「文字抜出」命令で指定する位置は最初の文字を1文字目とする表現なので、「乱数」命令で得られる値に1を足すことで、1以上指定した数字以下の乱数を得る。
目標の文字列ができたかを判定する
出力した文字列を記録しておき、その中に目標の文字列が現れたら終了する、という処理を行う。
今回は、文字列の変更は文字を追加するだけで途中の変更は行わない。
なおかつ、目標の文字列が現れたらすぐに終了する。
よって、目標の文字列でない部分に後から目標の文字列が現れることは無いので、出力した文字列のうち最後の部分だけが目標の文字列になったかを判定すればよい。
そのため、最後の部分を目標の文字列と同じ長さだけ保存し、あとは捨ててよい。
そこで、「文字右部分」命令を用いて、最後の必要な長さの部分だけを取り出す。
ただし、この命令はもとの文字列の長さより1だけ長く取り出そうとすると、最後の1文字だけを返す仕様になっており、最後の部分を記録する変数を空文字列で初期化してしまうとうまく判定ができない。
そのため、「リフレイン」命令を用いて、目標の文字列に現れない文字のみからなる十分な長さの文字列で初期化するようにした。
おわりに
大石泉すき。