デデンネする は、「デデンネ」「エモンガ」もしくは自分で設定した文字列の中の文字を
ランダムで1文字ずつ出力し、設定した文字列が出る(または3万回出力する)まで続ける、というものである。
今回は、これを こどもパソコン IchigoJam で実装してみた。
※IchigoJamはjig.jpの登録商標です。
今回の仕様
まず、「デデンネ」「エモンガ」の中から使う文字列を選ばせる。
任意の文字列を設定する機能の実装は、今回は
- 文字数(と文字種)が同じなら、文字列の変更は本質ではない
- 文字数を増やすことを考えた場合、
全ての文字が違う5文字の文字列を使うと2千回程度、6文字の文字列を使うと数万回程度の出力が高確率で発生し、
IchigoJamで実行するには適さない - 文字数を減らすと、つまんなそう
以上からあまり意味がなさそうなわりに、めんどくさそう
という理由から、見送ることにした。
文字列を選んだら、その文字列の中の文字をランダムで出力していく。
このとき、判定用にどの文字を出力したかの情報を記録していく。
各文字を出力する確率は等確率とするが、「デデンネ」には「デ」が2個含まれるので、
その分「デ」を出力する確率は「ン」「ネ」を出力する確率の2倍とする。
また、IchigoJamでは濁点は別の文字として出力されるため、本体と濁点が別の行にならないように制御する。
指定した文字列が出力されたら、何回出力したかを出力して終了する。
実装
以下に今回実装したプログラムを示す。
10 ' デデンネ スル
20 ?"デデンネ スル(1)? エモンガ スル(2)?":S=#FF:P=0:C=0
30 X=INKEY()
40 IF X=#31 GOTO 80
50 IF X=#32 GOTO 140
60 GOTO 30
70 IF S=#0B:?CHR$(10);"デデンネ シタ カイスウ ハ ";C;" デス":END
80 R=RND(4):S=(S<<2)&#FF:C=C+1:P=(P+1)F
90 IF R=2:?"ン";:S=S|2:GOTO 70
100 IF R=3:?"ネ";:S=S|3:GOTO 70
110 IF P=0:?" ";:P=1
120 ?"デ";:P=P+1:GOTO 70
130 IF S=#1B:?CHR$(10);"エモンガ シタ カイスウ ハ ";C;" デス":END
140 R=RND(4):S=(S<<2)&#FF:C=C+1:P=(P+1)F
150 IF R=0:?"エ";:GOTO 130
160 IF R=1:?"モ";:S=S|1:GOTO 130
170 IF R=2:?"ン";:S=S|2:GOTO 130
180 IF P=0:?" ";:P=1
190 ?"ガ";:S=S|3:P=P+1:GOTO 130
10行目は、FILES
用のタイトルである。
20行目は、プロンプトを出力し、ついでに出力と判定用の情報を初期化する。
30行目~60行目は、選択を入力させる。
70行目~120行目は、「デデンネ」に関して処理を行う。
130行目~190行目は、「エモンガ」に関して処理を行う。
70行目・130行目は、直近に出力した文字の情報を確認し、指定の文字列を出力していたら出力回数を出力して終了する。
80行目・140行目は、乱数によって次に出力する文字を選ぶ。
また、直近に出力した文字の情報の更新の一部を行うとともに、出力回数・出力位置の情報を更新する。
90行目~120行目・150行目~190行目は、乱数に基づき文字を出力し、直近に出力した文字の情報を更新する。
特に、110行目・180行目は、文字の本体と濁点が別の行にならないようにする制御を行う。
実行結果例
結論
IchigoJamで、指定の文字列を出力するまでその中の文字をランダムで出力する「デデンネする」を実装することができた。
なお、この記事とは直接関係ないが、本家「デデンネする」には
- 判定処理の効率が悪い
- 一部の文字を入力すると誤動作する
- 出力結果をシェア出来ない (出力回数しかシェアできない)
という欠点がある。
これらの欠点を克服した「ごちうさ見る」を、以前作成・公開した。