「Hello World あたたたた」とは
Hello World あたたたた は、以下の記事で定義されたプログラミングの題材である。
Hello World あたたたた 1日目 概要編 #HelloWorld - Qiita
以下の要件が定義されている。
・「あ」か「た」をランダムに出力する
・「あたたたた」が出たら「お前はもう死んでいる」を出力して終了する
さらに、以下の処理フローが指定されている。
変数 hako に空文字をセット 変数 running に true をセット running が true なら繰り返す 0か1をランダムに決める もし0なら 変数 char に「あ」をセット その他なら 変数 char に「た」をセット 画面に char を出力 char を hako に追加 もし 最後の 5 文字が「あたたたた」なら "お前はもう死んでいる" を出力 running に false をセット
表計算での実装
今回は、以下の実装をし、LibreOffice Calc 7.5.7.1 で動作を確認した。
(LibreOffice のアップデートを怠っているのがバレる……)
見出し
1行目に、各列に入る内容を表す見出しを置く。
具体的には、各セルに以下の文字列を置く。
| セル | 内容 |
|---|---|
| A1 | running |
| B1 | ランダム |
| C1 | char |
| D1 | hako |
| E1 | 最後チェック |
| F1 | 出力 |
変数の初期値
A2 セルに、running の初期値である TRUE を置く。
D2 セルは、hako の初期値なので空にしておく。
計算
3行目の以下のセルに、以下の計算式を置く。
これらの計算式の解説は後述する。
| セル | 計算式 |
|---|---|
| A3 | =AND(A2,IF(E3="",FALSE(),NOT(E3))) |
| B3 | =IF(A2,FLOOR(RAND()*2),"") |
| C3 | =IF(A2,IF(B3=0,"あ","た"),"") |
| D3 | =IF(A2,CONCAT(D2,C3),"") |
| E3 | =IF(A2,RIGHT(D3,5)="あたたたた","") |
| F3 | =IF(A2,IF(E3,CONCAT(C3,CHAR(10),"お前はもう死んでいる"),C3),"") |
これらの計算式 (A3:F3) を、十分な行数下にオートフィルする。
今回は、200行目 (A200:F200) までオートフィルした。
表示
以下の手順で、表示領域を用意する。
- セルを結合することにより、十分な大きさの領域を用意する
- 結合したセルを右クリックし、「セルの書式設定(F)...」をクリックする
- 「配置」タブを選択し、「テキストを自動的に折り返す(W)」にチェックを入れる
用意した表示領域のセルに、計算に用いる最初の行とそれをオートフィルした行の「出力」の内容を全て結合する計算式を置く。
すなわち、今回は計算式 =CONCAT(F3:F200) を置く。
計算の解説
計算中の running・char・hako は、その行の計算を終えたあとの各変数の値を表す。
ランダム・最後チェックは、その行の計算を行うときに用いる中間状態を表す。
出力は、その行の計算を行った結果出力される内容を表す。
running 以外の5列は、前の行の running が FALSE のときは、繰り返しをしないことを表すために IF 関数で空文字列となるようにした。
以下では、これらの5列についてはこの IF 関数で前の行の running (A2) が TRUE のとき返される値について解説する。
running (A列)
=AND(A2,IF(E3="",FALSE(),NOT(E3)))
前の行の running (A2) が FALSE のときは、FALSE のままにする。
そうでない (TRUE の) ときは、今回の最後チェック (E3) が TRUE なら FALSE にし、そうでなければ TRUE にする。
ただし、IF を用いずに単に =AND(A2,NOT(E3)) とすると、繰り返しを止めたことを表すために E3 の値を空文字列にした際 #VALUE! エラーになってしまったため、IF によって空文字列のときも論理値を返すようにした。
ランダム (B列)
=IF(A2,FLOOR(RAND()*2),"")
以下の手順で、0 または 1 をランダムに決める。
-
RAND()関数で、0 以上 1 未満の乱数を生成する - それを 2 倍する
- それを
FLOOR()関数で切り捨てて整数にする
char (C列)
=IF(A2,IF(B3=0,"あ","た"),"")
IF 関数を用いて、決めた値 (B3) が 0 なら「あ」、そうでなければ「た」にする。
hako (D列)
=IF(A2,CONCAT(D2,C3),"")
前の行の hako の内容 (D2) に、今回の char の内容 (C3) を追加する。
最後チェック (E列)
=IF(A2,RIGHT(D3,5)="あたたたた","")
RIGHT() 関数で今回の更新後の hako の内容 (D3) の最後の 5 文字を取得し、それが「あたたたた」と等しいかを判定する。
出力 (F列)
=IF(A2,IF(E3,CONCAT(C3,CHAR(10),"お前はもう死んでいる"),C3),"")
hako の内容の最後の 5 文字が「あたたたた」である (E3) なら、今回の char の値 (C3) に加え、改行と「お前はもう死んでいる」を出力する。
そうでなければ、今回の char の値のみを出力する。
まとめ
表計算で「Hello World あたたたた」の処理を実現した。
性質上「あたたたた」が出るまで無限に試行を続けることはできなそうだが、十分多い回数まで試行を続けることで、処理が完了しない確率を小さくしている。
