1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Hello World あたたたた 表計算 (LibreOffice Calc) 編

1
Posted at

「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) までオートフィルした。

表示

以下の手順で、表示領域を用意する。

  1. セルを結合することにより、十分な大きさの領域を用意する
  2. 結合したセルを右クリックし、「セルの書式設定(F)...」をクリックする
  3. 「配置」タブを選択し、「テキストを自動的に折り返す(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 をランダムに決める。

  1. RAND() 関数で、0 以上 1 未満の乱数を生成する
  2. それを 2 倍する
  3. それを 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 あたたたた」の処理を実現した。
性質上「あたたたた」が出るまで無限に試行を続けることはできなそうだが、十分多い回数まで試行を続けることで、処理が完了しない確率を小さくしている。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?